关于加载字 (lw) 与加载地址 (la) 以及 mips 程序集中偏移的混淆?

use*_*888 3 assembly mips

所以我对组装还很陌生,我有很多问题。例如,如果在数据段中我输入这个

.data

n:.word 4
Run Code Online (Sandbox Code Playgroud)

并在文本段

.text
lw $t0, n
Run Code Online (Sandbox Code Playgroud)

$t0 现在存储值 4 还是 n 的地址?因为我知道如果 n 是一个数组并且如果我输入 lw $t0 4(n) $t0 存储 n(内容)的第一个 VALUE。如果我输入 lw $t0 n 然后 $t0 存储地址。

另外我想知道我是否要设置 4 的偏移量来注册 $0 像这样:

lw $t0 4($0)
Run Code Online (Sandbox Code Playgroud)

$t0 会保持 0 吗?

Mar*_*oom 7

lw从内存中加载一个单词。
lw $t0, n从符号的地址读取n
lw $t0, 4($t1)从生成的地址读取$t1 + 4
lw $t0, 0x10000从地址读取0x10000

除了第二条,都是伪指令。

la加载地址。
la $t0, n将符号的地址n放入$t0.
la $t0, 4($t1)把生成的地址$t1 + 4放在$0.

这些都是伪指令。

li立即加载。
li $t0, 10000将立即数 10000 放入$t0.

这是一个伪指令。


中央的一点是,MIPS具有用于I型指令的16位的立即(常数),所以真正的形式lilw不允许移动一个值大于上述的0x10000 0x10000的或访问和地址。
汇编器通过生成两条或更多条指令来绕过它。
la理论上不需要,li可用于加载符号的地址,因为在此上下文中所述地址是立即数,但引入了特定的助记符。