0

argv[1]開始ルーチン(エントリポイント)からではなく、別のルーチンから(Cターミナルで)印刷したい。しかし、それはセグメンテーション違反を与えました:

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

誰かがそれを説明できますか?

4

1 に答える 1

1

あなたはできません

call something

その後

something:
  pop ebp

そして、それが機能することを期待します-ルーチンでは、ポップしているのは、呼び出しがプッシュしたばかりのリターンアドレスです。

于 2013-02-14T01:27:10.287 に答える