【问题标题】:What do the MIPS load word left (LWL) and load word right (LWR) instructions do?MIPS 左加载字 (LWL) 和右加载字 (LWR) 指令有什么作用?
【发布时间】:2019-08-16 09:21:44
【问题描述】:

我最近在阅读 MIPS 指令集时遇到了两条在其他指令集中没有见过的不寻常指令。

我环顾四周,找到了关于这些指令究竟做了什么的体面解释,但我所能弄清楚的是它们在某种程度上与未对齐的内存访问有关。

例如Wikipedia says:

MIPS I 要求所有内存访问都与它们的自然字边界对齐,否则会发出异常信号。为了支持高效的非对齐内存访问,有以“left”或“right”为后缀的加载/存储字指令。

但没有进一步详细说明这实际上意味着什么。

我能找到的最接近正确解释的是Dr John Lumis's website

通过使用一对特殊指令,可以仅在两条指令中加载或存储未对齐的字和双字。对于加载,LWL 指令与 LWR 指令配对。加载指令从对齐的字中读取左侧或右侧字节(寄存器的左侧或右侧),并将它们合并到目标寄存器的正确字节中。

但这对我来说似乎只是故事的一半,我很难弄清楚确切的细节。 IE。我正在努力理解哪些字节将从哪些地址移动到哪里。

那么究竟这些说明做了什么?

【问题讨论】:

    标签: assembly mips memory-alignment instructions instruction-set


    【解决方案1】:

    any MIPS 手册中应该有解释:LWR 将加载值的 right 部分(最不重要的部分),LWL 将加载 left 部分

    基本上对于地址A,LWL 会将4 - A % 4 字节加载到寄存器的左侧,而LWR 会将剩余的A % 4 字节加载到它的右侧。例如,如果 A = 1 如下表所示

            ├ A             ┤
    ... ┃ 0 ┆ 1 ┆ 2 ┆ 3 ┃ 4 ┆ 5 ┆ 6 ┆ 7 ┃ ...
    

    那么第一个字包含我们需要的值的 3 个字节,因此 LWL 会将地址 {1,2,3} 处的 3 个字节加载到寄存器中,然后剩余的字节将用 LWR 加载

    事实上,谷歌搜索词的第一个结果“MIPS LWL LWR”给了我下面的演示

    • lwr $4, 2($0) # 这是一个伪指令,开始一个字节 2 想要读取从该位置开始的 32 位字。

                  Memory                                Register 4
                  byte 0, byte 1, byte 2, byte 3        byte 0, byte 1, byte 2, byte 3
      address 4:  4       5       6       7             A       B       C       D       before 
      address 0:  0       1       2       3             A       0       1       2       after
      
    • lwl $4, 2($0) # 这是一个伪指令,开始一个字节 2 想要读取从该位置开始的 32 位字。

                  Memory                                Register 4
                  byte 0, byte 1, byte 2, byte 3        byte 0, byte 1, byte 2, byte 3
      address 4:  4       5       6       7             A       B       C       D       before 
      address 0:  0       1       2       3             2       3       C       D       after
      

    http://db.cs.duke.edu/courses/fall02/cps104/homework/lwswlr.html


    简单地说:

    你给“load word left”指令你想要加载的未对齐字的最高有效字节的有效地址,它从封闭字中挑选出正确的字节并将它们合并到目标的高字节注册。

    “正确加载字”的工作原理类似:你给它你要加载的未对齐字的最低有效字节的有效地址,它会从封闭字中挑选出正确的字节并将它们合并到较低的字节中目标寄存器。

    The MIPS R4000, part 6: Memory access (unaligned)


    这是MIPS32 instruction set manual中的详细信息


    来自MIPS IV ISA的另一幅插画

    另见

    MIPS Release 6 起需要加载和存储以支持非对齐访问,因此删除了 LWL/LWR/SWL/SWR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2015-10-12
      • 2019-06-01
      相关资源
      最近更新 更多