我是汇编 x86_64 的新手,正在尝试学习跳转条件。 在我的代码中,当我使用“jump if equal”调用时,出现分段错误, 但是如果我调用该函数然后返回就没有错误,为什么会发生这种情况? 我在堆栈上压入的内容并不比弹出的内容多,或者只能退出跳转 条件如果我调用另一个函数 f.e.退出功能?
section .data
success db "yeah"
section .text
global _start
print_juhu:
push rsi
push rdx
push rax
push rdi
mov rax,1
mov rsi,success
mov rdx,4
syscall
pop rdi
pop rax
pop rdx
pop rsi
ret
_start:
mov r12,3
mov r14,3
cmp r12,r14
je print_juhu
; Exit the program
mov rax, 60
mov rdi, 0
syscall
您只能从您调用的函数返回,不能从您跳转的函数返回。跳转指令不会在堆栈上存储返回地址,只有调用指令才会在堆栈上存储返回地址。
当您跳转到
print_juhu
而不是调用该函数时,ret
指令会从堆栈中弹出一些随机垃圾而不是返回地址,并继续跳转到某个地址,很可能会导致崩溃。
要修复代码,请使用调用指令来调用
print_juhu
。由于没有可用的条件调用指令,因此您必须跳过调用指令才能有条件地调用该函数:
jne dont_call_print_juhu
call print_juhu
dont_call_print_juhu:
...