C++ 中的 MIPS 转换器,如何转换为十六进制

MIPS translator in C++, how to convert to hex

我正在用 C++ 创建一个翻译器,它接受 MIPS 汇编指令,例如 "add 1, 2, 3" 将寄存器 2 和 3 添加并将结果放入寄存器 1。最后,我将所有内容保存到代表机器的字符串中应该是输出的代码,但是我想以十六进制格式显示它,而是以十进制格式输出

    assembly = "000000" + m[3].str() + m[4].str() + m[2].str() + "00000" + funct;
    cout << assembly << endl;

文字输出正确 = 00000023100000100000 但是我希望它输出为 = 00430820

谁能帮帮我?谢谢!

你混合了二进制和整数

add s,t,d 的二进制编码是

“0000 00ss ssst tttt dddd d000 0010 0000”

所以你必须连接 “000000”+二进制(2)+二进制(3)+二进制(1)+“00000100000”

其中 binary(x) 是固定 5 位的二进制表示

你的情况

000000 + 00010 + 00011 + 00001 + 00000100000

= 00000000010000110000100000100000,转换为

00430820h ("0000"=0, "0000"=0, "0100"=4, "0011" = 3, "0000"=0, "1000"=8, "0010"=2, " 0000"=0)

如果仔细查看编码,您会看到

“000000ssssstttttdddddd00000100000”

由4个部分组成。第一个是定义指令的常量,第三个是定义要使用的寄存器

   "00000000000000000000000000100000" = 0x00000020
+  "000000sssss000000000000000000000" (which is s left shifted by 21)
+  "00000000000ttttt0000000000000000" (which is t left shifted by 16)
+  "0000000000000000ddddd00000000000" (which is d left shifted by 11)

所以对这条指令进行编码的最简单方法是:

uint32_t i = 0x00000020 + (s<<21)  + (t<<16) + (d<<11);

以十六进制打印,您将得到:00430820