2011-10-22 89 views
0

我想將一個字符串轉換爲它在C中的二進制表示以適合MIPS彙編(我正在用C編寫一個MIPS彙編器)。MIPS彙編 - 字符串到二進制表示

字符串 「總和」,MIPS做它通過以下方式(我提取MIPS的.data段):

00100000011001010110100001010100 
00100000011011010111010101110011 
01101110001000000110011001101111 
01100101011000100110110101110101 
01101001001000000111001101110010 
01110010011000010010000001101110 
00100000011110010110000101110010 

T是二進制1010100。我可以在第一行結尾看到1010100,但其餘的不應該是零(因爲MIPS處理32位後它的符號擴展爲32位)?

h是1101000,第二行甚至沒有1101000.爲什麼?

有人可以向我解釋嗎?

謝謝

回答

0

ASCII數據不是「符號擴展」。採用MIPS火星模擬器,我輸入:

.data 
.asciiz "The sum" 

.text 
main: 

這產生的數據段:

Address: Value: 
0x10010000 0x20656854 
0x10010004 0x006d7573 

別急,不是「總和」只是54:68:65:20:73:75:6d十六進制值?是的,請注意它們實際存儲的順序。或者,請看Endianness。最低值具有最高地址(或者,最高有效字節是第一個地址)。 ASCII字符串使用Big Endian格式存儲。

因此,當您存儲字符串時,請計算十六進制值,將字符串拆分爲單詞,然後按相反順序存儲每個字符。然後轉換爲二進制。

+0

請問空間的哪個指令是否重要? – darksky

+0

在我回答的其他問題中,空格是十六進制中的0x20。 – Ivan

+0

是的,我知道這一點。但是,總和之間的距離是與「the」還是「sum」?或者沒關係? – darksky

0
$ echo "00100000011001010110100001010100 
00100000011011010111010101110011 
01101110001000000110011001101111 
01100101011000100110110101110101 
01101001001000000111001101110010 
01110010011000010010000001101110 
00100000011110010110000101110010 
"| perl -pe '$_=pack"B*",$_' 
ehT musn foebmui srra n yar 

不知何故,該字符串的字符是一個奇怪的順序。你是否將int中的4個字符分組?

+1

也許OP忘記了mips往往是大的endian? – user786653

+0

我只是想知道OP如何提取.data節,以及爲什麼他用二進制提取它,而不是ASCII或十六進制。 – ninjalj

+0

我正在提取ASCII碼的機器碼 – darksky