分割故障当推栈(NASM)(Segmentation fault when pushing on s

2019-08-31 22:36发布

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

Answer 1:

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

我敢打赌,你不是在得到段错误push ,而是在ret 。 什么ret指令确实是流行从堆栈(通常将已被推送的有返回地址call指令)并跳转到它。

所以,当你这样做:

push ebp
ret

你有效地跳跃到任何地址正好是存储在ebp
您需要在返回前平衡堆栈 - 即每手推式指令应该有一个相应的弹出式指令:

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


文章来源: Segmentation fault when pushing on stack (NASM)