2

我想模拟注册的工作,我声明注册类如下

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;

有什么帮助吗?

4

2 回答 2

3

也许问题是您正在尝试将 an 打印unsigned char为 a 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;
}

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

于 2013-03-09T19:40:16.527 回答
1

使用数组来实现低/高字节或 16 位寄存器不是最好的主意。正如我在评论中所写,了解联合,:在变量定义的上下文中,内存中的数据对齐。

这应该给你一个想法来实现方便的寄存器访问结构/类: 在 Windows C/C++ 中使用半字节(4 位变量)

并且不要忘记使用与您的平台类似的属性__((__packed))。

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

于 2013-03-09T20:02:03.123 回答