我正在尝试创建一个将为我打印十进制数的宏。我的想法是将数字除以10,将余数转换为ASCII并将其推入堆栈直到比率为0.然后逐个打印数字但由于某种原因我得到“分段错误”。
我使用的是Linux,nasm和x86_64处理器。
%macro printInt 1
mov rax, %1
mov rbx, 0
%%loop1: ;Convert all digits to ascii
inc rbx ;Count of the digits in number
mov rdx, 0
div rax
add rdx, 48 ;Convert remainder to ascii
push rdx ;Push remainder into stack
cmp rax, 0 ;Compare ratio to 0
jne %%loop1
%%loop2: ;Print the number digit by digit
dec rbx
mov rax, 1 ;Sys_Write
mov rdi, 1 ;STDOUT
pop rsi ;Pop digit
mov rdx, 1
syscall
cmp rbx, 0
jne %%loop2
%endmacro
section .data
number1 db 123
section .text
global _start
_start:
printInt number1
mov rax, 60
mov rdi, 0
syscall
任何帮助表示赞赏,提前谢谢!
第一个错误:
number1 db 123
number1定义为BYTE,但将被视为QUADWORD(mov rax, %1
)。将其更改为
number1 dq 123
第二个错误:
printInt number1
宏将参数作为字符串。所以,mov rax, %1
将被解决为mov rax, number1
。在NASM中,RAX
将获得number1
的地址,而不是价值。将其更改为
printInt [number1]
第三个错误:
div rax
表示:通过RAX划分RDX:RAX,将结果存储在RAX中,将余数存储在RDX中。这将始终导致RAX = 1且RDX = 0。使用值为10的另一个寄存器。
第四个错误:
pop rsi
内核的SYSCALL / RAX = 1例程需要RSI中的指针,而不是数字。有几种方法可以解决这个问题。我把它留给你的想象力。