Имитировать регистр процессора?

Я хочу смоделировать работу над регистром, объявляю класс 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;

Любая помощь ?

2

Решение

Возможно, проблема в том, что вы пытаетесь напечатать 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;
}

Я публикую полный пример, как вы ДОЛЖНЫ сделать. После этого вы сможете увидеть, что у вас есть, и все, что я должен был угадать, является правильным по сравнению с вашим кодом.

4

Другие решения

Использование массивов для реализации младшего / старшего байта или 16-битного регистра не лучшая идея.
Как я написал в комментарии, узнал о объединении: в контексте определения переменных, выравнивание данных в памяти.

Это должно дать вам представление о том, как реализовать удобную структуру / класс доступа к реестру:
Использование полубайтов (4-битных переменных) в Windows C / C ++

и не забудьте использовать атрибут __ ((__packed)) того, что похоже для вашей платформы.

Отредактировано:
Я могу потерять очки за это, но это может быть полезно для вас :-). После того, как я реализовал инструмент для доступа к регистру (отображаемому в память) любым способом, поразрядно, пощипывая и т. Д. Он может дать вам представление об использовании std::bitset, Код здесь: https://code.google.com/p/jeeamtee/wiki/Main

1