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".
的命令
# 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".
的命令