Unterschied zwischen FSTP und FST ?? --- Stack oder statische Variabeln??

20/07/2008 - 19:45 von Jens Kallup | Report spam
Hallo,

habe ein wenig experimentiert ...
FSTP und FST scheinen die gleichen Funktionen zu haben?
Bekomme, egal ob ich nun die eine oder andere menomic einsetze,
das gleiche Ergebnis.

Bin nun soweit gekommen, daß ich für jede Rechenoperation, eine
eigene Variable benötige.
Zuerst habe ich den EvalString in einer 1. Initphase durchlaufen
lassen und dabei die Nummern bzw. rechenoperatoren gezàhlt, und
in einer 2. Outputphase den code geschrieben.
Der unten stehende Code ist dabei rausgekommen

; SetExpr('(5+2+2+2)*2*2');
-%<--
BITS 32
cpu 486

extern _printf, _test_wert

section .data
a: dq 1.0
b: dq 1.0
c: dq 1.0
d: dq 1.0
e: dq 1.0
f: dq 1.0

section .text
extern Fix2Gleit, Ausgabe
global _main
_main:
push ebp
mov ebp, esp
sub esp, 32
; a = 5.0
mov edx, 5 ; Vorkomma
mov eax, 0 ; Nachkomma
mov ebx, a
call Fix2Gleit
fld qword [a]
; a = 2.0
mov edx, 2 ; Vorkomma
mov eax, 0 ; Nachkomma
mov ebx, b
call Fix2Gleit
fld qword [b]
;AA
fadd qword [a]
fst qword [b]
call Ausgabe
; a = 2.0
mov edx, 2 ; Vorkomma
mov eax, 0 ; Nachkomma
mov ebx, c
call Fix2Gleit
fld qword [c]

fadd qword [b]
fst qword [c]
call Ausgabe
; a = 2.0
mov edx, 2 ; Vorkomma
mov eax, 0 ; Nachkomma
mov ebx, d
call Fix2Gleit
fld qword [d]

fadd qword [c]
fst qword [d]
call Ausgabe
; a = 2.0
mov edx, 2 ; Vorkomma
mov eax, 0 ; Nachkomma
mov ebx, e
call Fix2Gleit
fld qword [e]

fmul qword [d]
fst qword [e]
call Ausgabe
; a = 2.0
mov edx, 2 ; Vorkomma
mov eax, 0 ; Nachkomma
mov ebx, f
call Fix2Gleit
fld qword [f]

fmul qword [e]
fst qword [f]
call Ausgabe
leave
ret

%



So nun zur Frage:
ist es besser, 2 Phasen zu durchlaufen und dabei die benötigten
Variablen in die OutputDatei zu schreiben oder 1ne Phase unter
Einbeziehung eines Stacks zu realisieren?
Also so:

add esp, 0FFFFFFE8h
mov [ebp-4 ], 3F8CCCCDh ; float
mov [ebp-8 ], 400CCCCDh ; float
mov [ebp-16], 66666666h ; double
mov [ebp-12], 400A6666h ; double
...

Im Prinzip müsste das doch das selbe sein, nur ist das blöd, das
mit der Anweisung "var: dq 1.0" Leerraum im Objektfile geschaffen
wird. Mit der Stack dingends (siehe oben) wird im Speicher Platz
reserviert.

Grüße
Jens
 

Lesen sie die antworten

#1 Hubert Seidel
20/07/2008 - 23:22 | Warnen spam
Hallo Jens,

"Jens Kallup" schrieb im Newsbeitrag
news:488379a7$0$25952$
habe ein wenig experimentiert ...
FSTP und FST scheinen die gleichen Funktionen zu haben?



Es gibt einen kleinen Unterschied. Den merkst Du dann, wenn Du mehrere
Berechnungen mit Deinem Programm durchführst (ggf. auch bei
komplizierteren).

Bekomme, egal ob ich nun die eine oder andere menomic einsetze,
das gleiche Ergebnis.



Ja, das Ergebnis ist gleich, solange Du a) nur ein Ergebnis
aus der FPU erwartest, b) Du nicht mehr als 8
Register in die FPU gepushed hast.

Warum?
HHierzu habe ich folgendes aus der Doku entnommen:

FST -> Floating-Point Store Stack Top
FSTP -> Floating-Point Store Stack Top and Pop

D.h. mit FSTP hast Du das gelesene Register der FPU entnommen.
Bei FST bleibt es auf dem Stack für weitere Berechnungen.
Schon mal versucht 9 FLD's hintereinander auszuführen?

z.b. so etwas???

const
v1:extended = 1.1;
v2:extended = 1.2;
v3:extended = 1.3;
v4:extended = 1.4;
v5:extended = 1.5;
v6:extended = 1.6;
v7:extended = 1.7;
v8:extended = 1.8;
v9:extended = 1.9;

var
x:extended;

procedure Test;
asm
fld v1
fld v2
fld v3
fld v4
fld v5
fld v6
fld v7
fld v8
fld v9
//???????
fstp x
fstp x
fstp x
fstp x
fstp x
fstp x
fstp x
fstp x
fstp x
end;

Es sollte eine Exception geworfen werden
Ein fstp x und fld v9 weniger, schon klappt es.
Warum? Die FPU hat exakt 8 Register.

mfg.
Herby

http://www.hubert-seidel.de

Ähnliche fragen