在 Assembly x86 中打印数组

Print array in Asembly x86

我在堆栈中加载了元素,我需要将它们移动到数组中。我的代码如下所示:

%include "asm_io.inc"

segment .data
    array db 100 dup(0)
    length db 0
    
segment .text
    global  _asm_main
    extern getchar

_asm_main:
    enter    0, 0
    pusha

    call getchar
char_loop:
    mov ebx,10
    sub eax, '0'
    mul ebx
    mov ebx, eax
    call getchar
    sub eax, '0'
    add eax, ebx
    push eax
    inc BYTE[length]
    call getchar
    cmp eax, 10
    je fill_array
    cmp eax, 13
    je fill_array
    cmp eax, 32
    je skip_spaces
    jmp char_loop
skip_spaces:
    call getchar
    cmp eax, 32
    je skip_spaces
    jmp char_loop

fill_array:
    mov ecx, [length]
    mov ebx, array
l1:
    pop eax
    mov [ebx], eax ; should be al instead of eax
    inc ebx
    call print_int
    call print_nl
    loop l1
print_array:
    mov ecx, [length]
    mov ebx, array
l2:
    mov eax, [ebx] ; should be al instead of eax
    call print_int
    call print_nl
    inc ebx
    loop l2

_asm_end:
    call print_nl
    popa
    mov eax, 0
    leave
    ret 

print_int 在 asm_io.asm 中是

print_int:
        enter   0,0
        pusha
        pushf

        push    eax
        push    dword int_format
        call    _printf
        pop     ecx
        pop     ecx

        popf
        popa
        leave
        ret

其中 int_formatint_format db "%i",0

堆栈中的长度和值是正确的,我打印了它们但是当我尝试打印数组时只有最后一个值是正确的。其他值是随机数。我尝试了不同大小的寄存器组合,但没有用。我认为该错误必须与寄存器大小或数组大小有关。

在这里回答: 正如 @xiver77 在评论中所说,我正在写入数组 4 个字节而不是 1 个字节。数组中的一个元素有 1 个字节,我试图写 4 个字节。这会造成溢出并改变数组中的其他元素。相反 mov [ebx], eax 应该是 mov [ebx], almov eax, [ebx] 打印应该是 mov al [ebx].