据我所知,在QtSpim上运行时,MIPS程序集中的字节序不一致(没有x86_64机器,这意味着QtSpim是小端)。但是,我不确定这是一个错误还是我错了。
当一个字加载到寄存器中时,字节不会反转以反映小端字节。例如,如果内存中的一个字包含0x11223344并将其加载到寄存器中,我们得到0x11223344(我希望得到0x44332211)。
请考虑以下代码段:
.text
.globl main
main:
la $t0, letters
lw $t1, 0($t0) # Expected ($t1): 0x61626364
sll $t2, $t1, 8 # Expected ($t2): 0x62636400
sw $t2, 0($t0) # Expected (mem): 0x00646362
jr $ra
.data
letters:
.ascii "abcd"
在程序运行之前,“abcd”存储为little-endian,正如预期的那样:0x64636261(dcba)。程序完成后,我希望0x00646362(\ 0dbc)存储在内存中,但存储0x63626100(cba \ 0)。
为什么会这样?
在Fedora 24,x86_64,QtSpim版本9.1.17上测试。
答案 0 :(得分:1)
没有不一致之处。你取0x64636261
并向左移8位(即向右移位,同时从右移零)。因此0x64636261
成为0x63626100
如果您需要0x00646362
,则应该使用srl
代替sll
。
这是一个ASCII图,显示了32位字与little-endian配置中的各个字节之间的关系:
0x64636261
| | | |
| | | ----> |'a'| letters
| | | -----
| | ------> |'b'| letters+1
| | -----
| --------> |'c'| letters+2
| -----
----------> |'d'| letters+3