尝试打印十进制数时的程序集“分段错误”

问题描述 投票:1回答:1

我正在尝试创建一个将为我打印十进制数的宏。我的想法是将数字除以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

任何帮助表示赞赏,提前谢谢!

linux assembly x86 nasm x86-64
1个回答
2
投票

第一个错误:

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中的指针,而不是数字。有几种方法可以解决这个问题。我把它留给你的想象力。

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