我想将字符串转换为C中的二进制表示以适合MIPS汇编(我在C中编写MIPS汇编程序)。
对于字符串“The sum”,MIPS按以下方式执行(我提取了MIPS的.data部分):
00100000011001010110100001010100
00100000011011010111010101110011
01101110001000000110011001101111
01100101011000100110110101110101
01101001001000000111001101110010
01110010011000010010000001101110
00100000011110010110000101110010
字母T
是二进制的1010100。我可以在第一行的末尾看到1010100,但其余部分不应该为零(因此,由于MIPS处理的是32位,因此符号扩展为32位)?
h
是1101000,第二行甚至没有1101000.为什么会这样?
有人可以向我解释一下吗?
谢谢,
答案 0 :(得分:0)
$ echo "00100000011001010110100001010100
00100000011011010111010101110011
01101110001000000110011001101111
01100101011000100110110101110101
01101001001000000111001101110010
01110010011000010010000001101110
00100000011110010110000101110010
"| perl -pe '$_=pack"B*",$_'
ehT musn foebmui srra n yar
不知何故,该字符串的字符是奇怪的顺序。您是否在int
中对4个字符进行分组?
答案 1 :(得分:0)
ASCII数据不是“符号扩展”。使用MIPS Mars模拟器,我输入:
.data
.asciiz "The sum"
.text
main:
这会生成数据段:
Address: Value:
0x10010000 0x20656854
0x10010004 0x006d7573
BUT WAIT,不仅仅是54:68:65:20:73:75:6d
的“和”的十六进制值?是的,注意它们实际存储的顺序。或者更确切地说,看看Endianness。最低值具有最高地址(或者,最高有效字节是第一个地址)。 ASCII字符串使用Big Endian格式存储。
因此,当您存储字符串时,计算十六进制值,将字符串拆分为单词,然后以相反的顺序存储每个字符。然后转换为二进制。