Programare in limbaj de asamblare

10
Programare in limbaj de asamblare Instructiuni in virgula flotanta (continuare)

description

Programare in limbaj de asamblare. Instructiuni in virgula flotanta (continuare). Alte instructiuni ale coprocesorului matematic. FINIT - initializare coprocesor aduce coprocesorul intr-o stare cunoscuta: reg. de control (CW)= 37H reg. de stare (SW) = 0 - PowerPoint PPT Presentation

Transcript of Programare in limbaj de asamblare

Page 1: Programare in limbaj de asamblare

Programare in limbaj de asamblare

Instructiuni in virgula flotanta(continuare)

Page 2: Programare in limbaj de asamblare

Alte instructiuni ale coprocesorului matematic FINIT - initializare coprocesor

– aduce coprocesorul intr-o stare cunoscuta:• reg. de control (CW)= 37H• reg. de stare (SW) = 0

FWAIT - forteaza procesorul x86 sa astepte terminarea instructiunii curente din coprocesor– evita executia in paralel a unor operatii care

afecteaza aceleasi variabile

Page 3: Programare in limbaj de asamblare

Operatii cu registrele speciale FLDCW si FSTCW - incarcare si salvare registru de

control– sintaxa: fldcw mem_16 ; CW<=mem_16 fstcw mem_16 ; mem_16<=CW

FLDSW si FSTSW - incarcare si salvare registru de stare– sintaxa: fldsw ax ; SW<=AX

fstsw ax ; AX<=SW fldcw mem_16 ; CW<=mem_16 fstcw mem_16 ; mem_16<=CW

Page 4: Programare in limbaj de asamblare

Salvare si refacere stare coprocesor

FLDENV si FSTENV - incarca si salveaza “mediul” de lucru al coprocesorului– se transfera 14 octeti avand urmatorul format:

• reg. de control (CW) - 2 octeti• reg. de stare (SW) - 2 octeti• cuvantul atasat (tag) - 2 octeti• poantor de instructiuni - 20 biti• codul de instructiune 11 biti• poantor de date 20 biti• restul nefolositi

Page 5: Programare in limbaj de asamblare

Operatii cu registrele speciale

FSAVE/FNSAVE si FRSTORE – salveaza si respectiv refac “starea”

coprocesorului, adica registrele de control, stare si de date; folosite pt. comutare de context

– se transfera 94 octeti = • 14 octeti pt. “mediu” +• 80 octeti - continutul stivei ( ST(0) ... ST(7))

– sintaxa: fsave mem_94_oct fnsave mem_94_oct frstore mem_94_oct

Page 6: Programare in limbaj de asamblare

Alte instructiuni FINCSTP si FDECSTP - incrementare si

decrementare poantor de stiva (modulo 8) FNOP - no operation - pt. temporizare FFREE - modifica tag-ul atasat unui registru, pentru a

marca faptul ca registru este gol– sintaxa: ffree st(i) ; marcheaza reg. i ca fiind gol

FCLEX/FNCLEX - sterge toti bitii de exceptie, indicatorul Busy si eroarea de stiva

Page 7: Programare in limbaj de asamblare

Instructiuni cu intregi

– inainte de operatia aritmetica valoarea intreaga este convertita in virgula flotanta pe 80 biti

– sintaxa:

fiadd int fidiv intfisub int fidivr intfisubr int ficom intfimul int ficomp int

– int - intreg pe 16 sau 32 biti

Page 8: Programare in limbaj de asamblare

Exemple Calculul cotangentei

fld arcfsincosfdivrfst cotangenta

Arccotangenta actg(x)=atg(1/x)fld1 ; pune “1” pe stivafld cotangfpatan ; atan(st(1)/st(0))fst arc

Page 9: Programare in limbaj de asamblare

Exemple Arcsinus: asin(x) = atan(sqrt(x*x/(1-x*x)))

fld sinusfld st(0) ;Duplica x pe stivafmul ; calculeaza x*x.fld st(0) ;Duplica x*x pe stiva.fld1 ;Calculeaza 1-X**2.fsubrfdiv ;Calculeaza X**2/(1-X**2).fsqrt ;Calculeaza sqrt(x**2/(1-

X**2)).fld1 ;Calculeaza arctangent.fpatan

Page 10: Programare in limbaj de asamblare

Exemple

Logaritm in baza 10 din x– lg10(x)=lg2(x)/lg2(10)

fld1fld xfyl2x ;Calculeaza 1*lg(x).fldl2t ;Incarca lg(10).fdiv ;Calculeaza lg(x)/lg(10).