Turbo Assembler Version 3.1 10/25/00 15:38:49 Page 1 p1.asm 1 comment \ 2 ==================================================== 3 | | 4 | | 5 | Secitani dvou integer cisel | 6 | | 7 | | 8 ==================================================== 9 10 Program cte ze standardniho vstupniho zarizeni dve 11 cisla integer a tiskne jejich soucet. 12 Ukonceni - prazdna vstupni radka a Enter. 13 14 Pouzivaji se nazkracene definice segmentu. 15 16 \ 17 18 ;=================================================== 19 20 =00F0 BUFLEN equ 0F0h 21 =0005 OBLEN equ 5 22 23 OUTLINE MACRO OL 24 mov AX,seg OL ; segmentova adr. dat 25 mov DS,AX 26 mov AH,09h ; cislo sluzby 27 mov DX,offset OL ; offset dat 28 int 21h 29 ENDM 30 31 INLINE MACRO IL 32 mov AX,seg IL 33 mov DS,AX ; segmentova adr. bufferu 34 mov AH,0Ah ; cislo sluzby 35 mov DX,offset IL ; offset bufferu 36 int 21h 37 ENDM 38 39 EXIT MACRO 40 mov AX,4C00h ; kod sluzby + navrat. kod 41 int 21h 42 ENDM 43 44 ;=================================================== 45 ;======= STACK =================================== 46 47 0000 STCK SEGMENT STACK 48 0000 0200*(????) DW 200h DUP(?) 49 0400 STCK ENDS 50 51 ;=================================================== 52 ;======= DAT1 ==================================== 53 0000 DAT1 SEGMENT 54 55 0000 F0 INBUF DB BUFLEN ; vstupni buffer 56 0001 ?? NCHAR DB ? ; v pozadovanem usporadani 57 0002 F0*(??) INDATA DB BUFLEN DUP(?) Turbo Assembler Version 3.1 10/25/00 15:38:49 Page 2 p1.asm 58 59 00F2 05*(??) OUTBUF DB OBLEN DUP(?) ; vystupni buffer 60 00F7 0D 0A 24 DB 0Dh,0Ah,"$" 61 62 00FA ???? N1 DW ? ; 1. operand 63 64 00FC 43 68 79 62 6E 65 20+ ERRTEXT DB "Chybne cislo",0Dh,0Ah,"$" 65 63 69 73 6C 6F 0D 0A+ 66 24 67 010B 53 65 63 69 74 61 6E+ UVOD DB "Secitani dvou cisel",0Dh,0Ah,"$" 68 69 20 64 76 6F 75 20+ 69 63 69 73 65 6C 0D 0A+ 70 24 71 0121 0D 0A 24 CRLF DB 0Dh,0Ah,"$" 72 0124 3A 24 PROMPT DB ":$" 73 74 0126 DAT1 ENDS 75 76 ;=================================================== 77 ;======= SUBSEG ================================== 78 79 0000 SUBSEG SEGMENT 80 81 ;--------------------------------------------------- 82 ;------- ADDINT ---------------------------------- 83 84 ; ADDIND secita cisla v registrech AX a BX 85 86 0000 ADDINT PROC FAR ; definice procedury 87 0000 03 C3 ADD AX,BX 88 0002 CB RET 89 0003 ADDINT ENDP 90 91 ;--------------------------------------------------- 92 ;------- ININT ----------------------------------- 93 94 ; ININT cte jedno cislo integer 95 ; ze standardniho vstupu 96 97 0003 ININT PROC FAR 98 99 ASSUME CS:SUBSEG 100 ASSUME DS:DAT1 101 102 0003 ININT2 LABEL NEAR 103 104 OUTLINE PROMPT ; vypise ":" 1 105 0003 B8 0000s mov AX,seg PROMPT ; segmentova adr. dat 1 106 0006 8E D8 mov DS,AX 1 107 0008 B4 09 mov AH,09h ; cislo sluzby 1 108 000A BA 0124r mov DX,offset PROMPT ; offset dat 1 109 000D CD 21 int 21h 110 INLINE INBUF ; cteni radky ze vstupu 1 111 000F B8 0000s mov AX,seg INBUF 1 112 0012 8E D8 mov DS,AX ; segmentova adr. bufferu 1 113 0014 B4 0A mov AH,0Ah ; cislo sluzby 1 114 0016 BA 0000r mov DX,offset INBUF ; offset bufferu Turbo Assembler Version 3.1 10/25/00 15:38:49 Page 3 p1.asm 1 115 0019 CD 21 int 21h 116 OUTLINE CRLF ; odradkovani 1 117 001B B8 0000s mov AX,seg CRLF ; segmentova adr. dat 1 118 001E 8E D8 mov DS,AX 1 119 0020 B4 09 mov AH,09h ; cislo sluzby 1 120 0022 BA 0121r mov DX,offset CRLF ; offset dat 1 121 0025 CD 21 int 21h 122 123 0027 80 3E 0001r 00 cmp NCHAR,0 ; nulovy pocet znaku = konec 124 002C 74 37 jz IL2 ; bude se koncit 125 126 ; --- prevod do dvojkove soustavy --- 127 002E 8A 0E 0001r mov CL,NCHAR 128 0032 32 ED xor CH,CH ; v CX je pocet prectenych znaku 129 130 0034 BE 0000 mov SI,0 ; pocatecni index prevadenych dat 131 0037 33 C0 xor AX,AX ; AX <- 0 132 0039 33 DB xor BX,BX ; BX <- 0 133 003B BD 000A mov BP,10 ; 10 = desitkova soustava 134 135 003E 8A 9C 0002r IL1: mov BL,INDATA[SI] ; precteny znak 136 0042 80 EB 30 sub BL,"0" ; prevod ASCII -> HEX 137 0045 80 FB 09 cmp BL,9 ; cislice jsou 0 ... 9 138 0048 77 0D ja IL3 ; neni cislice 139 140 004A 87 DD xchg BX,BP ; odlozeni BX 141 004C F7 E3 mul BX ; DX.AX <- AX * BX 142 004E 87 DD xchg BX,BP ; obnoveni BX 143 0050 03 C3 add AX,BX 144 0052 46 inc SI 145 0053 E2 E9 loop IL1 ; opakuje se podle CX 146 147 0055 F8 clc ; precteno a prevedeno O.K. 148 0056 CB ret 149 ; 150 0057 IL3: OUTLINE ERRTEXT ; hlaska o chybe 1 151 0057 B8 0000s mov AX,seg ERRTEXT ; segmentova adr. dat 1 152 005A 8E D8 mov DS,AX 1 153 005C B4 09 mov AH,09h ; cislo sluzby 1 154 005E BA 00FCr mov DX,offset ERRTEXT ; offset dat 1 155 0061 CD 21 int 21h 156 0063 EB 9E jmp ININT2 157 158 0065 F9 IL2: stc ; priznak konce - precteno 0 znaku 159 0066 CB ret 160 161 0067 ININT ENDP 162 163 ;--------------------------------------------------- 164 ;----- OUTINT ------------------------------------ 165 166 ; Prevadi cislo v AX do ASCII a tiskne 167 168 0067 OUTINT PROC FAR 169 170 0067 BF 0004 mov DI,OBLEN-1 ; index posledni cislice 171 006A B9 0005 mov CX,OBLEN ; max. delka cisla Turbo Assembler Version 3.1 10/25/00 15:38:49 Page 4 p1.asm 172 006D BB 000A mov BX,10 173 174 0070 33 D2 OL1: xor DX,DX ; DX <- 0 175 0072 F7 F3 div BX ; (DX.AX / BX) -> AX, zbytek -> DX 176 0074 80 C2 30 add DL,"0" ; HEX -> ASCII 177 0077 88 95 00F2r mov OUTBUF[DI],DL ; ulozeni do bufferu 178 007B 4F dec DI ; postupuje se od zadni cislice 179 007C E2 F2 loop OL1 180 181 OUTLINE OUTBUF ; vystup radky 1 182 007E B8 0000s mov AX,seg OUTBUF ; segmentova adr. dat 1 183 0081 8E D8 mov DS,AX 1 184 0083 B4 09 mov AH,09h ; cislo sluzby 1 185 0085 BA 00F2r mov DX,offset OUTBUF ; offset dat 1 186 0088 CD 21 int 21h 187 188 008A CB ret 189 190 008B OUTINT ENDP 191 192 ;--------------------------------------------------- 193 194 008B SUBSEG ENDS 195 196 ;=================================================== 197 ;======= MAINSEG ================================= 198 199 0000 MAINSEG SEGMENT 200 201 ;--------------------------------------------------- 202 ;----- MAIN -------------------------------------- 203 204 0000 STRT LABEL ; STRT je vstupni bod programu 205 206 OUTLINE UVOD ; uvodni text 1 207 0000 B8 0000s mov AX,seg UVOD ; segmentova adr. dat 1 208 0003 8E D8 mov DS,AX 1 209 0005 B4 09 mov AH,09h ; cislo sluzby 1 210 0007 BA 010Br mov DX,offset UVOD ; offset dat 1 211 000A CD 21 int 21h 212 213 000C B8 0000s mov AX,DAT1 214 000F 8E D8 mov DS,AX ; inicializace DC 215 ASSUME DS:DAT1 216 ASSUME CS:MAINSEG 217 218 0011 9A 00000003sr ML1: call ININT ; cteni 1. cisla 219 0016 72 1A jc ML2 ; nastaveny CF -> konec 220 0018 A3 00FAr mov N1,AX ; ulozeni do N1 221 222 001B 9A 00000003sr call ININT ; cteni 2. cisla 223 0020 72 10 jc ML2 ; nastaveny CF -> konec 224 225 0022 8B 1E 00FAr mov BX,N1 ; druhe cislo je v AX 226 0026 9A 00000000sr call ADDINT ; secteni AX a BX 227 228 002B 9A 00000067sr call OUTINT ; tisk vysledku Turbo Assembler Version 3.1 10/25/00 15:38:49 Page 5 p1.asm 229 0030 EB DF jmp ML1 ; dalsi opakovani 230 231 0032 ML2: EXIT ; EXIT 1 232 0032 B8 4C00 mov AX,4C00h ; kod sluzby + navrat. kod 1 233 0035 CD 21 int 21h 234 235 0037 MAINSEG ENDS ; konec segmentu MAINS 236 237 ;===== END ======================================== 238 239 end STRT Turbo Assembler Version 3.1 10/25/00 15:38:49 Page 6 Symbol Table Symbol Name Type Value ??DATE Text "10/25/00" ??FILENAME Text "p1 " ??TIME Text "15:38:49" ??VERSION Number 030A @CPU Text 0101H @CURSEG Text MAINSEG @FILENAME Text P1 @WORDSIZE Text 2 ADDINT Far SUBSEG:0000 BUFLEN Number 00F0 CRLF Byte DAT1:0121 ERRTEXT Byte DAT1:00FC IL1 Near SUBSEG:003E IL2 Near SUBSEG:0065 IL3 Near SUBSEG:0057 INBUF Byte DAT1:0000 INDATA Byte DAT1:0002 ININT Far SUBSEG:0003 ININT2 Near SUBSEG:0003 ML1 Near MAINSEG:0011 ML2 Near MAINSEG:0032 N1 Word DAT1:00FA NCHAR Byte DAT1:0001 OBLEN Number 0005 OL1 Near SUBSEG:0070 OUTBUF Byte DAT1:00F2 OUTINT Far SUBSEG:0067 PROMPT Byte DAT1:0124 STRT Word MAINSEG:0000 UVOD Byte DAT1:010B Macro Name EXIT INLINE OUTLINE Groups & Segments Bit Size Align Combine Class DAT1 16 0126 Para none MAINSEG 16 0037 Para none STCK 16 0400 Para Stack SUBSEG 16 008B Para none