【问题标题】:Simulate CPU register?模拟CPU寄存器?
【发布时间】:2013-03-09 19:31:17
【问题描述】:

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

效果很好,但现在如果我想打印和编辑alah ax 的低和高部分(8 位)我该怎么办?! 我试过了,但它不起作用!

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

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

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

有什么帮助吗?

【问题讨论】:

  • 什么不起作用?任何错误消息?
  • 真的有效吗?
  • 没有错误和编译,但是cout &lt;&lt; res.al() &lt;&lt; endl;什么都不打印!
  • 哦,那是很久以前的事了。在 uC 域中搜索代码,您会找到现成的解决方案。如果您想自己做,请了解联合和 : as - 变量定义中的位数限制,例如无符号字符 B1:1;表示 B1 只有一位。使用结构、联合和 : 您将能够访问 16 位寄存器的任何位、半字节、字节。希望对您有所帮助。

标签: c++ cpu-registers


【解决方案1】:

也许问题是您试图将unsigned char 打印为unsigned char,因此cout &lt;&lt; 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;
}

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

【讨论】:

  • 您的ax() 方法应该使用两个字节明确构造一个16 位整数,而不是依赖于强制转换。强制转换将按照执行程序的平台的字节序对字节进行排序,这可能与模拟 CPU 的字节序不同。
  • -1:抱歉,这不是在面向硬件的域中定义寄存器访问结构的方式。 (请参阅 SO-answer 我的帖子中的链接)我想,二传手会多么丑陋。其次,如果在 C++ 中进行强制转换,为什么不使用 C++ 风格的强制转换?转换对 int 的引用?那应该可以吗?
  • 好吧,我很难将它转换为参考,因为那会完全破坏它的含义。我想我可以将值存储在一个临时变量中。我并没有建议“上面的代码是完美的”——只是它解决了原始帖子所涉及的特定问题。我绝对确定这不是我编写此类代码的方式!
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2010-12-22
    • 2016-01-19
    • 2012-02-14
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多