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?如何解决? 我感觉以前的值正在影响它,但我真的不知道如何修复它。
我想打印数组中的所有元素..
我想说问题在于如何将元素打印到标准输出。当您使用
syscall
指令写入标准输出(通常是控制台)时,您将传递要打印的字符串的地址。在您的例子中,您传递的是 rcx 的地址,其中包含要打印的数字的 ASCII 值,而不是 DECIMAL。
但是,数字的 ASCII 值与实际的十进制值并不相同。例如:
希望这有帮助!