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 位立即数的便捷方式。 addi
和 ori
等指令只能编码 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
来加载整数常量,其他人可能会觉得您的代码看起来很奇怪。
例如在这段代码中:
#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 位立即数的便捷方式。 addi
和 ori
等指令只能编码 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
来加载整数常量,其他人可能会觉得您的代码看起来很奇怪。