Segmentation fault when pushing on stack (NASM)

纵然是瞬间 提交于 2019-12-01 12:29:39

问题


I'm trying to get a nasm program running. The following code:

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

I get a segmentation fault (core dump) when pushing ebp on the stack. Why is that? I'm running this code on an Ubuntu virtual machine. Funny thing is, sometimes I get an "illegal instruction" error.


回答1:


I get a segmentation fault (core dump) when pushing ebp on the stack. Why is that? I'm running this code on an Ubuntu virtual machine. Funny thing is, sometimes I get an "illegal instruction" error.

I'd bet that you're not getting the segmentation fault at the push, but rather at the ret. What the ret instruction does is pop the return address from the stack (which typically will have been pushed there by a call instruction) and jumps to it.

So when you do this:

push ebp
ret

You're effectively jumping to whatever address happened to be stored in ebp.
You need to balance the stack before returning - i.e. each push-type instruction should have a corresponding pop-type instruction:

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


来源:https://stackoverflow.com/questions/16174150/segmentation-fault-when-pushing-on-stack-nasm

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!