模拟CPU寄存器



我想模拟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

最新更新