Fehler in Assembler-Programm (PI Berechnung mit 32-Bit Registern)

Neue Frage »

Auf diesen Beitrag antworten »
Romi Fehler in Assembler-Programm (PI Berechnung mit 32-Bit Registern)

Hallo Forum,
ich möchte mit meinem Assembler-Unterprogramm PI nach Wallis berechnen, also mit der FPU eine Reihe von Multiplikationen und Divisionen durchführen. Pi/2 = (2/1)*(2/3)*(4/3)*(4/5)*(6/5)usw.
Ein Zyklus besteht bei mir aus 2 Multiplikationen und 2 Divisionen.
Das Ergebnis soll in EDX:EAX stehen und von dort mit einer anderen Unterprozedur ausgegeben werden (die funktioniert).
Ich finde einfach meinen Fehler nicht... und meine hiesige dosbox (läuft in einer virtual machine WINXP)gibt mir einen "phase-error between passes", auf einen anderen Rechner wiederum ist es kompilierbar und gibt ein einziges zeichen solange aus, bis die dosbox abstürzt... hat vielleicht jemand eine Idee, was ich nicht bedacht haben könnte?
Oder was ich falsch verstanden habe? Vielen Dank schon einmal im Voraus...
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
DOSSEG
.386
.MODEL SMALL  
.STACK 1024   
.DATA
cwr			DW ?   ; zur Aufnahme des CW-Registers der FPU

.CODE

Berechnung PROC
	
	PUSH    bp
	MOV     bp,sp

	PUSH	ECX
	PUSH	EDI
	PUSH	ESI
	
	XOR EAX,EAX
	XOR	EBX,EBX
	MOV	EAX,2
	MOV	EBX,1
	
	FILD	temp ;2 laden
	
	MOV		CX, 10000 ; Schleifenzählregister laden
	RegRechnung:
		MOV	temp,EAX
		FILD temp
		FMUL	
		
		MOV	temp, EBX
		FILD temp
		FDIV
		
		ADD	EBX,2
		MOV	temp,EAX
		FILD temp
		FMUL	
		
		MOV	temp, EBX
		FILD temp
		FDIV
		
		ADD EAX,2
		LOOP RegRechnung
	MOV	EAX,1000000000
	MOV factor, EAX
	FILD factor
	FMUL
	FILD factor
	FMUL
	FISTP qword ptr Rueck		
	MOV		EDX, Rueckhigh
	MOV		EAX, Ruecklow
	
	POP		ESI
	POP		EDI
	POP		ECX
	MOV SP, BP
	POP BP
	RET 
	temp DD	2
	factor DD 0
	Rueck DQ 0
	Ruecklow DD dword ptr[Rueck -4]
	Rueckhigh DD dword ptr[Rueck]
Berechnung ENDP

;gibt eine 64-Bit-Zahl im Dezimalsystem aus
;Parameter: EDX:EAX = auszugebende Zahl
;Ausgabe  : keine
dezimalausgabe64 PROC

(die Ausgabeprozedur habe ich mal nicht hier hereinkopiert)
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
dezimalausgabe64 ENDP

main:
	MOV 	AX, @DATA         
	MOV 	DS, AX	
	
	FINIT
	; Rundungsart einstellen (hier: Nachkommastellen abschneiden)
	FSTCW cwr    ; CW-Register kopieren		
	MOV   AX,cwr
    OR    AX,0000110000000000b ; Bit 10 und Bit 11 setzen
    MOV   cwr,AX
    FCLEX        ; Exceptions vermeiden (sicherheitshalber)
	FLDCW cwr    ; cwr ins CW-Register zurueckkopieren
		
	;SUB  SP,8 ; Platz für Rückgabeparameter reservieren
	CALL Berechnung
	
	CALL dezimalausgabe64                       
	MOV  AX,4C00h          ;Programm beenden (Fehlercode = 0)
	INT  21h               ;
END main
 
Auf diesen Beitrag antworten »
Pascal

Zitat:
Original von Romi
Das Ergebnis soll in EDX:EAX stehen


Nach Ausführung des Unterprogramms steht in EDX:EAX die Adresse des Ergebnisses.
Auf diesen Beitrag antworten »
Romi

Zitat:
Nach Ausführung des Unterprogramms steht in EDX:EAX die Adresse des Ergebnisses.


Unpräzise formuliert, das stimmt - ich meinte die Adresse.
Fehler ist aber trotzdem gefunden:
die Reihenfolge ist hier ausschlaggebend. Falsch:
.386
.MODEL SMALL

Richtig ist:
.MODEL SMALL
.386
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »