2016-11-18 46 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

非常感謝你! –