ori 指令在此代码中的重要性是什么?


# Add the first five integers 
.text 0x3000
.globl main
main:
 add   $8,$0,$0     # sum = 0
 add   $9,$0,$0     # for (i = 0; ...
loop:
 add   $8,$8,$9     # sum = sum + i;
 addi  $9,$9,1      # for (...; ...; i++
 slti  $10,$9,5     # for (...; i<5;
 bne   $10,$0,loop
end: 
 ori   $v0, $0, 10     # system call 10 for exit
 syscall               # we are out of here.

我不太确定ori指令到底在做什么。
一旦循环结束,它就结束了,那么为什么它很重要呢?

在这种情况下,ori只是充当mov
这是因为ori rd, rs, imm被定义为 rd = rs | imm .
rs是零寄存器时,这仅表示rd = imm

如果 CPU 的指令集没有实际的mov指令,有用的汇编程序会将伪指令mov rd, imm转换为 ori rd, $0, imm


至于循环和结局,问题是汇编语言没有"到达程序的末尾并退出"的概念。假设您的最后编码指令位于地址 0xDEADBEEF。CPU 执行指令后,只需在 0xDEADBEF0 处移动到下一个指令地址。下一个指令地址只是不断递增,直到发生某些事情,比如陷阱或其他什么。

因此,终止程序的传统方法是进行系统调用。这会将执行转移到操作系统,终止进程,并且永远不会将执行权交还给进程。要进行系统调用,您需要将适当的值放入寄存器 - 在这种情况下,值 10 是系统将解释为"退出进程"的命令。

最新更新