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


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



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


      Ñëåäóþùàÿ ïîäïðîãðàììà áåðåò ÷èñëî èç âåðøèíû ñòåêà è
    ïðåîáðàçóåò åãî â ïå÷àòíóþ ñòðîêó ñèìâîëîâ.  Ôàêòè÷åñêè,
    ïîäïðîãðàììà èçâëåêàåò ÷èñëî ñ âåðøèíû ñòåêà è ïîñûëàåò åãî íà
    äèñïëåé.  Äàëåå ýòà ïîäïðîãðàììà áóäåò èñïîëüçîâàíà â äâóõ ïðèìåðàõ
    äëÿ âûâîäà èõ ðåçóëüòàòîâ.      Èñõîäíûé òåêñò ïðîãðàììû ïîêàçàí íà
    Ôèã. 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) â ñàìîì íà÷àëå, ðàññìàòðèâàÿ
    ýòî, êàê ñïåöèàëüíûé ñëó÷àé.




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