【问题标题】:Little-endian MIPS inconsistencyLittle-endian MIPS 不一致
【发布时间】:2016-11-18 01:23:09
【问题描述】:

据我了解,在 QtSpim(没有 x86_64 机器,这意味着 QtSpim 是小端)上运行时,MIPS 程序集的字节序不一致。但是,我不确定这是一个错误还是我错了。

当一个字被加载到寄存器中时,字节不会反转以反映小端序。例如,如果内存中的一个字包含 0x11223344,我们将它加载到寄存器中,我们会得到 0x11223344(我希望是 0x44332211)。

考虑以下 sn-p:

    .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”按小端存储,如预期:0x64636261 (dcba)。程序完成后,我希望 0x00646362 (\0dbc) 存储在内存中,但存储的是 0x63626100 (cba\0)。

为什么会这样?

在 Fedora 24、x86_64、QtSpim 版本 9.1.17 上测试。

【问题讨论】:

    标签: mips endianness qtspim


    【解决方案1】:

    没有矛盾。您将0x64636261 向左移动 8 位(即向左移出位,同时从右侧移入零)。所以0x64636261 变成了0x63626100
    如果你想要0x00646362,你应该使用srl 而不是sll

    这是一个 ASCII 图表,显示了 32 位字与 little-endian 配置中各个字节之间的关系:

    0x64636261
      | | | |
      | | | ----> |'a'| letters
      | | |       -----
      | | ------> |'b'| letters+1
      | |         -----
      | --------> |'c'| letters+2
      |           -----
      ----------> |'d'| letters+3
    

    【讨论】:

    • 由于这是小端序,我希望我的寄存器$t1 在加载后包含0x61626364(字节顺序相反),在左移后包含0x62636400。当我们将它存储回内存时,它以相反的顺序存储,即为0x00646362。我是否做出了错误的假设?
    • “我有没有做出错误的假设?”。是的。在 little-endian 配置中,最低有效字节位于最低地址。 letters 的第一个字符是 'a' (0x61),然后是 'b' (0x62),等等。因此,letters 中的 lw 将给您 0x64636261
    • @plafer 字符串按顺序存储,不依赖于字节序
    • @Michael "lw from letters 会给你0x64636261"。实际上,由于它们存储在0x64636261,当我加载时,我应该得到0x61626364(正如这个问题所证实的:stackoverflow.com/q/8050107/3499862如果机器是小端那么将被反转然后复制到寄存器.”)。我的其余推论都来自这个事实。我了解(如 ASCII 图中所示)它们在内存中的布局方式,但我们不同意的是它们在寄存器中的加载顺序。我的困惑现在清楚了吗?
    • @LưuVĩnhPhúc 实际上,由于“abcd”存储为 0x64636261 (dcba),我知道它们的存储方式与任何其他位模式一样。 Little-endian 与 Big-endian 与位模式的“类型”无关。
    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2019-06-30
    • 1970-01-01
    • 2018-05-15
    • 2022-06-10
    • 1970-01-01
    • 2012-11-13
    • 2012-10-09
    相关资源
    最近更新 更多