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

Flo*_*ian 0 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
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ael 5

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

我敢打赌,您不会在时遇到细分错误push,而在时遇到错误ret。该ret指令的作用是从堆栈中弹出返回地址(通常将被一条call指令压入该地址)并跳转到该地址。

因此,当您执行此操作时:

push ebp
ret
Run Code Online (Sandbox Code Playgroud)

您实际上是在跳到碰巧要存储在中的任何地址ebp
您需要在返回之前平衡堆栈-即每个push-type指令应具有一个对应的pop-type指令:

push ebp
; ... other code goes here ...
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)