comment \ ==================================================== | | | | | Secitani dvou integer cisel | | | | | ==================================================== Program cte ze standardniho vstupniho zarizeni dve cisla integer a tiskne jejich soucet. Ukonceni - prazdna vstupni radka a Enter. Pouzivaji se nazkracene definice segmentu. \ ;=================================================== BUFLEN equ 0F0h OBLEN equ 5 OUTLINE MACRO OL mov AX,seg OL ; segmentova adr. dat mov DS,AX mov AH,09h ; cislo sluzby mov DX,offset OL ; offset dat int 21h ENDM INLINE MACRO IL mov AX,seg IL mov DS,AX ; segmentova adr. bufferu mov AH,0Ah ; cislo sluzby mov DX,offset IL ; offset bufferu int 21h ENDM EXIT MACRO mov AX,4C00h ; kod sluzby + navrat. kod int 21h ENDM ;=================================================== ;======= STACK =================================== STCK SEGMENT STACK DW 200h DUP(?) STCK ENDS ;=================================================== ;======= DAT1 ==================================== DAT1 SEGMENT INBUF DB BUFLEN ; vstupni buffer NCHAR DB ? ; v pozadovanem usporadani INDATA DB BUFLEN DUP(?) OUTBUF DB OBLEN DUP(?) ; vystupni buffer DB 0Dh,0Ah,"$" N1 DW ? ; 1. operand ERRTEXT DB "Chybne cislo",0Dh,0Ah,"$" UVOD DB "Secitani dvou cisel",0Dh,0Ah,"$" CRLF DB 0Dh,0Ah,"$" PROMPT DB ":$" DAT1 ENDS ;=================================================== ;======= SUBSEG ================================== SUBSEG SEGMENT ;--------------------------------------------------- ;------- ADDINT ---------------------------------- ; ADDIND secita cisla v registrech AX a BX ADDINT PROC FAR ; definice procedury ADD AX,BX RET ADDINT ENDP ;--------------------------------------------------- ;------- ININT ----------------------------------- ; ININT cte jedno cislo integer ; ze standardniho vstupu ININT PROC FAR ASSUME CS:SUBSEG ASSUME DS:DAT1 ININT2 LABEL NEAR OUTLINE PROMPT ; vypise ":" INLINE INBUF ; cteni radky ze vstupu OUTLINE CRLF ; odradkovani cmp NCHAR,0 ; nulovy pocet znaku = konec jz IL2 ; bude se koncit ; --- prevod do dvojkove soustavy --- mov CL,NCHAR xor CH,CH ; v CX je pocet prectenych znaku mov SI,0 ; pocatecni index prevadenych dat xor AX,AX ; AX <- 0 xor BX,BX ; BX <- 0 mov BP,10 ; 10 = desitkova soustava IL1: mov BL,INDATA[SI] ; precteny znak sub BL,"0" ; prevod ASCII -> HEX cmp BL,9 ; cislice jsou 0 ... 9 ja IL3 ; neni cislice xchg BX,BP ; odlozeni BX mul BX ; DX.AX <- AX * BX xchg BX,BP ; obnoveni BX add AX,BX inc SI loop IL1 ; opakuje se podle CX clc ; precteno a prevedeno O.K. ret ; IL3: OUTLINE ERRTEXT ; hlaska o chybe jmp ININT2 IL2: stc ; priznak konce - precteno 0 znaku ret ININT ENDP ;--------------------------------------------------- ;----- OUTINT ------------------------------------ ; Prevadi cislo v AX do ASCII a tiskne OUTINT PROC FAR mov DI,OBLEN-1 ; index posledni cislice mov CX,OBLEN ; max. delka cisla mov BX,10 OL1: xor DX,DX ; DX <- 0 div BX ; (DX.AX / BX) -> AX, zbytek -> DX add DL,"0" ; HEX -> ASCII mov OUTBUF[DI],DL ; ulozeni do bufferu dec DI ; postupuje se od zadni cislice loop OL1 OUTLINE OUTBUF ; vystup radky ret OUTINT ENDP ;--------------------------------------------------- SUBSEG ENDS ;=================================================== ;======= MAINSEG ================================= MAINSEG SEGMENT ;--------------------------------------------------- ;----- MAIN -------------------------------------- STRT LABEL ; STRT je vstupni bod programu OUTLINE UVOD ; uvodni text mov AX,DAT1 mov DS,AX ; inicializace DC ASSUME DS:DAT1 ASSUME CS:MAINSEG ML1: call ININT ; cteni 1. cisla jc ML2 ; nastaveny CF -> konec mov N1,AX ; ulozeni do N1 call ININT ; cteni 2. cisla jc ML2 ; nastaveny CF -> konec mov BX,N1 ; druhe cislo je v AX call ADDINT ; secteni AX a BX call OUTINT ; tisk vysledku jmp ML1 ; dalsi opakovani ML2: EXIT ; EXIT MAINSEG ENDS ; konec segmentu MAINS ;===== END ======================================== end STRT