Èçîáðàæåíèå ÷èñåë ñ ïëàâàþùåé òî÷êîé

      Ñëåäóþùàÿ ïîäïðîãðàììà áåðåò ÷èñëî èç âåðøèíû ñòåêà è

    ïðåîáðàçóåò åãî â ïå÷àòíóþ ñòðîêó ñèìâîëîâ.  Ôàêòè÷åñêè,

    ïîäïðîãðàììà èçâëåêàåò ÷èñëî ñ âåðøèíû ñòåêà è ïîñûëàåò åãî íà

    äèñïëåé.  Äàëåå ýòà ïîäïðîãðàììà áóäåò èñïîëüçîâàíà â äâóõ ïðèìåðàõ

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

    Ôèã. 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) â ñàìîì íà÷àëå, ðàññìàòðèâàÿ

    ýòî, êàê ñïåöèàëüíûé ñëó÷àé.