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
-
versuchs mal mit .8087
-
Hi,
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ö