FASM und float's ausgeben??

05/10/2009 - 17:33 von Jens Kallup | Report spam
Hallo,

im folgenden habe ich AssemblerCode, der sich problemlos
unter/mit FASM übersetzen làsst.
Mich erstaunt, das die EXE max. 2048 Byte groß ist.
Aber nun zum Problem:
Wie kann ich "float's" auf der Console ausgeben - das label
hello_msg làsst sich ja auch problemlos ausgeben ...
Ich schàtze mal das was mit den pushes nicht stimmt?
Für Infos/Fidbàck bin ich sehr dankbar

Euer
Jens


format PE console
entry start

include 'i:\Projekte\kmice\asm\include\win32a.inc'

section '.code' code readable executable
start:
push ebp
mov ebp, esp

fld qword [LC0]
fld qword [LC1]
faddp
fst qword [_var1]
fld qword [LC2]
fld qword [_var1]
faddp
fst qword [_var2]

push _var2
push _var1
ccall [printf], user_str

ccall [printf], hello_msg
ccall [getchar]
stdcall [ExitProcess],0

leave
ret

section '.data' data readable writeable
hello_msg db 'Hello, world!',0
LC0: dq 2.1000
LC1: dq 3.0500
LC2: dq 2.5000
_var1: dq 0.0
_var2: dq 0.0
user_str: db "--> %f, %f",10,0


section '.idata' import data readable

library kernel,'kernel32.dll',\
msvcrt,'msvcrt.dll'

import kernel,\
ExitProcess,'ExitProcess'

import msvcrt,\
printf,'printf',\
getchar,'_fgetchar'
 

Lesen sie die antworten

#1 Markus Wichmann
05/10/2009 - 22:14 | Warnen spam
Jens Kallup () schrieb:
Hallo,

im folgenden habe ich AssemblerCode, der sich problemlos
unter/mit FASM übersetzen làsst.
Mich erstaunt, das die EXE max. 2048 Byte groß ist.



Mich auch, schließlich hàtte ich erwartet, dass die Sektionen
4096-Byte-aligned sind, und du hast immerhin drei davon.

Aber nun zum Problem:
Wie kann ich "float's" auf der Console ausgeben - das label
hello_msg làsst sich ja auch problemlos ausgeben ...
Ich schàtze mal das was mit den pushes nicht stimmt?
Für Infos/Fidbàck bin ich sehr dankbar

Euer
Jens


format PE console
entry start




Beides Aufgabe des Linkers.

include 'i:\Projekte\kmice\asm\include\win32a.inc'

section '.code' code readable executable
start:
push ebp
mov ebp, esp

fld qword [LC0]
fld qword [LC1]
faddp
fst qword [_var1]
fld qword [LC2]
fld qword [_var1]
faddp
fst qword [_var2]

push _var2
push _var1
ccall [printf], user_str





Hier pushst du zwei Pointer (jeweils ein dword groß), solltest aber
gemàß Format-String zwei double-Werte pushen (jeweils ein qword groß).
Wenn du glück hast, gibt das hier Quark aus, hast du Pech, gibt es einen
Speicherzugriffsfehler.

Richtig geht es mit

push dword [_var2]
push dword [_var2+4]
push dword [_var1]
push dword [_var1+4]
push user_str
call printf
add esp, 5*4

ccall [printf], hello_msg
ccall [getchar]
stdcall [ExitProcess],0




verstehe, ccall und stdcall sind also Makros für Faule.

leave
ret

section '.data' data readable writeable
hello_msg db 'Hello, world!',0
LC0: dq 2.1000
LC1: dq 3.0500
LC2: dq 2.5000
_var1: dq 0.0
_var2: dq 0.0
user_str: db "--> %f, %f",10,0




Bei Windows sollte ein Zeilenumbruch doch immer "13,10" sein, oder?
(CRLF)

section '.idata' import data readable

library kernel,'kernel32.dll',\
msvcrt,'msvcrt.dll'

import kernel,\
ExitProcess,'ExitProcess'

import msvcrt,\
printf,'printf',\
getchar,'_fgetchar'



Die letzte Sektion macht bei mir der Linker. Der Assembler weiß bei mir
nur, welche Symbole außerhalb seiner Zustàndigkeit liegen.

Tschö,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.

Ähnliche fragen