ассемблер 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
