Pha*_*rap 4 assembly mips instruction-set memory-alignment instructions
最近我一直在研究 MIPS 指令集,当时我遇到了两个在其他指令集中没有见过的不寻常指令。
我环顾四周,想找到一个关于指令到底做什么的合理解释,但我所能弄清楚的是,它们在某种程度上与未对齐的内存访问有关。
例如,维基百科说:
MIPS I 要求所有内存访问与其自然字边界对齐,否则会发出异常信号。为了支持有效的未对齐存储器访问,存在以“左”或“右”为后缀的加载/存储字指令。
但没有进一步详细说明这实际上意味着什么。
我能找到的最接近正确解释的是约翰·卢米斯博士的网站:
通过使用一对特殊指令,可以仅在两条指令中加载或存储未对齐的字和双字。对于加载,LWL 指令与 LWR 指令配对。加载指令从对齐字中读取左侧或右侧字节(寄存器的左侧或右侧),并将它们合并到目标寄存器的正确字节中。
但这对我来说似乎仍然只是故事的一半,我很难弄清楚确切的细节。即我正在努力理解哪些地址的哪些字节将被移动到哪里。
那么这些指令到底有什么作用呢?
任何MIPS 手册中都应该有解释:LWR 将加载值的右侧部分(最低有效部分),LWL 将加载左侧部分
\n\n基本上,对于地址,ALWL 会将4 - A % 4字节加载到寄存器左侧,LWR 将加载剩余的字节A % 4字节加载到寄存器右侧。例如,如果 A = 1 如下表所示
\xe2\x94\x9c A \xe2\x94\xa4\n... \xe2\x94\x83 0 \xe2\x94\x86 1 \xe2\x94\x86 2 \xe2\x94\x86 3 \xe2\x94\x83 4 \xe2\x94\x86 5 \xe2\x94\x86 6 \xe2\x94\x86 7 \xe2\x94\x83 ...\nRun Code Online (Sandbox Code Playgroud)\n\n那么第一个字包含我们需要的 3 个字节的值,因此 LWL 会将地址 { 1, 2, 3 } 处的 3 个字节加载到寄存器,然后剩余的字节将用 LWR 加载
\n\n事实上,Google 上搜索词“MIPS LWL LWR”的第一个结果的第一个结果给了我以下演示
\n\n\n\n\n\n
\n\n- \n
\n\n
lwr $4, 2($0)# 这是一个虚拟指令,它开始一个字节 2 想要读取从该位置开始的 32 位字。Run Code Online (Sandbox Code Playgroud)Memory Register 4\n byte 0, byte 1, byte 2, byte 3 byte 0, byte 1, byte 2, byte 3\naddress 4: 4 5 6 7 A B C D before \naddress 0: 0 1 2 3 A 0 1 2 after\n- \n
\n\n
lwl $4, 2($0)# 这是一个虚拟指令,它开始一个字节 2 想要读取从该位置开始的 32 位字。Run Code Online (Sandbox Code Playgroud)Memory Register 4\n byte 0, byte 1, byte 2, byte 3 byte 0, byte 1, byte 2, byte 3\naddress 4: 4 5 6 7 A B C D before \naddress 0: 0 1 2 3 2 3 C D after\nhttp://db.cs.duke.edu/courses/fall02/cps104/homework/lwswlr.html
\n
简单来说:
\n\n\n\n\n您向 \xe2\x80\x9cload word left\xe2\x80\x9d 指令提供要加载的未对齐字的最高有效字节的有效地址,它从封闭字中挑选出正确的字节并将它们合并到目标寄存器的高字节。
\n\n\xe2\x80\x9cload 字 right\xe2\x80\x9d 的工作方式类似:您给它要加载的未对齐字的最低有效字节的有效地址,它会从封闭的字中挑选出正确的字节并将它们合并到目标寄存器的低字节中。
\n\n \n
这是 中的详细信息MIPS32指令集手册中的详细信息
\n\n\n\n\n\n另一张插图来自MIPS IV ISA
\n\n\n\n也可以看看
\n\n\n\n从MIPS Release 6开始,需要加载和存储来支持未对齐访问,因此删除了 LWL/LWR/SWL/SWR
\n