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

时间:2016-02-23 03:26:41

标签: assembly mips

# 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指令到底在做什么 一旦循环结束它就结束了,为什么它有意义呢?

1 个答案:

答案 0 :(得分:3)

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

如果CPU的指令集没有实际的mov指令,那么一个有用的汇编器会将伪指令mov rd, imm转换为ori rd, $0, imm

至于循环和结尾,问题是汇编语言没有&#34;到达程序结尾并退出&#34;的概念。假设您的最后一条编码指令位于地址0xDEADBEEF。 CPU执行该指令后,它只是移动到0xDEADBEF0的下一个指令地址。下一个指令地址只是继续递增,直到发生某些事情,如陷阱或诸如此类的东西。

因此,终止程序的传统方法是进行系统调用。这会将执行转移到操作系统,杀死进程,并且永远不会将执行返回给进程。要进行系统调用,您需要在寄存器中输入适当的值 - 在这种情况下,值10是系统将解释为&#34;退出流程&#34;的命令。