Как напечатать числа с плавающей точкой в ​​сборке без библиотеки c? - PullRequest
0 голосов
/ 22 апреля 2020

Как напечатать число с плавающей запятой в сборке без функции библиотеки, я пробовал это, но оно не работало для больших чисел, и я не знаю, это правильный путь или нет.

код:

    global print_float64
section .text
    print_float64:

        mov             r9              ,        0
        mov             r8              ,        0

        pxor            xmm1            ,        xmm1
        ucomisd         xmm0            ,        xmm1
        jnbe            .positive
        mov             r9              ,        1
        lea             rsi             ,        [rsp-8]
        mov        qword[rsi]           ,        -1
        cvtsi2sd        xmm1            ,        [rsi]
        mulsd           xmm0            ,        xmm1
    .positive:

        xor             rax             ,       rax
        cvttsd2si       eax             ,       xmm0
        mov             rdi             ,       10
        mov             rsi             ,       rsp
        dec             rsi             
        mov         byte[rsi]           ,       '.'
    .while1:
        xor             rdx             ,       rdx
        div             rdi
        add             rdx             ,       48
        dec             rsi 
        mov             [rsi]           ,       dl
        cmp             rax             ,       0
        jnbe            .while1

        cmp             r9              ,       1
        jne             .print
        dec             rsi
        mov         byte[rsi]           ,      '-'
    .print:
        mov             rax             ,       1
        mov             rdi             ,       1
        mov             rdx             ,       rsp
        sub             rdx             ,       rsi
        syscall

        mov             rax             ,       rsp
        sub             rax             ,       rsi
        add             r8              ,       rax

;------------------------------------------------------------------------------------------

        xor             rax             ,       rax
        cvttsd2si       eax             ,       xmm0
        cvtsi2sd        xmm1            ,       eax
        subsd           xmm0            ,       xmm1

        mov             rax             ,       100000
        cvtsi2sd        xmm1            ,       eax
        mulsd           xmm0            ,       xmm1
        xor             rax             ,       rax
        cvtsd2si        eax             ,       xmm0

        mov             rdi             ,       10
        mov             rsi             ,       rsp
    .while2:
        xor             rdx             ,       rdx
        div             rdi
        add             rdx             ,       48
        dec             rsi 
        mov             [rsi]           ,       dl
        cmp             rax             ,       0
        jnbe            .while2

        mov             rax             ,       1
        mov             rdi             ,       1
        mov             rdx             ,       rsp
        sub             rdx             ,       rsi
        syscall

        mov             rax             ,       rsp
        sub             rax             ,       rsi
        add             rax             ,       r8

        ret

logi c для этого кода он сначала печатает число перед точной точкой с помощью целочисленного преобразования, и печатает 5 цифр после точной точки путем умножения на 100000, а затем снова преобразует в целое число и печатает. это может работать для большего числа, если я конвертирую 64-битное число с плавающей точкой в ​​64-битное целое число (rax), но я не нашел инструкции для этого

1) Каков наилучший способ напечатать число с плавающей запятой в сборке без библиотечной функции.

Я использую Nasm с Ubuntu 64

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...