Как напечатать число с плавающей запятой в сборке без функции библиотеки, я пробовал это, но оно не работало для больших чисел, и я не знаю, это правильный путь или нет.
код:
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
Спасибо.