MIPS向左加载字(LWL)和向右加载字(LWR)指令的作用是什么? [英] What do the MIPS load word left (LWL) and load word right (LWR) instructions do?
问题描述
我最近一直在阅读MIPS指令集,突然发现了两条我在其他指令集中没有见过的不寻常的指令。
我环顾四周,想找出这些指令到底有什么作用的合理解释,但我所能做的就是它们以某种方式与未对齐的内存访问相关。
MIPS I要求所有内存访问都与其自然字边界对齐,否则会发出异常信号。为了支持高效的未对齐内存访问,存在以"Left"或"Right"为后缀的加载/存储字指令。
但没有进一步详细说明这实际上意味着什么。
我所能找到的最接近正确解释的是Dr John Lumis's website:
通过使用一对特殊指令,可以仅在两条指令中加载或存储未对齐的字和双字。对于加载,LWL指令与LWR指令配对。加载指令从对齐的字读取左侧或右侧字节(寄存器的左侧或右侧),并将它们合并到目标寄存器的正确字节中。但对我来说,这似乎只是故事的一半,我很难弄清楚确切的细节。也就是说,我很难理解哪些字节的哪些地址将被转移到哪里。
那么这些指令到底做了什么?
MIPS
应在任何<推荐答案手册中提供说明:lwr将加载值的右侧部分,而lwl将加载左侧部分
基本上对于地址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
事实上,在Google上搜索"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"指令要加载的未对齐字的最高有效字节的有效地址,它会从包含的字中挑选出正确的字节,并将它们合并到目标寄存器的高位字节中。
"Load Word Right"的工作原理与此类似:您为其提供要加载的未对齐字的最低有效字节的有效地址,然后它从包含的字中挑选出正确的字节,并将它们合并到目标寄存器的低位字节中。
以下是MIPS32 instruction set manual
中的详细信息MIPS IV ISA中的另一个插图
另见
- MIPS® Architecture For Programmers Volume II-A: The MIPS64® Instruction Set Reference Manual
- Handling Unaligned Data in MIPS
需要从MIPS Release 6和向上加载和存储来支持未对齐访问,因此删除了LWL/LWR/SWL/SWR
这篇关于MIPS向左加载字(LWL)和向右加载字(LWR)指令的作用是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!