code will keine floats

15/02/2012 - 12:23 von Jens Kallup | Report spam
Hallo,

warum bekomme ich bei __set_value immer nur 0 auf der Console?
Für Tipps dankbar
Jens

BITS 32

segment .code
global _start_
_start_:
push ebp
mov ebp, esp
sub esp, 512

fld qword [_LC0]
fld qword [_LC1]
fld qword [_LC2]
fadd
fmul

fld qword [_LC2]
fstp qword [ebx]
push dword [ebx+4]
push dword [ebx]
call ___set_value

fld qword [_LC0]
fstp qword [ebx]
push dword [ebx+4]
push dword [ebx]
call ___set_value

add esp, 512
L2:
leave
ret


segment .data

_LC0: dq 2
_LC1: dq 3
_LC2: dq 4

_LC3: dq 2
_LC4: dq 2

_LCab: dq 1
_LCax: dq 0

extern ___set_value

-
#include <stdio.h>

extern void start_(void);

double dval;

void __set_value(double pvar)
{
printf("%f",pvar);
dval = pvar;
}

int main(void)
{
__set_value(2.32);

printf("--> %f",dval);
start_();
return 0;
}
 

Lesen sie die antworten

#1 Stefan Reuther
15/02/2012 - 18:24 | Warnen spam
Jens Kallup wrote:
segment .code


[...]
fld qword [_LC2]
fstp qword [ebx]
push dword [ebx+4]
push dword [ebx]



Wo kommt hier eigentlich der Wert von ebx her? Bei mir crasht das in der
Form, wenn ich ebp nicht vorher einen Wert gebe (z.B. 'mov ebp, esp').

segment .data

_LC0: dq 2
_LC1: dq 3
_LC2: dq 4



In den mir bekannten Assemblern legt 'dq' einen 64-bit-Integer an. Das
Bitmuster 0x0000000000000002 ist halt als double-precision floating
point eine ziemlich kleine Zahl. Wenn du in __set_value den Formatstring
nach "%e" ànderst, siehst du das auch: 1.976263e-323.

Entsprechend bekommst du, wenn du ein anderes Bitmuster da ablegst, auch
eine anstàndige Float-Zahl. 0x4000000000000000 gibt z.B. 2.0.


Stefan

Ähnliche fragen