2011-08-25 20 views
5

Mi è stato assegnato il compito di scrivere una semplice applicazione in C/ASM misto che deve utilizzare il coprocessore matematico.x87 Istruzioni FPOP e FCOM - come funzionano?

C'è il cilindro funzione (float x, float y, float z) che restituisce 1 se il punto specificato si trova all'interno del cilindro (il cilindro ha una base in x = 0, y = 0, raggio = 5 e altezza = 10), e 0 se non lo è.

Quindi, sembra semplice. Verificare se z è compreso tra < 0,10>, quindi controllare se x^2 + y^2 < 25.

Ma la mia conoscenza di x87 è nulla.

C'è tutto quello che ho scritto.

_cylinder PROC 

push ebp 
mov ebp, esp 
sub esp,8 ; I can't use .data in the application, so I reserve some space on the stack for numbers 10 and 25 
mov [esp],10 
mov [esp+4],25 

finit 
fldz 
fld [ebp+8] 

    ;here i get stuck 

add esp, 8 
pop ebp 
_cylinder ENDP 

Quindi mi sono bloccato. Quindi, provo a trovare quali istruzioni potrei usare nell'applicazione. E lì mi blocco, perché ogni tutorial/elenco di istruzioni che trovo in rete è scritto così male che riesco a malapena a capire qualsiasi cosa.

La domanda è: cosa succede quando faccio un salto dal coprocessore matematico? Dove posso trovare il valore spuntato? Come si converte dal valore da 80 bit a 32 bit uno (se lo è, ovviamente) Un'altra domanda è: come funziona il FCOM (FCOMP per la variante pop)? Confronta cosa a cosa (da st0 a st1 o st1 a st0?), E dove posso vedere se il valore è minore/uguale/più grande?

Grazie per qualsiasi aiuto!

+5

Prima di arrivare troppo in profondità, perche non utilizzando SSE2 matematica invece di x87. È molto più facile lavorare con (si usano i registri anziché uno stack), sono disponibili più funzioni e generalmente è più veloce. – duskwuff

+0

Che cosa ha detto duskwuff. 'x87' viene deprecato in modo efficace e ci sono pochissime ragioni per cui il nuovo software lo bersagli. –

+0

@Stephen - "deprecato" da alcuni SO, non dalla CPU, dai venditori (ma anche da lì, ancora supportato). Motivi per l'uso: precisione estesa a 80 bit e funzioni matematiche trascendentali, ad esempio. – PhiS

risposta

5

I confronti a virgola mobile sono una specie di dolore. Puoi fare il confronto sulla FPU, ma prima di poter fare qualsiasi cosa in base a ciò, devi trasferire la parola di stato in virgola mobile alla CPU, testare i flag che ti interessano e poi reagire in base a ciò.

Solo per esempio, il confronto iniziale che z> = 0.0 sarebbe simile a questa:

fldz 
fcomp z 
fnstsw ax 
test ah, 041h; I *think* I've got the right flags there... 
jp good 
+4

Hmm, non dovrebbe essere "prova ah, ..."? [Riferimento] (http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetic.html#1000117). Personalmente trovo che usare ['FCOMI'] (http://stackoverflow.com/questions/7057501/x86-assembler-floating-point-compare/7057771#7057771) sia più facile che scherzare con le maschere di bit per la parola di stato, è disponibile solo su P6 + però. – user786653

+3

@ user786653: oops - sì, dovrebbe essere ah, non ax. Mie scuse.Sì, FCOMI è bello, ma quando è arrivato il P6, non stavo scrivendo quasi il codice di assemblaggio. Se stavo scrivendo per i processori più recenti, probabilmente utilizzerei invece SSE. –

+2

Sono d'accordo, se io * dovessi * scriverlo nell'assembler x86. Sembra che l'OP sia impostato sull'uso di x87, quindi ho pensato che l'avrei fatto. Mi sembra anche di ricordare che 'sahf' + test non firmati (come con' fcomi') funzionano. – user786653

Problemi correlati