为什么这会出现seg故障?

时间:2013-02-14 01:11:46

标签: assembly segmentation-fault fasm

我想从另一个例程中打印argv[1](在C术语中)而不是从启动例程(这是入口点)。但它给出了一个seg错误:

format ELF executable 3
entry start
segment readable executable

start:
    pop ebx ;argc
    pop ebp ;argv[0]
    call printarg

    ;; exit
    xor ebx,ebx
    mov eax,1
    int 80h

printarg:
    pop ebp ;argv[1]
    call puts
    ret
puts:
    pusha
    mov eax,ebp
    xor edx,edx
    ;; get string length
.loop1:
    cmp byte [eax],0
    je .loop2
    inc eax
    inc edx
    jmp .loop1
    ;; print it
.loop2:
    mov eax,4
    mov ebx,1
    mov ecx,ebp
    int 80h
    ;print a new line
    mov eax,4
    mov ebx,1
    mov ecx,NL
    mov edx,1
    int 80h 
    popa
    ret

segment readable writeable
NL db 0xA

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

你无法做到

call something

然后

something:
  pop ebp

并期望它能够正常工作 - 在例程中,你正在弹出的是调用刚刚推送的返回地址。