0

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

4

1 回答 1

10

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

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

所以当你这样做时:

push ebp
ret

您实际上是跳转到恰好存储在ebp.
您需要在返回之前平衡堆栈 - 即每个推送类型指令应该有一个相应的弹出类型指令:

push ebp
; ... other code goes here ...
pop ebp
ret
于 2013-04-24T13:24:13.910 回答