sw MIPS 指令的替代方案

Alternative for sw MIPS instruction

有什么方法可以将寄存器中的字保存到 RAM 中? 例如,我可以将 lw 命令解释为 lui、ori。不使用 sw 怎么能把 4 Bytes 存入 RAM?

首先,lui/ori从立即数构造寄存器中的值,而不访问数据存储器。它们在任何方面都不等同于 lw。也许您正在考虑 li,它是 lui and/or ori 的伪指令。只有加载指令才能访问内存;立即 ALU 指令从指令本身获取数据,但这并不重要。


MIPS 为 loading/storing 未对齐字的左右部分提供成对指令。商店是SWL(左)和SWR(商店词右)。

它们的效果取决于您的 MIPS 的字节序模式(它支持大端和小端)。

在小端模式下,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 有一个内核选项来模拟未对齐 load/store 而不是在未对齐的 LW 或 SW 上传送 SIGBUS。