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

时间:2018-01-18 02:48:49

标签: assembly mips

例如,在此代码中:

#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(加载地址)的真正含义感到非常困惑?

1 个答案:

答案 0 :(得分:8)

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

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加载整数常量,其他人可能会发现你的代码看起来很奇怪。