Èçîáðàæåíèå ÷èñåë ñ ïëàâàþùåé òî÷êîé
Èçîáðàæåíèå ÷èñåë ñ ïëàâàþùåé òî÷êîé
Ñëåäóþùàÿ ïîäïðîãðàììà áåðåò ÷èñëî èç âåðøèíû ñòåêà è
ïðåîáðàçóåò åãî â ïå÷àòíóþ ñòðîêó ñèìâîëîâ. Ôàêòè÷åñêè,
ïîäïðîãðàììà èçâëåêàåò ÷èñëî ñ âåðøèíû ñòåêà è ïîñûëàåò åãî íà
äèñïëåé. Äàëåå ýòà ïîäïðîãðàììà áóäåò èñïîëüçîâàíà â äâóõ ïðèìåðàõ
äëÿ âûâîäà èõ ðåçóëüòàòîâ. Èñõîäíûé òåêñò ïðîãðàììû ïîêàçàí íà
Ôèã. 7.25.
Ýòà ïîäïðîãðàììà äîñòàòî÷íî ïðîñòî ñòðîèò âûâîäèìóþ ñèìâîëüíóþ
ñòðîêó. Åñëè èñõîäíîå ÷èñëî NAN, ëèáî áåñêîíå÷íîñòü, èëè äðóãîå
ñïåöèàëüíîå ÷èñëî ñîïðîöåññîðà 8087, ðåçóëüòàò áóäåò ïîêàçàí
íåâåðíî. Ïåðâàÿ ÷àñòü ïðîãðàììû - óäîáíîå ìåñòî äëÿ èñïîëüçîâàíèÿ
êîìàíäû FXAM, êîòîðàÿ îïðåäåëèëà áû òèï ÷èñëà â âåðøèíå ñòåêà. Íî
â äàííîì ïðèìåðå ýòà êîìàíäà íå èñïîëüçóåòñÿ, òàê êàê
ïðåäïîëàãàåòñÿ, ÷òî èñõîäíîå ÷èñëî èìååò íóæíûé òèï.
Ýòà ïðîãðàììà íå ïðèñïîñîáëåíà äëÿ îôîðìëåíèÿ ôîðìàòà
âûâîäèìîãî ÷èñëà. Ðåçóëüòàò âñåãäà ñîäåðæèò çíàê (ëèáî ïðîáåë,
ëèáî çíàê "-") è öåëóþ ÷àñòü, ñîñòîÿùóþ èç îäíîé öèôðû. Ïîñëå
äåñÿòè÷íîé òî÷êè ðàñïîëîæåíû âîñåìü äåñÿòè÷íûõ ïîçèöèé, à çàòåì
áóêâà E è òðè ïîçèöèè öèôð äëÿ ñòåïåíè 10. Ðåçóëüòàò ðàáîòû ýòîé
ïðîãðàììû íå òàê õîðîø, êàê ìîæíî áûëî æåëàòü, íî îí ïîçâîëÿåò
âèäåòü ðåçóëüòàò ðàáîòû ïðîãðàììû â ÷èòàáåëüíîé ôîðìå. Áîëåå
êðàñèâîå ïðåîáðàçîâàíèå ÷èñëà ïîòðåáîâàëî áû çíà÷èòåëüíî áîëüøå
êîìàíä, è ëèøü ìàëàÿ ÷àñòü èç íèõ ïîìîãëà áû ïîíèìàíèþ ðàáîòû
ñîïðîöåññîðà 8087.
Ïðîãðàììà ïðåîáðàçîâàíèÿ ðàáîòàåò ñëåäóþùèì îáðàçîì. Ñíà÷àëà
îíà îïðåäåëÿåò ïîðÿäîê ÷èñëà. Íàïðèìåð, ÷èñëî 1234 èìååò ïîðÿäîê
3; ýòî îçíà÷àåò, ÷òî îíî íàõîäèòñÿ ìåæäó çíà÷åíèÿìè 103 è 104.
Íàéäÿ ïðàâèëüíûé ïîðÿäîê ÷èñëà, ïðîãðàììà ñîõðàíÿåò åãî çíà÷åíèå
(ïîêàçàòåëü ñòåïåíè ðåçóëüòàòà) è äåëèò èñõîäíîå ÷èñëî íà 10 â ýòîé
ñòåïåíè. Òåïåðü ÷èñëî íàõîäèòñÿ â èíòåðâàëå îò 1 äî 10. Çàòåì
ïðîãðàììà óìíîæàåò ÷èñëî íà 108. Çàïèñü ýòîãî ÷èñëà â äåñÿòè÷íîé
ôîðìå äàåò äåâÿòü äåñÿòè÷íûõ öèôð; ñòàðøàÿ öèôðà - öåëàÿ ÷àñòü,
ìëàäøèå âîñåìü öèôð - äðîáíûå ðàçðÿäû.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:04:46
Ôèã. 7.25 Ïðåîáðàçîâàíèå ïëàâàþùåãî ôîðìàòà â òåêñòîâûé Page 1-1
PAGE ,132
TITLE Ôèã. 7.25 Ïðåîáðàçîâàíèå ïëàâàþùåãî ôîðìàòà â òåêñòîâûé
0000 CODE SEGMENT PUBLIC
ASSUME CS:CODE,DS:CODE,ES:CODE
EXTRN TEN_TO_X:NEAR
0000 ???? OLD_CW DW ?
0002 ???? NEW_CW DW ?
0004 ???? EXPONENT DW ?
0006 ??????????????????? BCD_RESULT DT ?
?
0010 ??????????????????? BCD_EXPONENT DT ?
?
001A 00E1F505 TEN8 DD 100000000
001E 20 20 20 20 20 20 20 PRINT_STRING DB ' E ',10,13,'$'
20 20 45 20 20 20 20
0A 0D 24
Ôèã. 7.25 Ïðåîáðàçîâàíèå ïëàâàþùåãî ôîðìàòà â òåêñòîâûé (íà÷àëî)
PUBLIC FLOAT_ASCII
;--------------------------------------------
; Ýòà ïðîãðàììà èçâëåêàåò èç âåðøèíû ñòåêà
; ñîïðîöåññîðà 8087 ÷èñëî è âûâîäèò åãî íà
; ýêðàí â ïëàâàþùåì ôîðìàòå.
; Ïàðàìåòðû: ÷èñëî â ST(0)
; Ðåçóëüòàò: èçîáðàæåíèå ÷èñëà íà ýêðàíå;
; ÷èñëî èçâëå÷åíî èç ñòåêà ñîïðîöåññîðà 8087
;--------------------------------------------
002F FLOAT_ASCII PROC NEAR
;-----ST(0)-----;-----ST(1)-----;--ST(2)--
; X ; ? ; ?
002F 9B D9 C0 FLD ST(0) ; X ; X ; ?
0032 9B D9 E1 FABS ; |X| ; X ; ?
0035 9B D9 E8 FLD1 ; 1 ; |X| ; X
0038 9B D9 C9 FXCH ST(1) ; |X| ; 1 ; X
003B 9B D9 F1 FYL2X ; LOG2(X) ; X ; ?
003E 9B D9 E9 FLDL2T ; LOG2(10) ; LOG2(X) ; X
0041 9B DE F1 FDIVRP ST(1),ST(0) ; E=LOGX/LOG10 ; X ; ?
0044 D9 3E 0000 R FNSTCW OLD_CW ; ; ;
0048 9B FWAIT ; ; ;
0049 A1 0000 R MOV AX,OLD_CW ; ; ;
004C 25 F3FF AND AX,NOT 0C00H ; ; ;
004F 0D 0400 OR AX,0400H ; ; ;
0052 A3 0002 R MOV NEW_CW,AX ; ; ;
0055 9B D9 2E 0002 R FLDCW NEW_CW ; ; ;
005A 9B D9 FC FRNDINT ; I = INT(E) ; X ; ?
005D 9B D9 2E 0000 R FLDCW OLD_CW ; ; ;
0062 9B DF 16 0004 R FIST EXPONENT ; I ; X ; ?
0067 9B D9 E0 FCHS ; -I ; X ; ?
006A E8 0000 E CALL TEN_TO_X ; 10 ** (-I) ; X ; ?
006D 9B DE C9 FMULP ST(1),ST(0) ; X/10**I ; ? ; ?
0070 9B DA 0E 001A R FIMUL TEN8 ; Ìàíòèññà ; ? ; ?
0075 9B DF 36 0006 R FBSTP BCD_RESULT ; ? ; ? ; ?
007A 9B DF 06 0004 R FILD EXPONENT ; I ; ? ; ?
007F 9B DF 36 0010 R FBSTP BCD_EXPONENT ; ? ; ? ; ?
;----- Âûâîä íà ýêðàí çíà÷åíèé,çàïîìíåííûõ êàê óïàêîâàííûå
; öåëûå äâîè÷íî-äåñÿòè÷íûå ÷èñëà
0084 FC CLD
0085 8D 3E 001E R LEA DI,PRINT_STRING ; Óêàçàòåëü íà âûâîäèìóþ
; ñòðîêó
0089 A0 000F R MOV AL,BYTE PTR BCD_RESULT+9
008C E8 00C3 R CALL PRINT_SIGN ; Ïå÷àòü çíàêà
008F A0 000A R MOV AL,BYTE PTR BCD_RESULT+4
0092 E8 00DF R CALL PRINT_NYBBLE ; Ïå÷àòü ïåðâîé öèôðû
0095 B0 2E MOV AL,'.' ; Äåñÿòè÷íàÿ òî÷êà
0097 AA STOSB
0098 8D 1E 0009 R LEA BX,BCD_RESULT+3
009C B9 0004 MOV CX,4 ; Ïå÷àòü 8 áàéò (16 öèôð)
009F DO_BYTE: ; ïîñëå äåñÿòè÷íîé òî÷êè
009F E8 00CD R CALL PRINT_BYTE
00A2 E2 FB LOOP DO_BYTE
00A4 B0 45 MOV AL,'E' ; Ñèìâîë ýêñïîíåíòû
00A6 AA STOSB
Ôèã. 7.25 Ïðåîáðàçîâàíèå ïëàâàþùåãî ôîðìàòà â òåêñòîâûé (ïðîäîëæåíèå)
00A7 A0 0019 R MOV AL,BYTE PTR BCD_EXPONENT+9
00AA E8 00C3 R CALL PRINT_SIGN ; Ïå÷àòü çíàêà ýêñïîíåíòû
00AD A0 0011 R MOV AL,BYTE PTR BCD_EXPONENT+1
00B0 E8 00DF R CALL PRINT_NYBBLE ; Ïåðâàÿ öèôðà ýêñïîíåíòû
00B3 8D 1E 0010 R LEA BX,BCD_EXPONENT
00B7 E8 00CD R CALL PRINT_BYTE ; Îñòàâøèåñÿ öèôðû
00BA 8D 16 001E R LEA DX,PRINT_STRING
00BE B4 09 MOV AH,9H
00C0 CD 21 INT 21H ; Âûâîä âñåé ñòðîêè íà ýêðàí
00C2 C3 RET
00C3 FLOAT_ASCII ENDP
;----- Ýòà ïîäïðîãðàììà âûâîäèò ' ' èëè '+'
00C3 PRINT_SIGN PROC NEAR
00C3 3C 00 CMP AL,0 ; Ïðîâåðêà íà çíàê
00C5 B0 20 MOV AL,' ' ; Çàíåñåíèå ïîëîæèòåëüíîãî çíàêà
00C7 74 02 JZ POSITIVE
00C9 B0 2D MOV AL,'-' ; Çàíåñåíèå ìèíóñà
00CB POSITIVE:
00CB AA STOSB ; Ñîõðàíåíèå â âûâîäèìîé ñòðîêå
00CC C3 RET
00CD PRINT_SIGN ENDP
;----- Ýòà ïðîãðàììà ïå÷àòàåò äâå äåñÿòè÷íûå öèôðû,
; íàõîäÿùèåñÿ â ïàìÿòè ïî àäðåñó [BX]
00CD PRINT_BYTE PROC NEAR
00CD 8A 07 MOV AL,[BX] ; Âûáîðêà áàéòà
00CF 51 PUSH CX
00D0 B1 04 MOV CL,4
00D2 D2 E8 SHR AL,CL ; Ñäâèã ñòàðøåé öèôðû
00D4 59 POP CX
00D5 E8 00DF R CALL PRINT_NYBBLE ; Ïå÷àòü ñòàðøåé öèôðû
00D8 8A 07 MOV AL,[BX] ; Âûáîðêà ìëàäøåé öèôðû
00DA E8 00DF R CALL PRINT_NYBBLE ; Ïå÷àòü ìëàäøåé öèôðû
00DD 4B DEC BX ; Ïåðåõîä íà ñëåäóþùóþ ïàðó öèôð
00DE C3 RET
00DF PRINT_BYTE ENDP
;----- Ïå÷àòü îäíîé äåñÿòè÷íîé öèôðû èç ðåãèñòðà AL
00DF PRINT_NYBBLE PROC NEAR
00DF 24 0F AND AL,0FH ; Âûäåëåíèå ìëàäøåé öèôðû
00E1 04 30 ADD AL,'0' ; Ïðåîáðàçîâàíèå â ñèìâîë
00E3 AA STOSB ; Ñîõðàíåíèå â âûâîäèìîé ñòðîêå
00E4 C3 RET
00E5 PRINT_NYBBLE ENDP
00E5 CODE ENDS
END
Ôèã. 7.25 Ïðåîáðàçîâàíèå ïëàâàþùåãî ôîðìàòà â òåêñòîâûé (ïðîäîëæåíèå)
Ïåðâàÿ ÷àñòü ïðîãðàììû îïðåäåëÿåò ïðàâèëüíûé ïîðÿäîê èñõîäíîãî
÷èñëà.  ïðîãðàììå ëîãàðèôì ÷èñëà ïî îñíîâàíèþ 10 íàõîäèòñÿ ñ
ïîìîùüþ ôîðìóëû
Log10(X) = Log2(X)/Log2(10)
Çàòåì îêðóãëÿåòñÿ ïîðÿäîê â íàïðàâëåíèè ìèíóñ áåñêîíå÷íîñòè,
îïÿòü èñïîëüçóÿ óïðàâëåíèå îêðóãëåíèåì. Â ïðåäûäóùåì ïðèìåðå,
âû÷èñëÿÿ 10X, ìû ïîëüçîâàëèñü óìíîæåíèåì äëÿ ïåðåíîñà èñõîäíîãî
÷èñëà â íóæíûé äèàïàçîí. Òåïåðü ìû èñïîëüçóåì êîíñòàíòó TENB
(êîòîðàÿ ñîäåðæèò öåëîå ÷èñëî 108) äëÿ òîãî, ÷òîáû âåðíóòü ÷èñëî â
íóæíûé äèàïàçîí. Íàêîíåö, êîìàíäà FBSTP äâàæäû ïðåîáðàçóåò ÷èñëà â
äåñÿòè÷íîå ïðåäñòàâëåíèå; ñíà÷àëà îíà äàåò íàì äåâÿòü öèôð ìàíòèññû
÷èñëà, à çàòåì - òðè öèôðû ïîðÿäêà.
Îñòàëüíàÿ ÷àñòü ïðîãðàììû âûïîëíÿåò ñèìâîëüíóþ îáðàáîòêó,
íåîáõîäèìóþ äëÿ ïðåîáðàçîâàíèÿ äåñÿòè÷íîãî ïðåäñòàâëåíèÿ â ñòðîêè
ñèìâîëîâ. Ïðîãðàììà îïðåäåëÿåò è ïîêàçûâàåò çíàêè ÷èñëà è ïîðÿäêà.
Îíà ðàñïàêîâûâàåò äåñÿòè÷íûå áàéòû è ïðåîáðàçóåò èõ â ñèìâîëû;
ïîäïðîãðàììà PRINT_BYTE äåëàåò ðàñïàêîâêó, à ïîäïðîãðàììà
PRINT_NYBBLE âûïîëíÿòå ïðåîáðàçîâàíèå â ñèìâîëû. Çàìåòèì, ÷òî â
ýòîì ñëó÷àå íå íóæíà êîìàíäà XLAT, òàê êàê âñå öèôðû èìåþò çíà÷åíèÿ
ìåæäó 0 è 9. (Íî åñëè èñõîäíîå ÷èñëî - îäíî èç íåîïðåäåëåííûõ
÷èñåë, ñèìâîëüíàÿ ñòðîêà áóäåò ñîäåðæàòü íåêîòîðûå íåïîíÿòíûå
ñèìâîëû).
Ýòà ïðîãðàììà âåðíî ïå÷àòàåò ëþáîå ÷èñëî, ëåæàùåå â äèàïàçîíå
äëèííûõ äåéñòâèòåëüíûõ ÷èñåë. Ëþáîå ÷èñëî, âûõîäÿùåå çà ïðåäåëû
âîçìîæíîñòåé ýòîãî ïðåäñòàâëåíèÿ (íàïðèìåð 101234) èìååò ïîëå
ïîðÿäêà, ñîêðàùåííîå äî òðåõ öèôð. Êîíå÷íî, âû ìîæåòå èçìåíèòü
ïðîãðàììó òàê, ÷òîáû îíà îáðàáàòûâàëà ÷åòûðå öèôðû ïîëÿ ïîðÿäêà,
åñëè âû ýòîãî æåëàåòå. Íî ñóùåñòâóåò âñå æå ÷èñëî, êîòîðîå
ïðîãðàììîé îáðàáàòûâàåòñÿ âåðíî, íî âû, âîçìîæíî, ïîæåëàåòåò
èçìåíèòü åãî èçîáðàæåíèå. Åñëè èñõîäíîå ÷èñëî 0, ðåçóëüòàò
ïå÷àòàåòñÿ â âèäå 0.00000000E-932. Òàê ïðîèñõîäèò ïîòîìó, ÷òî ïîëå
ïîðÿäêà èìååò ñìåùåíèå; ïðîöåññîð 8087 ïðåäñòàâëÿåò ÷èñëî 0 ñ
ìèíèìàëüíî âîçìîæíûì ïîðÿäêîì (-4932) è ñ íóëåâîé ìàíòèññîé. Êîãäà
ïðîãðàììà ïðåîáðàçóåò ÷èñëî â êîä ASCII, îíà âåðíî ïå÷àòàåò
ìàíòèññó è ïîðÿäîê (çà èñêëþ÷åíèåì òîãî, ÷òî åé ïðèõîäèòñÿ óñåêàòü
ïîðÿäîê äî òðåõ öèôð). Åñëè âû çàõîòèòå îáðàáàòûâàòü òàêîé ïîðÿäîê
îòäåëüíî, òî èçìåíèòå ïðîãðàììó, âñòàâèâ â íåå ïðîâåðêó íà íóëü
(÷àùå âñåãî, ñ ïîìîùüþ êîìàíäû FTST) â ñàìîì íà÷àëå, ðàññìàòðèâàÿ
ýòî, êàê ñïåöèàëüíûé ñëó÷àé.