gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:30:11 30 4
gpt4 key购买 nike

例如在此代码中:

#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 = 消息地址
某些汇编器还可能允许您执行诸如 la $t0, 8($t1) # t0 = t1 + 8 之类的操作。

<小时/>

何时使用 li 以及何时使用 la 取决于上下文。如果您要加载的值将用作地址,您通常会使用 la 来加载它,否则您通常会使用 li。由于它们是部分可互换的,这实际上取决于您,但如果您一直使用 la 来加载整数常量,其他人可能会发现您的代码看起来很奇怪。

关于assembly - MIPS 操作码中的 la 和 li 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48313072/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com