执行条件后返回主流程

问题描述 投票:0回答:1

是否有可能使用 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
assembly 64-bit nasm
1个回答
0
投票

如果您想跳回到程序的开头,只需执行

jmp _start
即可。然而,如果您询问执行
ifstatement1
处的命令后如何到达“期望的返回点”,则不能使用
RET
指令。这是因为
CALL/RET
的工作原理。
CALL
指令将下一条指令的地址压入堆栈,然后跳转到所需的内存位置。然后
RET
指令从该堆栈中弹出压入的地址并跳转到该地址。但是,您没有使用
CALL
指令来执行
ifstatement1
,而只是使用
JE
跳转到它,这意味着堆栈将不包含
RET
工作所需的信息。解决这个问题最简单的方法是做类似的事情

    je ifstatement1
_cont:
    ;rest of your code

ifstatement1:
    ;conditional code
    jmp _cont
© www.soinside.com 2019 - 2024. All rights reserved.