Assembly la和addi之间的差异,用于在MIPS asm中复制寄存器
我是MIPS新手,对一个概念感到困惑 我在Assembly la和addi之间的差异,用于在MIPS asm中复制寄存器,assembly,mips,Assembly,Mips,我是MIPS新手,对一个概念感到困惑 我在$s5中存储了一个值5,我想将它复制到$a0,以便我可以使用li$v0,1打印它。我有两种复制方法 addi$a0,$s5,0 la$a0,0($s5) 要么1。或2。如果我在后面打印值5,则可以打印值li$v0,1/syscall) 但是为什么它对2有效呢。?2.正在将$s5的地址存储在$a0处,但我们需要一个值,而不是地址 这将由print_integer自动处理吗?首先,la不是MIPS硬件指令,只是由汇编程序实现的伪指令,如li。(通常使用lui
$s5
中存储了一个值5
,我想将它复制到$a0
,以便我可以使用li$v0,1
打印它。我有两种复制方法
addi$a0,$s5,0
la$a0,0($s5)
5
,则可以打印值li$v0,1
/syscall
)
但是为什么它对2有效呢。?2.正在将$s5
的地址存储在$a0
处,但我们需要一个值,而不是地址
这将由print_integer自动处理吗?首先,
la
不是MIPS硬件指令,只是由汇编程序实现的伪指令,如li
。(通常使用lui
/addiu
在寄存器中构造32位符号地址,如果您以正常方式使用它,如la$reg,symbol
)。查看反汇编/机器代码输出,例如,组装时MARS向您展示
通过使用寄存器寻址模式而不是符号名,可以将la
滥用为move
。(move
是另一条伪指令;MIPS没有硬件移动,您只需添加$zero
或立即0
)
如果汇编器选择了la
,则la
可以准确地组装成addi$a0,$s5,0
。(虽然更可能的情况是,它会选择addiu;如果立即数不是0,则不必在签名溢出时捕获。通常,您永远不需要add/addi,只需要addu/addiu。)
2将$s5的地址存储为$a0,但我们需要一个值,而不是地址。
这将由print_integer自动处理吗
不,无论哪种方式,$a0
中的值都是相同的,就像您像普通人一样移动$a0,$s5一样。所以print_integer排序的最终结果没有差别
你不能记下登记簿的地址。寄存器可以保存内存地址,但不能获取寄存器的地址
是la
“获取其源操作数的地址”,但请注意0($s5)
不是寄存器,而是内存寻址模式的语法,它引用$s5
中地址处的内存,就像您可以与lw
一起使用一样。该内存的地址正好是$s5
C等价物为int*a0=&*s5代码>
其中&取消一元*
取消引用