在x86-64中,如何打印数组的所有元素?

问题描述 投票:0回答:1
section .data
    numbers db 240, 40, 80, 90, 30, 40

section .bss
    digit resw 1

%macro printNumber 1
    mov eax, %1
    
    %%printInt:
        mov rcx, digit      ;set rcx to digit memory address
        mov rbx, 10         ; moving a newline into rbx
        mov [rcx], rbx      ; setting digit to rbx
        inc rcx             ; increment rcx position by one byte

    %%storeLoop:
        xor rdx, rdx        ; zero out rdx
        mov rbx, 10         
        div rbx             ; rax / rbx (10)

                            ; rdx holds the remainder of the divison
        add dl, 48          ; add 48 to rdx to make in ascii character
                            
        mov [rcx], dl       ; get the character part of rdx
        inc rcx             ; increment digit position again

        cmp rax, 0
        jnz %%storeLoop       ; continue looping until rax is 0

    %%printLoop:
        push rcx

        ;perform sys write
        mov rax, 1 
        mov rdi, 1
        mov rsi, rcx
        mov rdx, 1
        syscall

        pop rcx
        dec rcx
        cmp rcx, digit      ; first byte of digit (10)
        jge %%printLoop

%endmacro

section .text
    global _start

    _start:
        mov esi,numbers
    
        
        ;movzx r8d, byte [esi]
        ;printNumber r8d           ; -> mov eax, r8d
        ;movzx r8d, byte[esi+1]
        ;printNumber r8d
        ;movzx r8d, byte[esi+2]
        ;printNumber r8d
     

我想打印数组“numbers”中的所有元素,但是当我启动代码时,结果不是 240,40,80 而是 240,48,52。 为什么结果是 48 和 52?如何解决? 我感觉以前的值正在影响它,但我真的不知道如何修复它。

我想打印数组中的所有元素..

assembly x86-64
1个回答
0
投票

我想说问题在于如何将元素打印到标准输出。当您使用

syscall
指令写入标准输出(通常是控制台)时,您将传递要打印的字符串的地址。在您的例子中,您传递的是 rcx 的地址,其中包含要打印的数字的 ASCII 值,而不是 DECIMAL。

但是,数字的 ASCII 值与实际的十进制值并不相同。例如:

  • “0”的 ASCII 值为 48。
  • “1”的 ASCII 值为 49。
  • “2”的 ASCII 值为 50。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.