在函数x86_64 GAS

时间:2018-11-13 22:28:53

标签: assembly gdb sigsegv gas

我有一个小程序,只是将一个项目添加到堆栈中,然后输入一个函数来添加另一个。问题在于,每次执行它时,它的行为都会很奇怪。

功能如下:

.section .data

.section .text

.globl _start
_start:
    # Push
    push $1
    # Function call
    call pfun
    movq $60, %rax
    syscall

.type pfun, @function
pfun:
    # Push
    push $2
    # Return
    ret

一点也不复杂,但是不会出现分段错误,如果您尝试对其进行调试,则会发现该错误在程序进入函数内部时发生,但没有任何有关其位置的信息。

  

程序收到信号SIGSEGV,分段错误。   0x0000000000000002 in ?? ()

现在,如果在函数推入并运行后添加“ pop”,则它将成功构建并运行。但是,如果您对其进行调试,则将看到它永远不会使用“ n”(next)命令进入函数。

我一直在寻找答案,但根本没有找到与ASM类似的东西。最近开始学习ASM,对我来说,它看起来非常不错,所以真的不知道为什么会发生这种情况。

1 个答案:

答案 0 :(得分:2)

您的问题在这里:

pfun:
    push $2
    ret

我认为您不能正确理解call/ret。您的函数与jmp 2等效,并且总是在pm中触发异常。 callpush (r)eip and then jmp类似,而retpop (r)eip。在通话/功能中,您需要pop此处或add (r)esp,0x??

按下的所有内容