Я хочу смоделировать работу над регистром, объявляю класс Register следующим
class Register{
uint8_t reg_ax[2];
Register(){
reg_ax[0] = reg_ax[1] = 0;
}
uint16_t &ax(){ return (uint16_t &)reg_ax[0]; }
};
Теперь я могу распечатать и редактировать значение ax
(что составляет 16 бит), как это:
Register regs;
cout << regs.ax() << endl;
regs.ax() = 5;
cout << regs.ax() << endl;
Это работает хорошо, но теперь, если я хочу напечатать и отредактировать al
& ah
нижняя и верхняя части (которые составляют 8 бит) ax
что я должен делать ?!
Я попробовал это, но это не работает!
uint8_t &al(){ return reg_ax[1]; }
uint8_t &ah(){ return reg_ax[0]; }
Теперь это не будет отображаться:
cout << regs.al() << endl;
Любая помощь ?
Возможно, проблема в том, что вы пытаетесь напечатать unsigned char
как unsigned char
и, таким образом, cout << regs.ah();
печатает символ ноль или что-то такое?
Это работает для меня:
#include <iostream>
#include <cstdint>
using namespace std;
class Register{
uint8_t reg_ax[2];
public:
Register(){
reg_ax[0] = reg_ax[1] = 0;
}
uint16_t &ax(){ return (uint16_t &)reg_ax[0]; }
uint8_t &al(){ return reg_ax[1]; }
uint8_t &ah(){ return reg_ax[0]; }
};int main()
{
Register regs;
regs.ax() = 500;
cout << regs.ax() << endl;
cout << (int)regs.ah() << endl;
cout << (int)regs.al() << endl;
return 0;
}
Я публикую полный пример, как вы ДОЛЖНЫ сделать. После этого вы сможете увидеть, что у вас есть, и все, что я должен был угадать, является правильным по сравнению с вашим кодом.
Использование массивов для реализации младшего / старшего байта или 16-битного регистра не лучшая идея.
Как я написал в комментарии, узнал о объединении: в контексте определения переменных, выравнивание данных в памяти.
Это должно дать вам представление о том, как реализовать удобную структуру / класс доступа к реестру:
Использование полубайтов (4-битных переменных) в Windows C / C ++
и не забудьте использовать атрибут __ ((__packed)) того, что похоже для вашей платформы.
Отредактировано:
Я могу потерять очки за это, но это может быть полезно для вас :-). После того, как я реализовал инструмент для доступа к регистру (отображаемому в память) любым способом, поразрядно, пощипывая и т. Д. Он может дать вам представление об использовании std::bitset
, Код здесь: https://code.google.com/p/jeeamtee/wiki/Main