2013-01-11 49 views
-1

我已經在nasm程序集中編寫了以下代碼,用於在scree上打印數組元素。在此代碼中沒有編譯錯誤,但我在屏幕上獲取了垃圾值。使用匯編語言打印數組元素

section .data 
num1: dd 10, 20, 30, 40, 50, 10, 20, 30, 40, 50,300 
total: dd 0 
msg : dd "Value=%d",10,0 

    section .text 
     extern _printf 
     global _main 
    _main: 
     push ebp 
     mov ebp,esp 
     mov ebx,num1 ;point bx to first number 
     mov ecx,11  ;load count of numbers in ecx 
     mov eax,0  
    loop: 
     mov eax,[ebx] 

     push msg 
     call _printf 



     add ebx,4 
     sub ecx,1 
     jnz loop 

     mov esp,ebp 
     pop ebp 

     ret 

解決方案

section .data 
num1: dd 10, 20, 30, 40, 50, 10, 20, 30, 40, 50,300 
total: dd 0 
msg : dd "Value=%d",10,0 

    section .text 
     extern _printf 
     global _main 
    _main: 
     push ebp 
     mov ebp,esp 
    mov eax,10 
     mov ebx,num1 ;point bx to first number 
     mov ecx,0 ;load 0 

    loop: 

    ;store the value because external function like printf modify the value 
    push ebx 
    push eax 
    push ecx 

     push DWORD [ebx] 

     push msg 
     call _printf 
    add esp,8 

    ;restore thses values 
    pop ecx 
    pop eax 
    pop ebx 
    inc ecx 
    add ebx,4 
    cmp ecx,eax 
    jne loop 



     mov esp,ebp 
     pop ebp 

     ret 

回答

0

我必須弄明白我problem.So我張貼在這裏的其他人

section .data 
num1: dd 10, 20, 30, 40, 50, 10, 20, 30, 40, 50,300 
total: dd 0 
msg : dd "Value=%d",10,0 

    section .text 
     extern _printf 
     global _main 
    _main: 
     push ebp 
     mov ebp,esp 
    mov eax,10 
     mov ebx,num1 ;point bx to first number 
     mov ecx,0 ;load 0 

    loop: 

    ;store the value because external function like printf modify the value 
    push ebx 
    push eax 
    push ecx 

     push DWORD [ebx] 

     push msg 
     call _printf 
    add esp,8 

    ;restore thses values 
    pop ecx 
    pop eax 
    pop ebx 
    inc ecx 
    add ebx,4 
    cmp ecx,eax 
    jne loop 



     mov esp,ebp 
     pop ebp 

     ret 
的解決方案
2
  1. 顯然要設置兩個參數傳遞給printf的。然後你必須將它們都推送(你似乎認爲其中一個是通過EAX傳遞的,但事實並非如此)。 (你現在沒有使用其他調用者保存的寄存器,但是現在是時候閱讀更多關於X86調用約定的知識)。C函數可以自由地打開ECX,所以你應該保存和恢復它。