我是x86_64程序集的新手,正在学习跳转条件。在我的代码中,当我使用jump if equal调用时,我得到了一个分段错误,但是如果我调用函数然后返回,就没有错误了,为什么会发生这种情况?我没有在堆栈上推送比我弹出更多的东西,或者只有当我调用另一个函数f. e.一个exit函数时才有可能退出跳转条件?
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
字符串
1条答案
按热度按时间egmofgnx1#
你只能从你调用的函数返回,而不能从你跳转到的函数返回。跳转指令不会在堆栈上存储返回地址,只有调用指令会。
当您跳转到
print_juhu
而不是调用函数时,ret
指令从堆栈中弹出一些随机垃圾而不是返回地址,并继续跳转到某个地址,很可能导致崩溃。要修复代码,请使用call指令来调用
print_juhu
。由于没有条件调用指令可用,您必须跳过call指令来有条件地调用函数:字符串