2013-02-14 167 views
0

我想從另一個例程打印argv[1](在C terminallogy中),而不是從啓動例程(即入口點)打印。但它給了一個seg故障:爲什麼這給出了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 

有人可以解釋它嗎?

+0

這是功課嗎? – fons 2013-02-14 01:15:24

+0

編號:(真的好像? – Jack 2013-02-14 01:20:09

回答

1

你不能這樣做

call something 

然後

something: 
    pop ebp 

,並期望它的工作 - 在程序中,你如雨後春筍般冒出什麼的話,就是返回地址呼叫剛推。

+0

謝謝。那麼,有可能在'something'程序中訪問程序參數嗎? – Jack 2013-02-14 01:31:34

+0

當然 - 因爲它們剛好位於返回地址,它位於'[esp ]',一旦在例行程序'mov ebp,[esp + 4]'代替你的'pop ebp''應該給''ebp'中的'argv [1]'。 – 2013-02-14 01:34:44

+0

真的,我忘了它。今天有點失望LOL不知道爲什麼,無論如何,再次感謝你。 – Jack 2013-02-14 01:44:38