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!
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
Che cosa ha detto duskwuff. 'x87' viene deprecato in modo efficace e ci sono pochissime ragioni per cui il nuovo software lo bersagli. –
@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