例如,在此代码中:
#display message
li $v0, 4
la $a0, Message
#promt user to enter name
li $v0, 8
la $10, username
li $a1, 20
syscall
#display the name
li $v0, 4
la $a0, userName
syscall
我对li(加载即时)和la(加载地址)的真正含义感到非常困惑?
答案 0 :(得分:8)
它们非常相似,因为它们(大部分)都用于加载立即值。它们都是伪指令,所以它真的由每个支持它们的汇编程序决定它们应该如何运行。
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
加载整数常量,其他人可能会发现你的代码看起来很奇怪。