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