繁体   English   中英

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 $10, username
li $a1, 20
syscall

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

我对li (立即加载)和la (加载地址)的真正含义感到非常困惑。

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


li代表立即加载,是加载最大 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加载整数常量,其他人可能会发现您的代码看起来很奇怪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM