assemblyx86stacknasmfault

Segmentation fault when pushing on stack (NASM)


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.


Solution

  • 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