模拟CPU寄存器?

时间:2013-03-09 19:31:17

标签: c++ cpu-registers

我想模拟注册工作,我将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&amp; ah ax的低和高部分(8位)应该怎么办? 我试过这个,但它没有用!

uint8_t &al(){ return reg_ax[1]; }
uint8_t &ah(){ return reg_ax[0]; }

现在这样做不会显示任何输出:

cout << regs.al() << endl;

任何帮助?

2 个答案:

答案 0 :(得分:4)

问题可能是您尝试将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;
}

我发布了一个完整的例子,就像你应该做的那样。然后,您可以看到您拥有的包含以及我猜测的其他任何内容与您的代码相比。

答案 1 :(得分:1)

使用数组实现低/高字节或16位寄存器并不是最好的选择。 正如我在评论中写的那样,了解联合,:在变量定义的背景下,在内存中进行数据对齐。

这应该给你一个热点来实现方便的寄存器访问结构/类: Using nibbles (4 bits variables) in windows C/C++

并且不要忘记使用属性__((__ packed))的任何类似的平台。

<强>编辑: 我可能会为此失去分数,但它可能对你有用:-)。一旦我实现了以任何方式,按位,半字节等方式访问寄存器(内存映射)的工具。它可以让您了解使用std::bitset。代码在这里:https://code.google.com/p/jeeamtee/wiki/Main