[FASM] + DLL | Wyświetlenie liczby zmiennoprzecinkowej w funkcji printf biblioteki msvcrt.dll

0

Witam, mam drobny problem z wyświetlaniem liczby w fasm'ie przy pomocy funkcji printf.
Liczby całkowite wyświetla normalnie, natomiast liczby zmiennoprzecinkowe już wyświetla źle.
Nie wiem co zrobić, aby wyświetlić taką liczbę. Proszę o jakąś pomoc.

Pozdrawiam.

Poniżej wklejam kod programu. Nie zwracajcie uwagi na całą resztę tylko głównie na wywołanie funkcji printf i zmienną która ma być wyświetlona, tj. taa dd 6.4.

format PE console 4.0

entry start
include 'win32a.inc'



;#########################################################################
section '.text' code readable executable
start:

        cinvoke printf, text2, [taa]


        cinvoke printf, text8
        cinvoke getchar
        invoke  ExitProcess,0



;#########################################################################
section '.data' data readable writeable

        taa   dd 6.4
        text2 db 10,13,'Wynik mnozenia wynosi: %f',10,13,0
        text8 db 10,13,'Nacisnij enter, aby zakonczyc program...',0
        ent   db 10,13,0



;#########################################################################
section '.idata' import data readable writeable

library kernel32,'KERNEL32.DLL',\
        msvcrt,'MSVCRT.DLL',\
        TestDLL,'TestDLL.DLL',\
        user32,'user32.DLL'


import  user32,\
        MessageBoxA,'MessageBoxA'

import  kernel32,\
        ExitProcess,'ExitProcess'

import  msvcrt,\
        getchar,'getchar',\
        printf,'printf',\
        scanf,'scanf'

import  TestDLL,\
        dllOK,'dllOK',\
        mnozenie,'mnozenie'
0

A co mówi debuger?

0

Na początku powiem tylko, że z assemblerem zapoznałem się na poprzednim semestrze na studiach i nie jestem w nim zbyt dobrze obeznany.

Do debugowania używam ollydbg, ale niestety kiedy aplikacja przeskakuje do funkcji printf to tracę rozeznanie (zbyt dużo instrukcji) i nie wiem co tam się dzieje.

Gdybyś mi napisał na co mam zwrócić uwagę podczas debugowania?

Edit:
Zapomniałem jeszcze dodać screena, jak wygląda wynik:

0

5 sek w google mówi że zarówno %f jak i %lf oba oczekują 8 bajtowych zmiennych więc dq a nie dd

0

Tylko chodzi o to, że makro cinvoke wrzuca na stos przekazywane argumenty, czyli nie przepuści 8 bajtowej zmiennej w 32-bitowej aplikacji.
Przy kompilowaniu wyrzuca błąd o niepoprawnym rozmiarze argumentu.

0

To zrób oszustwo, przekaż 2 argumenty, dolną połowkę i górną połowkę tej zmiennej ;] Zrób tam coś w stylu

taa   dq 6.4

//
cinvoke printf, text2, dword [taa], dword [taa+4]
0

Ale dd jest przecież 4 bajtowy. Dopiero dq jest 8 bajtowe.

I nie wiem właśnie czy problem leży po stronie funkcji printf, czy po mojej stronie dlatego, że źle ją wywołuję.

0

Tak jak pokazałeś niestety nie działa, ale działa w taki sposób:

Dziękuję bardzo za pomoc i pozdrawiam :)

start:
        finit
        fld dword [taa]
        fstp qword [tab]

        cinvoke printf, text2, [tab], [tab+4]

koniec:
        cinvoke printf, text8
        cinvoke getchar
        invoke  ExitProcess,0



;#########################################################################
section '.data' data readable writeable

        taa dq 22.587
        tab dd 2 dup (?)
        text2 db 10,13,'Wynik mnozenia wynosi: %f',10,13,0
        text8 db 10,13,'Nacisnij enter, aby zakonczyc program...',0
        ent db 10,13,0 
0

Jak tak zrobiłeś to taa powinno chyba jednak być dd

0

Tak, tak, zapomniałem zmienić z powrotem.

Poprawny kod, przed chwilą kompilowany:

start:
        finit
        fld dword [taa]
        fstp qword [tab]

        cinvoke printf, text2, [tab], [tab+4]

koniec:
        cinvoke printf, text8
        cinvoke getchar
        invoke  ExitProcess,0



;#########################################################################
section '.data' data readable writeable

        taa dd 22.587
        tab dd 2 dup (?)
        text2 db 10,13,'Wynik mnozenia wynosi: %f',10,13,0
        text8 db 10,13,'Nacisnij enter, aby zakonczyc program...',0
        ent db 10,13,0 

1 użytkowników online, w tym zalogowanych: 0, gości: 1