是否有可能使用 RET 函数从条件语句返回到调用它的主函数(_start)并继续执行下一条指令? 现在,它只是导致分段错误,因为它没有在堆栈中设置。
如果没有,如果在汇编中跳转,执行的最佳方法是什么?我是否应该在 if 语句末尾写 jmp _cont 而不是 ret,然后继续执行 _cont 中的指令?
section .data
a dq 222
b dq 333
section .text
global _start
_start:
mov rax, [a]
mov rbx, [a]
cmp rax, rbx
je ifstatement1
//desired return point
mov rax, [b]
call _printInt
mov eax, 60
xor edi, edi
syscall
ifstatement1:
mov rax, [a]
call _printInt
ret
如果您想跳回到程序的开头,只需执行
jmp _start
即可。然而,如果您询问执行ifstatement1
处的命令后如何到达“期望的返回点”,则不能使用RET
指令。这是因为 CALL/RET
的工作原理。 CALL
指令将下一条指令的地址压入堆栈,然后跳转到所需的内存位置。然后 RET
指令从该堆栈中弹出压入的地址并跳转到该地址。但是,您没有使用 CALL
指令来执行 ifstatement1
,而只是使用 JE
跳转到它,这意味着堆栈将不包含 RET
工作所需的信息。解决这个问题最简单的方法是做类似的事情
je ifstatement1
_cont:
;rest of your code
ifstatement1:
;conditional code
jmp _cont