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

Meh*_* s. 2 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
Run Code Online (Sandbox Code Playgroud)

我很困惑li(加载立即)和la(加载地址)真正意味着什么?

Mic*_*ael 10

它们非常相似,因为它们(大部分)都用于加载立即值.它们都是伪指令,因此每个汇编器都支持它们来确定它们应该如何运行.


li代表Load Immediate,是一种方便的方法,可以立即加载最多32位的大小.指令类似addiori只能编码16位立即数,因此汇编程序可能会转换li为多个指令.

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

lui $at, 0x1234 
ori $t0, $at, 0x5678        
Run Code Online (Sandbox Code Playgroud)

因此,它只是一种方法可以帮助您避免编写这两个指令,而是让汇编程序为您解决这个问题.

实际上没有理由li $t0, Message不支持eg ,因为标签也是即时的,但有些汇编器可能不接受标签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整数常量,那么其他人可能会发现你的代码看起来很奇怪.