Assembler äëÿ íà÷èíàþùèõ


Ñèíóñ óãëà



Ñèíóñ óãëà


      Ïîñëåäíèé ïðèìåð èñïîëüçîâàíèÿ ñîïðîöåññîðà 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
    èëëþñòðèðóåò ðåçóëüòàò âûïîëíåíèÿ ýòîé ïðîãðàììû.




Ñîäåðæàíèå ðàçäåëà