我正在尝试运行一个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虚拟机上运行此代码。 有趣的是,有时我会收到“非法指令”错误。
答案 0 :(得分:5)
在堆栈上推送ebp时出现分段错误(核心转储)。这是为什么?我在Ubuntu虚拟机上运行此代码。有趣的是,有时我会收到“非法指令”错误。
我敢打赌你没有在push
得到分段错误,而是在ret
。 ret
指令执行的操作是从堆栈中弹出返回地址(通常由call
指令推送到那里)并跳转到它。
所以当你这样做时:
push ebp
ret
你有效地跳转到ebp
中存储的任何地址。
你需要在返回之前平衡堆栈 - 即每个push-type指令应该有一个相应的pop类型指令:
push ebp
; ... other code goes here ...
pop ebp
ret