解释应该可以在anyMIPS手册:LWR将加载right值的部分(最低有效部分),LWL 将加载left part
基本上是为了一个地址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 http://db.cs.duke.edu/courses/fall02/cps104/homework/lwswlr.html
简单来说:
您向“向左加载字”指令提供要加载的未对齐字的最高有效字节的有效地址,它会从封闭字中挑选出正确的字节并将它们合并到目标寄存器的高字节中。
“加载字正确”的工作原理类似:您给它要加载的未对齐字的最低有效字节的有效地址,它从封闭的字中挑选出正确的字节并将它们合并到目标的较低字节中登记。
MIPS R4000,第 6 部分:内存访问(未对齐) https://devblogs.microsoft.com/oldnewthing/20180409-00/?p=98465
这是 中的详细信息MIPS32指令集手册 https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00086-2B-MIPS32BIS-AFP-6.06.pdf
另一张插图来自MIPS IV ISA https://www.cs.cmu.edu/afs/cs/academic/class/15740-f97/public/doc/mips-isa.pdf
See also
- MIPS® 程序员架构第 II-A 卷:MIPS64® 指令集参考手册 https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00087-2B-MIPS64BIS-AFP-6.06.pdf
- 在 MIPS 中处理未对齐的数据 http://www.cs.iit.edu/~virgil/cs470/Labs/Lab5.pdf
From MIPS 版本 6 https://en.wikipedia.org/wiki/MIPS_architecture#MIPS32/MIPS64_Release_6并且需要上传和存储来支持未对齐访问,因此删除了 LWL/LWR/SWL/SWR