-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
4

2 回答 2

2
  1. 显然你想将两个参数传递给 printf。然后你必须同时推动它们(你似乎认为其中一个是在 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 回答