# 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
指令到底在做什么
一旦循环结束它就结束了,为什么它有意义呢?
答案 0 :(得分:3)
在这种情况下,ori
只是mov
这是因为ori rd, rs, imm
被定义为rd = rs | imm
当rs
为零寄存器时,这仅表示rd = imm
。
如果CPU的指令集没有实际的mov
指令,那么一个有用的汇编器会将伪指令mov rd, imm
转换为ori rd, $0, imm
。
至于循环和结尾,问题是汇编语言没有&#34;到达程序结尾并退出&#34;的概念。假设您的最后一条编码指令位于地址0xDEADBEEF。 CPU执行该指令后,它只是移动到0xDEADBEF0的下一个指令地址。下一个指令地址只是继续递增,直到发生某些事情,如陷阱或诸如此类的东西。
因此,终止程序的传统方法是进行系统调用。这会将执行转移到操作系统,杀死进程,并且永远不会将执行返回给进程。要进行系统调用,您需要在寄存器中输入适当的值 - 在这种情况下,值10是系统将解释为&#34;退出流程&#34;的命令。