Co-Prozessor



  • Hallo zusammen,

    kann mir jemand sagen was alles nötig ist um Co-Prozessor Befehle(8087) ausführen lassen zu können? Falls ich z.B ein "fcompp" in meinem Quellcode benutzen möchte, meckert der Compiler nur...

    Bitte helft mir. 🙂

    Ciao



  • waxalot schrieb:

    Falls ich z.B [...], meckert der Compiler nur...

    Welcher Compiler?
    Ein Codebeispiel könnte auch hilfreich sein.



  • Hi,

    ich benutze den TASM von Borland.

    Hier mal der Code dazu...
    Ein Bubblesort Programm:

    ;// char Bubblesort(float[] Feld, int Anzahl)
    IDEAL
    DOSSEG
    MODEL SMALL
    
    DATASEG
    
    BubbleOk EQU 0
    BubbleFeldLeer EQU 1
    BubbleKeinFeld EQU 2
    STATUSWORD_87 DW ?
    CODESEG
    
    PROC Bubblesort
    
    	push bp
    	mov bp,sp
    
    	mov al,BubbleKeinFeld
    	cmp [word ptr bp+4],0
    	je NichtSortieren
    
    	mov al,BubbleFeldLeer
    	cmp [word ptr bp+6],2
    	jl NichtSortieren	; Falls Anzahl < 2, dann springe zu "nichtsortieren"
    
    	finit			; Co-Prozessor initialisieren
    
    NaechsterDurchgang:
    
    	xor dl,dl		; dl = 0, zum pruefen ob gewechselt wurde...
    	mov cx,[bp+6]
    	dec cx
    	mov si,[bp+4]		; Adresse des Elements
    
    Schleifenanfang:		; Fuer EINEN Durchgang
    
    	;// Vergleich
    	fld [dword ptr si]	;
    	fcompp [dword ptr si+4] ; Vergleicht mit der obersten Zahl im Co-Stack
    
    	fstsw STATUSWORD_87	; Speichere Flags des Co-Proz. in Speicher
    	fwait			; warten fuers speichern
    
    	;// 8087-Flags pruefen
    	test byte ptr [STATUSWORD_87+1],01000101b ; Flags testen ob gesetzt.
    	jnz NichtTauschen
    
    	;// Tausch
    	mov ax,[si]
    	mov bx,[si+2]
    	xchg ax,[si+4]		; Kommutativ
    	xchg bx,[si+6]
    	mov [si],ax
    	mov [si+2],bx
    	mov dl,1		; Merken, dass getauscht wurde...
    
    NichtTauschen:
    
    	add si,4		; Wegen "float = 32 Bit"
    	loop Schleifenanfang	; Loop solange cx > 0
    
    	test dl,dl   		; // cmp dl,0
    	jnz NaechsterDurchgang
    
    	mov al,BubbleOk
    
     NichtSortieren:
    
    	pop bp
    	ret
    
    ENDP Bubblesort			; Ende der Prozedur
    
    	END
    

    Vielleicht hilft das ja... 🙂
    Ciao


  • Mod

    versuchs mal mit .8087



  • Hi,

    @camper:

    Ich habe ein bisschen rumprobiert und bemerkt, dass der Compile nur Probleme mit dem Befehl "fcompp" hat. Er kennt ihn nicht und wenn ich einfach "fcomp" benutze, dann klappts. Woran kann das liegen? Ist mein Compiler zu alt? 🙂

    Ciao



  • Hi.

    fcompp vergleicht die beiden obersten auf dem Stack liegenden Werte und popt sie dann runter. Von daher hat dieser OpCode keine Operanden. 💡

    fcomp vergleicht den zu oberst auf dem Stack liegenden Wert mit dem im ersten Operanden angegebenen Wert und popt dann den letzten Wert vom Stack.
    => IMHO passt das recht gut in deinen Code.

    Schliesslich gibt es noch fcom - dieser OpCode vergleicht nur den letzten auf dem Stack liegenden Wert mit dem im ersten Operanden angegebenen Wert, ohne den Stack zu veraendern...

    Der TASM sollte eigentlich alle 3 OpCodes kennen.



  • Hi,

    @Nobuo T

    Du hast mir wirklich sehr geholfen. Das kommt davon wenn man sich die Opcodes nicht mal genauer betrachtet. 🙂
    So wird einiges klar.... Danke vielmals.... Tschö


Anmelden zum Antworten