我想模拟register上的工作,我声明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位寄存器不是最好的主意。正如我在评论中所写的,学习联合:在变量定义的上下文中,内存中的数据对齐。
这应该给你一个实现方便的寄存器访问结构/类的想法:在windows C/c++中使用nibbles(4位变量)
和不要忘记使用attribute__((__packed))的任何类似于您的平台。
编辑:我可能会因此失去积分,但它可能对你有用:-)。一旦我实现了一个工具来访问寄存器(内存映射)以任何方式,按位,按蚕食等。它可以给你一个使用std::bitset
的想法。代码在这里:https://code.google.com/p/jeeamtee/wiki/Main