Werte-Parameter falsch übergeben??

21/06/2008 - 12:56 von Jens Kallup | Report spam
Hallo,

habe eine C-Funktion:

float wert;
float set_wert(float a)
{
printf("<-> %f",a);
wert = a;
return (wert);
}

und eine Assembler-Funktion, leider funktioniert
die Übergabe an "set_wert" nicht ..
Ergebnis = 0.00
Aber das push TestString -> printf funktioniert.
Woran kann das liegen?

Danke für Infos
Jens

// 3 div 4 = 0.75 ...

.text
TestString: .string "-> %f\0"

.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp // 3*8 Bytes auf dem Stack reservieren
movl $0x0, -24(%ebp)
movl $0x40080000, -20(%ebp)
movl $0x0, -16(%ebp)
movl $0x40100000, -12(%ebp)
fldl -24(%ebp)
fdivl -16(%ebp)
fstpl -8(%ebp)
movl -8(%ebp), %eax
movl -4(%ebp), %ebx
pushl %ebx
pushl %eax
pushl $TestString // _set_wert = 0.00???
call _printf

popl %eax
popl %eax

leave
ret
 

Lesen sie die antworten

#1 Markus Wichmann
22/06/2008 - 10:08 | Warnen spam
Jens Kallup schrieb:
Hallo,

habe eine C-Funktion:

float wert;
float set_wert(float a)
{
printf("<-> %f",a);
wert = a;
return (wert);
}

und eine Assembler-Funktion, leider funktioniert
die Übergabe an "set_wert" nicht ..
Ergebnis = 0.00
Aber das push TestString -> printf funktioniert.
Woran kann das liegen?




Eine Lösung habe ich nicht für dich, aber ein paar Stilfragen:

Danke für Infos
Jens

// 3 div 4 = 0.75 ...

.text
TestString: .string "-> %f\0"




Wieso packst du den nicht nach .data oder .rodata?

.globl _main



Welches Betriebssystem? Unterstriche vor den Namen erinnert mich an
Windows, aber das kann tàuschen, jedenfalls verwendest du kein Linux
mit ELF. Wenn du aber doch Linux verwendest, kannst du eine Menge
Platz sparen, indem du _start statt main verwendest. Du musst dann
allerdings auch mit dem richtigen Exit-Code beenden, nicht einfach mit
ret, sondern mit:

xor eax, eax
inc eax
xor ebx, ebx
int 80h

_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp // 3*8 Bytes auf dem Stack reservieren



Warum nicht enter? Mit der Gas-Syntax kenne ich mich nicht aus, aber
der Code wird wohl

enterl $0, $24

sein. (Ein l an alles dranhàngen, was 32 Bit breit ist und die
Operanden vertauschen, oder?)

movl $0x0, -24(%ebp)
movl $0x40080000, -20(%ebp)
movl $0x0, -16(%ebp)
movl $0x40100000, -12(%ebp)
fldl -24(%ebp)
fdivl -16(%ebp)
fstpl -8(%ebp)
movl -8(%ebp), %eax
movl -4(%ebp), %ebx
pushl %ebx
pushl %eax
pushl $TestString // _set_wert = 0.00???
call _printf

popl %eax
popl %eax




addl $12, %esp

ràumt den Stack richtig auf (da liegen 12 Bytes Argumente für printf,
nicht bloß 8)

leave
ret





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

Ähnliche fragen