为什么MIPS中没有RET指令,而x86有RET指令?
Why isn't there any RET instruction in MIPS, while x86 has a RET instruction?
为什么 MIPS 子程序 return 通过 jr
而 x86 return 通过使用 ret
?
为什么 MIPS 中没有 ret
指令?
或者,为什么 x86 不使用 jr
?
在x86中,call指令将内存中的return地址放到栈上。在 MIPS 中,调用指令 (jal
) 将 return 地址放入寄存器。
在x86中,ret指令从栈中移除return地址并跳转到它。 MIPS 哲学不会将单独的步骤组合成一条指令。这大大简化了指令集。从堆栈中删除一个值和执行一个分支是不同的操作,需要不同的指令。在 call/return 的特殊情况下,它还有一个优点,即在叶函数中根本不需要将 return 地址写入内存。
X86 有一个等同于 jr 指令的指令,jmp r/m32
,目标指定为一个寄存器。该指令通常不用于函数 return,因为这样就需要一条单独的指令将 return 地址从堆栈弹出到寄存器中(但在特殊情况下,我编写的代码正是这样做的).
为什么 MIPS 子程序 return 通过 jr
而 x86 return 通过使用 ret
?
为什么 MIPS 中没有 ret
指令?
或者,为什么 x86 不使用 jr
?
在x86中,call指令将内存中的return地址放到栈上。在 MIPS 中,调用指令 (jal
) 将 return 地址放入寄存器。
在x86中,ret指令从栈中移除return地址并跳转到它。 MIPS 哲学不会将单独的步骤组合成一条指令。这大大简化了指令集。从堆栈中删除一个值和执行一个分支是不同的操作,需要不同的指令。在 call/return 的特殊情况下,它还有一个优点,即在叶函数中根本不需要将 return 地址写入内存。
X86 有一个等同于 jr 指令的指令,jmp r/m32
,目标指定为一个寄存器。该指令通常不用于函数 return,因为这样就需要一条单独的指令将 return 地址从堆栈弹出到寄存器中(但在特殊情况下,我编写的代码正是这样做的).