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

数字1被定义为字节,但将被视为四字(mov rax, %1)。把它改成
number1 dq 123

第二个错误:
printInt number1

宏将参数获取为字符串。因此,mov rax, %1将被解为mov rax, number1。在NASM中,RAX将得到number1的地址,而不是值。把它改成
printInt [number1]

第三个错误:
div rax

意思是:将rdx:rax除以rax,结果存储在rax中,剩余部分存储在rdx中。这将始终导致rax=1和rdx=0。使用另一个值为10的寄存器。
第四个错误:
pop rsi

内核的syscall/rax=1例程需要rsi中的指针,而不是数字。有几种方法可以解决这个问题。我留给你想象。

关于linux - 尝试打印十进制数时的 assembly “分段故障”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52255633/

10-11 16:34
查看更多