ассемблер masm64 как вывести на консоль переменную с плавающей точкой при помощи функции printf

;===подключаем библиотеки
;библиотека содержит функции WinApi
includelib kernel32.lib
;подключаем библиотеку C
includelib msvcrt.lib
;для совместимости старых функций C
includelib ucrt.lib
;для старых функций ввода-вывода
includelib legacy_stdio_definitions.lib

;===подключаем функции
extern ExitProcess: proc
extern getchar: proc
extern printf: proc
extern SetConsoleOutputCP: proc

.data
;13 0dh или \r - перевод каретки
;10 0ah или \n - перевод строки
;0  0h  или \0 - нулевой байт
msg byte "%lf", 0dh, 0ah, 0h
x real8 -15.123456789

.code
main proc

;без UTF-8 не выводит ничего
mov rcx, 65001 
call SetConsoleOutputCP

sub rsp, 20h

movsd xmm1, x ;2 аргумент с плавающей запятой
lea rcx, msg  ;1 целочисленный аргумент
call printf

add rsp, 20h

call getchar

xor rcx, rcx
call ExitProcess

ret
main endp

end

0.000000

Как вывести на консоль переменную с плавающей точкой при помощи функции printf? Код приведен полный, в ответе 0.000000. Кто сталкивался с такой проблемой, подскажите.


Ответы (2 шт):

Автор решения: PRODIGY

Как вывести на консоль переменную с плавающей точкой при помощи функции printf?

Чтобы не следить за регистрами, вместо call лучше использовать invoke, тогда компилятор сам раскидает аргументы как надо. Вот пример на fasm'e:

 format   pe64 console
 include 'win64ax.inc'
 entry    start
;//----------
 .data
 x       dq      -15.123456789
;//----------
 section '.code' code readable executable
 start:  push     rbp
         cinvoke  printf,<10,' Value: %0.9f',0>,float [x]
         cinvoke  getch
         cinvoke  exit,0
;//----------
section '.idata' import data readable
library  msvcrt,'msvcrt.dll'
import   msvcrt, printf,'printf', getch,'_getch', exit,'exit'

введите сюда описание изображения

→ Ссылка
Автор решения: Sergey

Теперь все правильно работает, спасибо всем, кто откликнулся!

;===подключаем библиотеки
;библиотека содержит функции WinApi
includelib kernel32.lib
;подключаем библиотеку C
includelib msvcrt.lib
;для совместимости старых функций C
includelib ucrt.lib
;для старых функций ввода-вывода
includelib legacy_stdio_definitions.lib

;===подключаем функции
extern ExitProcess: proc
extern getchar: proc
extern printf: proc
extern SetConsoleOutputCP: proc

.data
;13 0dh или \r - перевод каретки
;10 0ah или \n - перевод строки
;0  0h  или \0 - нулевой байт
msg byte "%lf", 0dh, 0ah, 0h

;x real8 -15.123456789
x dq -15.123456789

.code
main proc

;prologue allocate shadow space and alignment (32+8)=40=28h
sub rsp, 28h

movq xmm1, qword ptr [x]
movq rdx, xmm1  
lea rcx, msg
call printf

;epilogue
add rsp, 28h

call getchar

xor rcx, rcx
call ExitProcess

ret
main endp

end

-15.123457

→ Ссылка