将一个字从寄存器保存到RAM的替代方法是什么? 例如,我可以将lw命令解释为lui,ori。不使用sw如何将4个字节存储到RAM中?
答案 0 :(得分:0)
首先,lui
/ ori
从立即数在寄存器中构造一个值,而无需访问数据存储器。它们在任何方面都不等同于lw
。也许您在考虑li
,它是lui
和/或ori
的伪指令。只有加载指令才能访问内存;立即的ALU指令从指令本身获取数据,但实际上并不算数。
MIPS提供了成对的指令,用于加载/存储未对齐单词的左右部分。商店为SWL
(左)和SWR
(商店词为右)。
它们的效果取决于您的MIPS的字节序模式(它支持大小字节序)。 MARS simulates a MIPS in little-endian mode.
在小端模式下,SWL $t1, buf
将$ t1的高字节存储到buf
的第一个字节中,以对齐buf
。
在小尾数模式下,在 对齐的地址上(例如sw
需要 1 ),SWR就像SW,存储所有4个字节。
这些指令很有趣,因为它们可以在一个字中修改1到4个字节。包括3个字节,这是一个sb
(字节)或sh
(半字)无法做到的。
http://db.cs.duke.edu/courses/fall02/cps104/homework/lwswlr.html解释了如何使用同名的SPARC指令。我认为MIPS(在大端模式下)会是相同的,而在小端模式下(例如MARS模拟)的MIPS就是这样,但是相反。
因此在大端模式下,对于对齐的地址,我认为swl
等效于sw
,但是我尚未测试。
脚注1: MIPS32R6 removed LWL/R,并要求LW支持未对齐的存储/加载。维基百科没有提及存储,只是加载。
另请参见https://www.linux-mips.org/wiki/Alignment:Linux MIPS具有内核选项,可以模拟未对齐的加载/存储,而不是在未对齐的LW或SW上交付SIGBUS。