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