Seite 1 von 1

Float Zahlen mit printf ausgeben

Verfasst: 15. Nov 2011 15:53
von mike
Hi,

hier ein Tipp wie Ihr float Zahlen mit printf ausgeben könnt:

Code: Alles auswählen

.data
ausgabe: .string "Der Ergebnisvektor enthaelt folgenden Werte: %f %f %f\n"
vek: .float 4.0, 3.0, 2.0, 1.0

.text

.globl main
main:
	leal vek, %esi	#Lade Addresse von vek in %esi
	fld 8(%esi)		#Pushe Wert von %esi an Stelle 8 in das ST(0) Register der FPU
	subl $8, %esp	#Erstelle 8Byte freien Speicher auf Stack
	fstpl (%esp)	#Pope Wert von ST(0) in den Wert, der von (%esp) dargetellt wird. Hierbei wird der Wert auf im Speicher geändert.
				#Zu beachten: %esp ist der Stack, also wird die Zahl als 8Byte Variable auf den Stack gepusht.

	fld 4(%esi)
	subl $8, %esp
	fstpl (%esp)

	fld 0(%esi)
	subl $8, %esp
	fstpl (%esp)

	pushl $ausgabe
	call printf	

.exit:
	movl $1, %eax
	int $0x80
Damit wird die Zahl in ST0 geladen, dann werden 8Byte auf dem Stack bereitgestellt und mit fstpl wird an der aktuellen Addresse des Stacks die float als 8Byte Variante, also als double in den Stack geladen.


Gruß
Mike

Re: Float Zahlen mit printf ausgeben

Verfasst: 15. Nov 2011 17:36
von majias
Ok, hat sich erledigt =)
Danke für die Info.

Re: Float Zahlen mit printf ausgeben

Verfasst: 16. Nov 2011 13:32
von Thomas Huxhorn
So macht es auch der Compiler:

Code: Alles auswählen

void func(void) {
extern float a;
printf("%f", a);
}


	.file	"test.c"
	.section	.rodata
.LC0:
	.string	"%f"
	.text
.globl func
	.type	func, @function
func:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp         # 24b auf dem Stack bestellen. 8b fuer die Variable a und 16b fuer den String "%f"
	flds	a                       # Variable a nach st0 laden
	fstpl	4(%esp)             # Varibale a auf den Stack legen. Warum 4?
	movl	$.LC0, (%esp)    # String "%f" auf den Stack hauen. 
	call	printf
	leave
	ret
	.size	func, .-func
	.ident	"GCC: (Debian 4.3.2-1.1) 4.3.2"
	.section	.note.GNU-stack,"",@progbits

Re: Float Zahlen mit printf ausgeben

Verfasst: 22. Nov 2011 13:10
von femu
Vielen Dank!
Das hat mir viel Nerven gespart.