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

What is the ori instruction's importance in this code?

# Add the first five integers 

.text 0x3000
.globl main
main:
 add   ,[=10=],[=10=]     # sum = 0
 add   ,[=10=],[=10=]     # for (i = 0; ...
loop:
 add   ,,     # sum = sum + i;
 addi  ,,1      # for (...; ...; i++
 slti  ,,5     # for (...; i<5;
 bne   ,[=10=],loop
end: 
 ori   $v0, [=10=], 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, [=18=], imm


至于循环和结束,关键是汇编语言没有"reaching the end of the program and exiting"的概念。假设您的最后一条编码指令位于地址 0xDEADBEEF。在 CPU 执行指令后,它会简单地移动到位于 0xDEADBEF0 的下一条指令地址。下一条指令地址只会不断递增,直到发生某些事情,例如陷阱或诸如此类的事情。

所以常规的终止程序的方法是进行系统调用。这会将执行转移到 OS,终止进程,并且永远不会将执行权交还给进程。要进行系统调用,您需要将适当的值放入寄存器 - 在这种情况下,值 10 是系统将解释为 "exit process".

的命令