-1

scree に配列要素を出力するために、nasm アセンブリに次のコードを記述しました。このコードでは、コンパイル エラーは発生しませんが、画面にガベージ値が表示されます。

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
4

2 に答える 2

2
  1. どうやら、printf に 2 つの引数を渡したいようです。次に、それらの両方をプッシュする必要があります (そのうちの 1 つが EAX で渡されると考えているようですが、そうではありません)。
  2. C 関数は ECX を自由に上書きできるので、それを保存して復元する必要があります (現在、呼び出し側で保存された他のレジスタは使用していませんが、X86 呼び出し規則について詳しく読む時が来ました)。
于 2013-01-11T13:28:26.327 に答える
0

私は自分の問題の解決策を見つけたので、他の人のためにここに投稿しています

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
于 2013-01-13T20:37:32.700 に答える