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
我正在用 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