2016-11-18 200 views
0

我在C++中创建了一个接受MIPS汇编指令的转换器,例如添加寄存器2和3中的“add 1,2,3”,并将结果放入寄存器1中。最后,我保存的一切成表示被认为是输出本机代码的字符串,但是我想以十六进制格式来显示它,而不是其输出在十进制C++中的MIPS转换器,如何转换为十六进制

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

字面输出是正确= 00000023100000100000 不过,我希望它输出= 00430820

任何人都可以请帮助我吗?谢谢!

+1

当你输出文本到例如你使用过[*操纵器*](http://en.cppreference.com/w/cpp/io/manip)吗? '的std :: cout'?我还建议你停止使用数字文本,因为它比数字更难和繁琐地翻译文本。 –

+0

当你的字符串包含更多的固定零时,它如何输出00430820?无论如何,完全同意以前的评论:得到一个32位整数并以正常方式以十六进制打印。 (搜索)。 –

回答

0

你混合二进制,整数

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

“0000 00ss SSST TTTT DDDD D000 0010 0000”

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

其中二进制(x)是与固定二进制represenation 5个位数

你的情况

000000 + 00010 + 00011 + 00001 + 00000100000

= 00000000010000110000100000100000,它转换到

00430820h( “0000”= 0, “0000”= 0, “0100”=如图4所示, “0011”= 3, “0000”= 0, “1000”= 8, “0010”= 2, “0000”= 0)

,如果你把在编码细看,你看到

“000000ssssstttttddddd00000100000”

由4部分组成。第一是恒定的,其定义了指令,和3所定义的要使用的寄存器

"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

+0

非常感谢你! –