问题
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