MIPS 操作码中的 la 和 li 有什么区别?

What is the difference between la and li in opcodes in MIPS?

例如在这段代码中:

#display message
li $v0, 4
la $a0, Message


#promt user to enter name
li $v0, 8 
la , username
li $a1, 20
syscall

#display the name
li $v0, 4
la $a0, userName
syscall

我很困惑li(立即加载)和la(加载地址)的真正含义。

它们非常相似,因为两者(大部分)都用于加载即时值。它们也是伪指令,所以真正由支持它们的每个汇编程序来确定它们应该如何运行。


li 代表 Load Immediate,是加载最大 32 位立即数的便捷方式。 addiori 等指令只能编码 16 位立即数,因此汇编程序可能会将 li 翻译成多条指令。

例如,li $t0,0x12345678 可能会变成:

lui $at, 0x1234 
ori $t0, $at, 0x5678        

所以这只是一种避免您编写这两条指令的方法,而是让汇编程序为您解决。

真的没有理由,例如li $t0, Message 不被支持,因为标签也是立即数,但一些汇编器可能不接受 li.

的标签

la代表加载地址。它可以像 li 一样用于加载整数常量,例如la $t0,0x1234678。但它也适用于标签:la $t0, Message # t0 = address of Message.
某些汇编程序可能还允许您执行 la $t0, 8($t1) # t0 = t1 + 8 之类的操作。


何时使用 li 以及何时使用 la 取决于上下文。如果您要加载的值将用作地址,您通常会使用 la 来加载它,否则您通常会使用 li。由于它们是部分可互换的,这完全取决于您,但如果您一直使用 la 来加载整数常量,其他人可能会觉得您的代码看起来很奇怪。