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


Êâàäðàòíîå óðàâíåíèå



Êâàäðàòíîå óðàâíåíèå


      Òåïåðü ïðèâåäåì äâà ïðèìåðà, èñïîëüçóþùèõ ïðîãðàììó èíäèêàöèè
    ÷èñåë ñ ïëàâàþùåé òî÷êîé.  Ïåðâûé ïðèìåð - ðåøåíèå êâàäðàòíîãî
    óðàâíåíèÿ.    Íàéäåì êîðíè óðàâíåíèÿ, çàäàâàåìîãî ñëåäóþùåé ôîðìóëîé
 
      0 = A*X**2 + B*X + C
 
      Èç øêîëüíîãî êóðñà ìàòåìàòèêè èçâåñòíî, ÷òî ðåøåíèå ýòîãî
    óðàâíåíèÿ
 
      X = ( -B +- SQR( B**2 - 4*A*C))/(2*A)
 
      Ïðîãðàììà ðåøåíèÿ ýòîãî óðàâíåíèÿ î÷åâèäíà è ïîêàçàíà íà


    Ôèã. 7.26.    Â íåé ïðåäïîëàãàåòñÿ, ÷òî âñå òðè ïàðàìåòðà A, B è C
    çàïèñàíû â âèäå öåëûõ ÷èñåë.  Êîíå÷íî, åñëè âû áóäåòå èñïîëüçîâàü
    ïðîãðàììó íå òîëüêî êàê ïðèìåð, íóæíî îðãàíèçîâàòü ïðîöåäóðó ââîäà
    ðàçëè÷íûõ êîýôôèöèåíòîâ.
 

           Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:04:54
           Ôèã. 7.26 Âû÷èñëåíèå êîðíåé êâàäðàòíîãî óðàâíåíèÿ            Page   1-1
 
                                         PAGE    ,132
                                         TITLE   Ôèã. 7.26 Âû÷èñëåíèå êîðíåé êâàäðàòíîãî óðàâíåíèÿ
 
            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             A           DW      1
            0002  FFFB             B           DW      -5
            0004  0006             C           DW      6
            0006  ????             STATUS  DW      ?
            0008  0004             FOUR    DW      4
            000A  0002             TWO     DW      2
            000C  8C AD A8 AC EB A5 20     ERROR_MSG       DB      'Ìíèìûå êîðíè',10,13,'$'
                AA AE E0 AD A8 0A 0D
                24
            001B                   QUADRATIC         PROC    FAR
            001B  1E                           PUSH    DS        ; Ñîõðàíåíèå àäðåñà âîçâðàòà
            001C  2B C0                  SUB     AX,AX
            001E  50                           PUSH    AX
            001F  8C C8                  MOV     AX,CS
            0021  8E D8                  MOV     DS,AX
            0023  8E C0                  MOV     ES,AX
 
            0025  9B DB E3                     FINIT             ;-----ST(0)-----;-----ST(1)------
            0028  9B DF 06 0002 R              FILD    B               ; B         ; ?
            002D  9B D8 8E 0000                FMUL    ST(0)           ; B**2      ; ?
            0032  9B DF 06 0000 R              FILD    A               ; A         ; B**2
            0037  9B DE 0E 0008 R              FIMUL   FOUR      ; 4*A       ; B**2
            003C  9B DE 0E 0004 R              FIMUL   C               ; 4*A*C           ; B**2
            0041  9B DE E1                     FSUBRP  ST(1),ST(0)    ; D=B**2-4*A*C  ; ?
            0044  9B D9 E4                     FTST
            0047  9B DD 3E 0006 R              FSTSW   STATUS
            004C  9B                           FWAIT
            004D  8A 26 0007 R                 MOV     AH,BYTE PTR STATUS+1
            0051  9E                           SAHF
            0052  72 37                  JB      IMAGINARY
            0054  9B D9 FA                     FSQRT             ; SQR(D)          ;
 
          Ôèã. 7.26 Âû÷èñëåíèå êîðíåé êâàäðàòíîãî óðàâíåíèÿ (íà÷àëî)
            0057  9B D9 C0                     FLD     ST(0)           ; SQR(D)          ; SQR(D)
            005A  9B D9 E0                     FCHS              ; -SQR(D)         ; SQR(D)
            005D  9B DE 06 0002 R              FIADD   B               ; B-SQR(D)      ; SQR(D)
            0062  9B D9 E0                     FCHS              ; -B+SQR(D)     ; SQR(D)
            0065  9B D9 C9                     FXCH    ST(1)           ; SQR(D)          ; -B+SQR(D)
            0068  9B DE 06 0002 R              FIADD   B               ; B+SQR(D)      ; -B+SQR(D)
            006D  9B D9 E0                     FCHS              ; N1=-B-SQR(D)  ; N2=-B+SQR(D)
            0070  9B DE 36 0000 R              FIDIV   A               ; N1/A      ; N2
            0075  9B DE 36 000A R              FIDIV   TWO       ; ROOT1=N1/2*A  ; N2
            007A  E8 0000 E                    CALL    FLOAT_ASCII     ; N2        ; ?
            007D  9B DE 36 0000 R              FIDIV   A               ; N2/A      ; ?
            0082  9B DE 36 000A R              FIDIV   TWO       ; ROOT2=N2/2*A  ; ?
            0087  E8 0000 E                    CALL    FLOAT_ASCII     ; ?         ; ?
            008A  CB                           RET
            008B                   IMAGINARY:
            008B  8D 16 000C R                 LEA     DX,ERROR_MSG
            008F  B4 09                  MOV     AH,9H
            0091  CD 21                  INT     21H       ; Âûâîä ñîîáùåíèÿ îá îøèáêå
            0093  CB                           RET
            0094                   QUADRATIC         ENDP
            0094                   CODE    ENDS
                                         END     QUADRATIC
 
          Ôèã. 7.26 Âû÷èñëåíèå êîðíåé êâàäðàòíîãî óðàâíåíèÿ (ïðîäîëæåíèå)
 
       ïðèìåðå îòñóòñòâóåò îáðàáîòêà êîìïëåêñíûõ ÷èñåë, íî èìååòñÿ
    ïðîâåðêà äèñêðèìèíàíòà (B**2 - 4*A*C) íà îòðèöàòåëüíîñòü, è åñëè ýòî
    ÷èñëî îòðèöàòåëüíî, ïðîãðàììà çàâåøàåòñÿ ñ ñîîáùåíèåì îá îøèáêå.
    Ìîæíî áûëî áû ââåñòè â ïðîãðàììó êîìïëåêñíóþ àðèôìåòèêó, òåì íå
    ìåíåå, åå íåò â äàííîì ïðèìåðå.  Íåîáõîäèìî ïîìíèòü, ÷òî
    ñîïðîöåññîð 8087 íå îáðàáàòûâàåò àâòîìàòè÷åñêè êîìïëåêñíûå èëè
    ìíèìûå ÷èñëà, è íóæíî ïèñàòü ïðîãðàììó ðàçäåëüíîé îáðàáîòêè
    äåéñòâèòåëüíîé è ìíèìîé ÷àñòåé êîìïëåêñíîãî ÷èñëà.
 
      Êîìàíäà FTST ïðîâåðÿåò äèñêðèìèíàíò íà îòðèöàòåëüíîñòü; îíà
    ïîäîáíà ñðàâíåíèþ ñ âñòðîåííûì íóëåâûì îïåðàíäîì èñòî÷íèêà.
    Ïðîãðàììà çàïèñûâàåò ñëîâî ñîñòîÿíèÿ â ïàìÿòü, à çàòåì çàãðóæàåò
    åãî â ðåãèñòð ôëàãîâ ìèêðîïðîöåññîðà 8088.  Ïîñëå ýòîãî äåëàåòñÿ
    ïðîâåðêà JB (ïåðåõîä, åñëè ìåíüøå), îïðåäåëÿþùàÿ, ìåíüøå ëè íóëÿ
    äèñêðèìèíàíò.  Îñòàâøàÿñÿ ÷àñòü ïðîãðàììû ïðîäåëûâàåò ðàáîòó ïî
    âû÷èñëåíèþ äâóõ êîðíåé óðàâíåíèÿ, è çäåñü èñïîëüçóåòñÿ òî
    ïðåèìóùåñòâî, ÷òî êîýôôèöèåíòû íàõîäÿòñÿ â ïàìÿòè.      Òàêîé ïîäõîä
    ìèíèìèçèðóåò îáúåì èñïîëüçóåìîãî â ñîïðîöåññîðå 8087 ñòåêà.  Íî
    åñëè âû ïåðåäåëàåòå ýòó ïðîãðàììó òàê, ÷òî îíà áóäåò ïîäïðîãðàììîé,
    âûçûâàåìîé èç äðóãîé ïðîãðàììû, âàì, âåðîÿòíî, çàõî÷åòñÿ ïåðåäàâàòü
    ïàðàìåòðû åé ñ ïîìîùüþ ñòåêà ñîïðîöåññîðà 8087.   ýòîì ñëó÷àå
    ïîòðåáóåòñÿ äðóãîé ñïîñîá äëÿ çàãðóçêè ïîäïðîãðàììîé íåêîòîðûõ
    âåëè÷èí.




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