# 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 是系统将解释为"退出进程"的命令。