为什么在这段汇编代码中调用'pop'会导致分段错误?

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

我正在Mac OS上使用x86-64程序集(使用NASM 2.09和2.13来捕获由NASM问题引起的错误)。我现在正在尝试实现函数调用,并尝试使用pushpop指令,但是pop似乎总是导致段错误:

line 10: 41072 Segmentation fault: 11 ./result

我尝试手动调整rsprbp等,但是pop似乎是问题所在。任何帮助,将不胜感激!

section .data

default rel
global start
section .text

start:
    mov r12, 4
    push r12
    call label_0_print_digit
    (some stuff to exit program)

label_0_print_digit:
    pop r12
    (some stuff to print the digit - the issue persists even without this)
    ret 
assembly x86-64 nasm
1个回答
3
投票

call指令将返回地址放在堆栈中。 pop指令从堆栈中删除返回地址(在您的代码中将其放入r12)。然后,ret指令尝试返回到地址4,该地址不是有效的代码地址,从而导致故障。

要访问堆栈上的函数的参数,请使用(rsp + 8)(rsp + 16)等代替pop

© www.soinside.com 2019 - 2024. All rights reserved.