【问题标题】:Segmentation fault when pushing on stack (NASM)推入堆栈时出现分段错误(NASM)
【发布时间】:2013-04-16 22:49:33
【问题描述】:

我正在尝试运行一个 nasm 程序。 以下代码:

segment .data

contAir:    dt 1.11330e-10
constOil:   dt 2.33656e-10

segment .text

global calc

calc:

mov edx, 0
push ebp
;mov ebp, esp

;mov eax, [ebp + 8]

ret

将 ebp 推入堆栈时出现分段错误(核心转储)。这是为什么? 我在 Ubuntu 虚拟机上运行此代码。 有趣的是,有时我会收到“非法指令”错误。

【问题讨论】:

  • 你也在本机编译吗?
  • 是的。它是一个使用一些汇编代码的 C 程序。但就我的输出显示而言,C 代码运行良好。
  • 您能否将所有来源添加到您的问题中?
  • 从技术上讲,ret 不是退出程序并返回操作系统的正确方法。你需要使用exitint 80,但是你说的是C程序,你是在调用这个吗?如果是这样,你需要在ret之前pop ebp

标签: assembly x86 stack nasm fault


【解决方案1】:

将 ebp 推入堆栈时出现分段错误(核心转储)。这是为什么?我在 Ubuntu 虚拟机上运行此代码。有趣的是,有时我会收到“非法指令”错误。

我敢打赌,您不会在push 上遇到分段错误,而是在ret 上遇到分段错误。 ret 指令所做的是将返回地址从堆栈中弹出(通常会被 call 指令推送到那里)并跳转到它。

所以当你这样做时:

push ebp
ret

您实际上是在跳转到恰好存储在ebp 中的任何地址。
您需要在返回之前平衡堆栈 - 即每条推式指令都应该有相应的弹出式指令:

push ebp
; ... other code goes here ...
pop ebp
ret

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 2021-08-05
    • 1970-01-01
    • 2021-01-17
    • 2021-12-03
    • 1970-01-01
    • 2015-02-14
    • 2011-10-30
    相关资源
    最近更新 更多