Ñèíóñ óãëà

      Ïîñëåäíèé ïðèìåð èñïîëüçîâàíèÿ ñîïðîöåññîðà 8087 - âû÷èñëåíèå

    ñèíóñà óãëà.  Ó ñîïðîöåññîðà 8087 íåò êîìàíäû âû÷èñëåíèÿ ôóíêöèè

    SIN; ñàìîå áîëüøåå, ÷òî îí ìîæåò - ýòî âûïîëíèòü êîìàíäó FPTAN,

    íàõîæäåíèå ÷àñòè÷íîãî òàíãåíñà.  ×òîáû âûïîëíèòü îïåðàöèþ SIN,

    âîñïîëüçóåìñÿ ýòîé êîìàíäîé, à òàêæå êîìàíäîé FPREM (÷àñòè÷íûé

    îñòàòîê).

 

      Ïðîãðàììà, âû÷èñëÿþùàÿ SIN, ïîêàçàíà íà Ôèã. 7.27.  Ýòà

    ïðîãðàììà âû÷èñëÿåò è ïå÷àòàåò ñèíóñû óãëîâ îò 1/2 äî 6 ñ øàãîì 1/2

    ðàäèàíà.  Âûäà÷à ïðîãðàììû àíàëîãè÷íà âûäà÷å ñëåäóþùåé ïðîãðàììû íà

    ÿçûêå Áåéñèê:

 

      10  FOR X = .5 TO 6.0 STEP .5

      20  PRINT SIN(X)

      30  NEXT X

 

      Äëÿ ïå÷àòè ðåçóëüòàòîâ èñïîëüçóåòñÿ ïîäïðîãðàììà íà Ôèã. 7.25.

 

             Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:05:01

             Ôèã. 7.27 Âû÷èñëåíèå ñèíóñà óãëà                  Page     1-1

 

 

                                           PAGE    ,132

                                           TITLE   Ôèã. 7.27 Âû÷èñëåíèå ñèíóñà óãëà

 

            0000                     STACK   SEGMENT STACK

            0000  0040[                    DW      64 DUP (?)

                    ????

                              ]

 

            0080                     STACK   ENDS

            0000                     CODE    SEGMENT

                                           ASSUME  CS:CODE,DS:CODE,ES:CODE

                                           EXTRN   FLOAT_ASCII:NEAR

            0000  0001               NUM_ANGLE       DW      1

            0002  0002               DEN_ANGLE       DW      2

            0004  ????               STATUS  DW      ?

            0006  0004               FOUR    DW      4

            = 0040                         C3      EQU     40H

            = 0004                         C2      EQU     04H

            = 0002                         C1      EQU     02H

            = 0001                         C0      EQU     01H

            0008  93 A3 AE AB 20 E1 AB     ERROR_MSG       DB      'Óãîë ñëèøêîì áîëüøîé', 10, 13, '$'

                  A8 E8 AA AE AC 20 A1

                  AE AB EC E8 AE A9 0A

                  0D 24

            001F                     SIN     PROC    FAR

            001F  1E                       PUSH    DS

            0020  2B C0                    SUB     AX, AX

            0022  50                       PUSH    AX

            0023  8C C8                    MOV     AX, CS

            0025  8E D8                    MOV     DS, AX

            0027  8E C0                    MOV     ES, AX

            0029                     DO_AGAIN:

            0029  9B DB E3                       FINIT                   ;-----ST(0)-----;-----ST(1)------

            002C  9B DF 06 0000 R                FILD    NUM_ANGLE       ;           ;

            0031  9B DE 36 0002 R                FIDIV   DEN_ANGLE       ; X = Óãîë      ;

 

             Ôèã. 7.27 (a) Ïðîöåäóðà SIN (íà÷àëî)

            0036  9B D9 EB                       FLDPI                   ; PI        ; X

            0039  9B DE 36 0006 R                FIDIV   FOUR            ; PI/4            ; X

            003E  9B D9 C9                       FXCH              ; X         ; PI/4

            0041  9B D9 F8                       FPREM                   ; R         ; PI/4

            0044  9B DD 3E 0004 R                FSTSW   STATUS

            0049  9B                       FWAIT

            004A  8A 26 0005 R                   MOV     AH, BYTE PTR STATUS+1

            004E  F6 C4 04                       TEST    AH, C2

            0051  75 55                    JNZ     BIG_ANGLE

            0053  F6 C4 02                       TEST    AH, C1          ; Îïðåäåëÿåòñÿ, íåîáõîäèìî ëè âû÷èòàíèå PI/4

            0056  74 05                    JZ      DO_R            ; Åñëè 0, òî íå íåîáõîäèìî âû÷èòàíèå PI/4

            0058  9B DE E1                       FSUBRP  ST(1), ST(0)    ; A = PI/4-R    ; ?

            005B  EB 06                    JMP     SHORT DO_FPTAN

            005D                     DO_R:

            005D  9B D9 C9                       FXCH              ; PI/4            ; R

            0060  9B D8 D9                       FCOMP                   ; R         ; ?

            0063                     DO_FPTAN:

            0063  9B D9 F2                       FPTAN                   ; OPP             ; ADJ   Ãäå OPP/ADJ=Tan(A)

 

                                     ;-----  Îïåðåäåëåíèå òîãî, ÷òî íóæíî - ñèíóñ èëè êîñèíóñ

 

            0066  F6 C4 42                       TEST    AH, C3 or C1

            0069  7A 03                    JPE     DO_SINE

            006B  9B D9 C9                       FXCH              ; ADJ             ; OPP

            006E                     DO_SINE:                ; D         ; N

 

                                     ;-----  Âû÷èñëåíèå N/SQR(N**2 + D**2)

            006E  9B D8 8E 0000 U                FMUL    ST(0)           ; D**2            ; N

            0073  9B D9 C9                       FXCH    ST(1)           ; N         ; D**2

            0076  9B D9 C0                       FLD     ST(0)           ; N         ; N         ; D**2

            0079  9B D8 8E 0000 U                FMUL    ST(0)           ; N**2            ; N             ; D**2

            007E  9B DC 06 0000 U                FADD    ST(2)           ; N**2 + D**2   ; N             ; D**2

            0083  9B D9 FA                       FSQRT                   ; SQR(N2 + D2)  ; N             ; D**2

            0086  9B DE F1                       FDIVRP  ST(1)           ; SIN(X)        ; D**2

            0089  9B D9 C9                       FXCH    ST(1)           ; D**2            ; SIN(X)

            008C  9B D8 D9                       FCOMP                   ; SIN(X)        ; ?

            008F  F6 C4 01                       TEST    AH, C0

            0092  74 03                    JZ      SIGN_OK

            0094  9B D9 E0                       FCHS

            0097                     SIGN_OK:

            0097  E8 0000 E                CALL    FLOAT_ASCII

            009A  FF 06 0000 R                   INC     NUM_ANGLE

            009E  83 3E 0000 R 0D                CMP     NUM_ANGLE, 13

            00A3  77 02                    JA      RETURN_INST

            00A5  EB 82                    JMP     DO_AGAIN

            00A7                     RETURN_INST:

            00A7  CB                       RET

            00A8                     BIG_ANGLE:

            00A8  8D 16 0008 R                   LEA     DX, ERROR_MSG

            00AC  B4 09                    MOV     AH, 9H

            00AE  CD 21                    INT     21H

            00B0  CB                       RET

            00B1                     SIN     ENDP

            00B1                     CODE    ENDS

                                           END     SIN

             Ôèã. 7.27 (a) Ïðîöåäóðà SIN (ïðîäîëæåíèå)

            A>SIN

             4.79425539E-001

             8.41470985E-001

             9.97494987E-001

             5.98472144E-001

             1.41120008E-001

            -3.50783228E-001

            -7.56802495E-001

            -9.77530118E-001

            -9.58924275E-001

            -7.05540326E-001

            -2.79415498E-001

             2.15119988E-001

 

             Ôèã. 7.27 (b) Âûâîä ïðîöåäóðû SIN

 

            Ôèã. 7.27 Âû÷èñëåíèå ñèíóñà óãëà

 

       ïåðâîé ÷àñòè ïðîãðàììû ïðîèñõîäèò åå èíèöèàëèçàöèÿ äëÿ ðàáîòû

    â êà÷åñòâå ôàéëà òèïà .EXE.  Çàòåì ñîïðîöåññîð 8087 çàãðóæàåò äâà

    öåëûõ ÷èñëà è äåëèò èõ, ôîðìèðóÿ èñõîäíûé óãîë.  Ýòî - ïðèìåð

    èñïîëüçîâàíèÿ äâóõ öåëûõ ÷èñåë äëÿ ïîðîæäåíèÿ ÷èñëà ñ ïëàâàþùåé

    òî÷êîé (â äàííîì ñëó÷àå 1/2), ÷òî íåëüçÿ ñäåëàòü íåïîñðåäñòâåííî ñ

    ïîìîùüþ àññåìáëåðà.

 

      Êàê âû ïîìíèòå èç òðèãîíîìåòðèè, ñèíóñ - ïåðèîäè÷åñêàÿ ôóíêöèÿ.

    Òî åñòü ôóíêöèÿ äàåò îäèí è òîò æå ðåçóëüòàò â ñëó÷àå èñõîäíûõ

    ÷èñåë, ðàçëè÷àþùèõñÿ ðîâíî íà 2*PI.  Ïîýòîìó ïåðâîé çàäà÷åé

    ïîäïðîãðàììû SIN ÿâëÿåòñÿ çàìåíà èñõîäíîãî óãëà ñîîòâåòñòâóþùèì

    çíà÷åíèåì, ëåæàùèì â äèàïàçîíå

 

      0 <= X < 2*PI

 

      Â êîìàíäå FPTAN òðåáóåòñÿ, ÷òîáû óãîë íàõîäèëñÿ â äèàïàçîíå

 

      0 <= X < PI/4

 

      Ýòî îçíà÷àåò, ÷òî äàæå åñëè óãîë è ìåíüøå 2*PI, ìû äîëæíû

    óìåíüøèòü åãî åùå, ÷òîáû îí óäîâëåòâîðÿë îãðàíè÷åíèÿì êîìàíäû

    FPTAN.  Ê ñ÷àñòüþ, åñëè èñõîäíûé óãîë óìåíüøåí äî çíà÷åíèÿ,

    ìåíüøåãî PI/4, âñå åùå ìîæíî îïðåäåëèòü âåðíîå çíà÷åíèå

    òðèãîíîìåòðè÷åñêèõ ôóíêöèé.  ×òîáû ýòî ñäåëàòü, íàäî çíàòü, â êàêîì

    ìåñòå èñõîäíîãî äèàïàçîíà îò 0 äî 2*PI íàõîäèëñÿ èñõîäíûé óãîë.

 

      Íóæíîå óìåíüøåíèå óãëà âûïîëíÿåò êîìàíäà FPREM.  Îíà íå òîëüêî

    âû÷èñëÿåò îñòàòîê, íî è òðè ìëàäøèõ áèòà ÷àñòíîãî, îïðåäåëÿåìîãî â

    òå÷åíèå ïðîöåññà ïîèñêà îñòàòêà.  Ýòè òðè áèòà êîìàíäà çàïèñûâàåò â

    ñëîâî ñîñòîÿíèÿ.  Ñëåäîâàòåëüíî, õîòÿ ìû è óìåíüøèëè óãîë äî

    çíà÷åíèÿ îäíîé âîñüìîé èñõîäíîãî äèàïàçîíà, âñå æå ìîæíî îïðåäåëèòü

    îêòàíò, â êîòîðûé ïîïàäåò óãîë.  Çíàÿ åãî, ìîæíî íàéòè ôîðìóëó

    âû÷èñëåíèÿ ñèíóñà ñ ïîìîùüþ òðèãîíîìåòðè÷åñêèõ ïðåîáðàçîâàíèé.

    Òàáëèöà íà Ôèã. 7.28 ïîêàçûâàåò ñâÿçü ìåæäó èñõîäíûì îêòàíòîì è

    ìåòîäîì âû÷èñëåíèÿ ñèíóñà óãëà.   òàáëèöå ïðåäïîëàãàåòñÿ, ÷òî

    ÷èñëî R - ýòî îñòàòîê îò óìåíüøåíèÿ èñõîäíîãî óãëà äî çíà÷åíèÿ

    ìåíüøå PI/4.  Íîìåð îêòàíòà ïîÿâëÿåòñÿ â ðàçðÿäàõ C3 = C1 = C0

    ïîñëå âûïîëíåíèÿ êîìàíäû FPREM.

 

      Ñ ïîìîùüþ ýòîé òàáëèöû ìû ìîæåì îïðåäåëèòü ôîðìóëó âû÷èñëåíèé,

    ïðèìåíÿåìóþ â êàæäîì ñëó÷àå âûïîëíåíèÿ ïðîãðàììû.  Ïîñëå çàãðóçêè

    çíà÷åíèÿ óãëà â ðàäèàíàõ ïðîãðàììà çàãðóæàåò ÷èñëî è äåëèò åãî íà

    4, ÷òîáû èñïîëüçîâàòü â êîìàíäå FPREM.  Â ýòîò ìîìåíò

    "çàõâàòûâàåòñÿ" ñëîâî ñîñòîÿíèÿ.  Åñëè ïðîöåññ ïîèñêà îñòàòêà íå

    çàâåðøèëñÿ íà ýòîì åäèíñòâåííîì øàãå, ýòî îçíà÷àåò, ÷òî èñõîäíûé

    óãîë áûë áîëüøå 2**64.  Ñëåäîâàòåëüíî, åãî çíà÷åíèå íàñòîëüêî áîëüøå

    ìàêñèìàëüíî âîçìîæíîãî ïðè âû÷èñëåíèÿõ òðèãîíîìåòðè÷åñêèõ ôóíêöèé,

    ÷òî ìû îòáðàñûâàåì ýòî ÷èñëî, êàê ñëèøêîì áîëüøîå.      Ýòîãî íå

    ïðîèñõîäèò ñî çíà÷åíèÿìè, âûáðàííûìè â ïðèìåðå, íî çäåñü äëÿ

    èëëþñòðàöèè ââåäåíà òàêàÿ ïðîâåðêà.

 

            Îêòàíòû

        C0  C3    C1    Äèàïàçîí        SIN(X) = :

        -----------------------------------------------------

         0  0    0    0     PI/4  SIN(R)

         0  0    1    PI/4  PI/2  COS(PI/4-R)

         0  1    0    PI/2  3*PI/4      COS(R)

         0  1    1    3*PI/4      PI    SIN(PI/4-R)

         1  0    0    PI    5*PI/4      - SIN(R)

         1  0    1    5*PI/4      3*PI/2      - COS(PI4-R)

         1  1    0    3*PI/2      7*PI/4      - COS(R)

         1  1    1    7*PI/4      2*PI  - SIN(PI/4-R)

 

                  (R - îñòàòîê, 0<R<PI/4)

        -----------------------------------------------------

 

                 Ôèã. 7.28 SIN(X) â âîñüìè ñåêòîðàõ

 

      Ïðîãðàììà ïðîâåðÿåò ðàçðÿä C1 â ðåãèñòðå ñîñòîÿíèÿ, ÷òîáû

    îïðåäåëèòü, äîëæíà ëè îíà èñïîëüçîâàòü îñòàòîê R, èëè åãî íàäî

    âû÷åñòü èç PI/4.  Òàê êàê PI/4 åùå íàõîäèòñÿ â îäíîì èç ðåãèñòðîâ,

    ýòî ñäåëàòü ïðîñòî.  Åñëè âû÷èòàíèå íå òðåáóåòñÿ, êîìàíäà FCOMP

    óäàëÿåò èç ñòåêà íåíóæíîå çíà÷åíèå PI/4.

 

      Çàòåì êîìàíäà FPTAN âû÷èñëÿåò ÷àñòè÷íûé òàíãåíñ.  Ðåçóëüòàò

    ðàáîòû êîìàíäû ïîêàçàí, êàê OPP/ADJ (ñîêðàùåíèÿ îò àíãëèéñêèõ ñëîâ

    Opposite (ïðîòèâîïîëîæíûé) è Adjacent (ñîñåäíèé)), ÷òî ðàâíî

    òàíãåíñó óãëà R èëè PI/4-R, â çàâèñèìîñòè îò òîãî, ÷òî áûëî

    âûáðàíî.  Ñ ïîìîùüþ ýòèõ äâóõ ÷èñåë òåïåðü ìîæíî îïåðåäåëèòü ñèíóñ

    èëè êîñèíóñ óãëà.  Íàïðèìåð, ñèíóñ, çàäàííûé ïàðîé ÷èñåë OPP/ADJ,

    ìîæíî âû÷èñëèòü ïî ôîðìóëå

 

      SIN(X) = OPP/SQR(OPP**2+ADJ**2), ãäå TAN(X) = OPP/ADJ

 

      ×òîáû âû÷èñëèòü êîñèíóñ, íóæíî ÷èñëèòåëü çàìåíèòü íà ADJ.  Ìû

    ðåøàåì, íóæåí ëè ñèíóñ èëè êîñèíóñ, àíàëèçèðóÿ çàïîìíåííûå

    îïèñàòåëè îêòàíòà, ò.å.  ïðîâåðÿÿ çíà÷åíèÿ ðàçðÿäîâ C3 è C1.

    Êîìàíäà TEST âûäåëÿåò ýòè çíà÷åíèÿ, à êîìàíäà JPE äåëàåò ïåðåõîä,

    åñëè îíè îáà íóëåâûå èëè îáà åäèíè÷íûå.   ýòîì ñëó÷àå ìû âû÷èñëÿåì

    ñèíóñ; åñëè æå îíè ðàçëè÷íû, ìû âû÷èñëÿåì êîñèíóñ, ÷òî äîñòèãàåòñÿ

    çàìåíîé ìåñòàìè çíà÷åíèé OPP è ADJ â ñòåêå ðåãèñòðîâ.

 

      Äàëåå ñëåäóþùèå êîìàíäû ñîïðîöåññîðà 8087 âû÷èñëÿþò çíà÷åíèå

    ñèíóñà (èëè êîñèíóñà) ïî çíà÷åíèþ ÷àñòè÷íîãî òàíãåíñà.

    Åäèíñòâåííûé øàã, êîòîðûé åùå íàäî âûïîëíèòü - ýòî îïðåäåëåíèå

    îêîí÷àòåëüíîãî çíàêà ðåçóëüòàòà.   ñëó÷àå ñèíóñà ðåçóëüòàò

    îòðèöàòåëåí, åñëè óãîë íàõîäèòñÿ â îêòàíòàõ îò ÷åòâåðòîãî äî

    ñåäüìîãî.  Ïðîâåðêà ðàçðÿäà C0 îïðåäåëÿåò âåðíûé çíàê ðåçóëüòàòà.

    Çàòåì ïðîãðàììà FLOAT_ASCII, ïîêàçàííàÿ íà Ôèã. 7.25, ïå÷àòàåò

    ÷èñëî â ïëàâàþùåì ôîðìàòå.      Óïðàâëåíèå âîçâðàùàåòñÿ íàçàä, ê íà÷àëó

    öèêëà, åñëè åùå íå ïðîéäåíû âñå îêòàíòû.  Íèæíÿÿ ÷àñòü Ôèã. 7.27

    èëëþñòðèðóåò ðåçóëüòàò âûïîëíåíèÿ ýòîé ïðîãðàììû.