推入堆栈时的分段错误(NASM)

时间:2013-04-23 16:06:04

标签: stack push nasm fault

我正在尝试运行一个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虚拟机上运行此代码。 有趣的是,有时我会收到“非法指令”错误。

1 个答案:

答案 0 :(得分:5)

  

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

我敢打赌你没有在push得到分段错误,而是在retret指令执行的操作是从堆栈中弹出返回地址(通常由call指令推送到那里)并跳转到它。

所以当你这样做时:

push ebp
ret

你有效地跳转到ebp中存储的任何地址。
你需要在返回之前平衡堆栈 - 即每个push-type指令应该有一个相应的pop类型指令:

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