2016-09-07 11 views
1

私はNASMを使用して、私のプログラムに与えられたコマンドライン引数を印刷しようとしていると:印刷 `ARGV []` NASM

GLOBAL main 
EXTERN printf 

section .rodata 
fmt db "Argument: %s", 10, 0 

section .text 
main: 
    push ebp     ; push ebp0 
    mov  ebp, esp  ; [ebp1] == ebp0 

    push dword[ebp+8]  ; push argc 
    call print_args 

    mov  eax, 0  ; return(0) 
    mov  esp, ebp ; pop 
    pop  ebp    ; stack frame 
    ret 

print_args: 
    push ebp    ; pusheo ebp1 
    mov  ebp, esp ; [ebp2] == ebp1 
    mov  edi, dword[ebp+8] ; [ebp+8] == argc 
    jmp  lop 
postlop: 
    mov  esp, ebp 
    pop  ebp 
    ret 


lop: 
    sub  edi, 1 
    cmp  edi, 0 
    jz  postlop 
    mov  esi, [ebp] ; [esi] == ebp1 
    mov  ebx, [esi + 12] ; [esi+12] = [ebp1+12] = argv[0]? 
    push ebx 
    push fmt 
    call printf 
    jmp  lop 

しかし、このプリントだけゴミ(私はこれが argv[0]を印刷しなければならないと信じて、 argc-1回)。

nasm -f elf32 main.asm 
gcc -m32 main.o -o main.out 

は何が問題である:

私は私のコードをコンパイルしていますか?ところで

dword[ebp+8]を使用してargcをピックアップして正常に動作します。

私はこれをubuntuで実行しています。プログラムはArgument: ...argc-1回を出力しますが、...はごみです。ただ、[epb+8]よう

答えて

2

[esi + 12]argvすなわち引数の住所がの配列のアドレスで、argcです。従って、argv[0]を見つけるためには、もう一度逆参照する必要があります。

mov  esi, [ebp]  ; [esi] == ebp1 
mov  ebx, [esi + 12] ; [esi+12] = [ebp1+12] = argv 
push dword [ebx]  ; [ebx] = argv[0] 
     ;^^^^^^^^^^^ 
push fmt 
call printf 
+0

あなたは素晴らしいです!!!!! – csTroubled