Little-endian MIPS不一致

时间:2016-11-18 01:23:09

标签: mips endianness qtspim

据我所知,在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上测试。

1 个答案:

答案 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