Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 1
KEK_5.asm



      1	    0000			 NOTCODE SEGMENT 'CODE'
      2					 ASSUME	CS:NOTCODE, DS:NOTCODE
      3
      4					 ;i=24h
      5					 ;j=10
      6
      7	    0000  C9*(24)		 dstring1 db 0c9h dup (24h) ; c9h 201 bytes, filled with 24h '$'
      8	    00C9  0000			 d_index dw 0;
      9
     10	    00CB  01*(00FF)		 chcol dw 1 dup	(0ffh) ; temp 4	byte var
     11
     12	    00CD  01*(00FF)		 tempw dw 1 dup	(0ffh) ; temp 4	byte var (word)
     13
     14	    00CF  30 31	32 33 34 35 36+	 hex_tab db '0123456789ABCDEF'
     15		  37 38	39 41 42 43 44+
     16		  45 46
     17
     18					 endl macro ; Вывод конца строки
     19					  mov DL, 10
     20					  call putch
     21					  mov DL, 13
     22					  call putch
     23					 endm endl
     24
     25	    00DF			 proc xlec ; прочедура	получения hex без словаря
     26	    00DF  80 FA	0A		  cmp dl, 10 ; compare dl with 10
     27	    00E2  73 02			  jae hier ;больше или	равно if(dl>=10) goto hier;
     28	    00E4  72 04			  jb lower ;меньше if(dl<10) goto	lower;
     29	    00E6			  hier:
     30					   ;call delim
     31	    00E6  80 C2	37		   add dl, 65-10 ; для букв 65(A) - offset 10
     32	    00E9  C3			   ret
     33	    00EA			  lower:
     34	    00EA  80 C2	30		   add dl, 48 ;	для чисел
     35	    00ED  C3			   ret
     36	    00EE  C3			 ret
     37	    00EF			 endp
     38
     39	    00EF			 proc putch  ; display char from dl reg	to screen
     40	    00EF  B4 02			  mov AH, 02
     41	    00F1  CD 21			  int 21H
     42	    00F3  C3			 ret
     43	    00F4			 endp
     44
     45	    00F4			 proc putstr ; display string from var (bx address), until $
     46	    00F4  B4 09			  mov AH, 09
     47	    00F6  CD 21			  int 21H
     48	    00F8  C3			 ret
     49	    00F9			 endp
     50
     51	    00F9			 proc delim ; Вывод разделителей
     52	    00F9  B2 24			  mov DL, 24h ;	"$"
     53	    00FB  E8 FFF1		  call putch ;
     54	    00FE  B2 20			  mov DL, 32 ; " "
     55	    0100  E8 FFEC		  call putch ;
     56	    0103  B2 3D			  mov DL, 3dh ;	"="
     57	    0105  E8 FFE7		  call putch ;
Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 2
KEK_5.asm



     58	    0108  C3			 ret
     59	    0109			 endp
     60
     61	    0109			 proc getch ; get char from keyboard
     62	    0109  B4 07			  mov AH, 07
     63	    010B  CD 21			  int 21h
     64	    010D  C3			 ret
     65	    010E			 endp
     66
     67	    010E			 proc getstr ; get string, using interrupt
     68	    010E  B4 0A			  mov AH, 0Ah
     69	    0110  CD 21			  int 21h
     70	    0112  C3			 ret
     71	    0113			 endp
     72
     73	    0113			 proc getstr2 ;	get string, using loop(jmp) until(cmp) '$'
     74	    0113  BE 0000		  mov si, 0 ; bx = 0;
     75
     76	    0116			  getc:
     77	    0116  83 FE	13		   cmp si, 0013h ; compare si with 09h
     78	    0119  74 11			   je endgc ; if(si == 13h) goto endgc;	19 max area to use
     79	    011B  E8 FFEB		   call	getch ;	get char
     80	    011E  8A D0			   mov dl, al
     81	    0120  E8 FFCC		   call	putch
     82	    0123  88 00			   mov ds:[bx+si], al ;	copy char to ram var
     83
     84	    0125  3C 24			   cmp al, 24h ; compare al with 24h '$'
     85	    0127  74 03			   je endgc ; if(al == 24h) goto endgc;
     86	    0129  46			   inc si ; si++;
     87	    012A  75 EA			   jne getc ; else goto	getc;
     88
     89	    012C			  endgc:
     90	    012C  89 36	00CBr		  mov chcol, si
     91	    0130  C3			 ret
     92	    0131			 endp
     93
     94					 grodb macro tvar, bregl, bregh	; goto ram or die byte
     95					  mov tvar[0], bregl
     96					  mov tvar[1], bregh
     97					 endm
     98
     99					 grodw macro tvar, wreg	; goto ram or die word
    100					  mov tvar, wreg
    101					 endm
    102
    103					 rfrodb	macro tvar, bregl, bregh  ; return from	ram or die byte
    104					  mov bregl, tvar[0]
    105					  mov bregh, tvar[1]
    106					 endm
    107
    108					 rfrodw	macro tvar, wreg  ; return from	ram or die byte
    109					  mov wreg, tvar
    110					 endm
    111
    112	    0131			 proc hex_print	;
    113	    0131  53			 push bx ; backup bx to	stack
    114	    0132  89 0E	00CDr		  mov tempw, cx	; backup cx to ram
Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 3
KEK_5.asm



    115
    116	    0136  8A EA			  mov ch, dl ; копируем	dl в ch
    117	    0138  8A CA			  mov cl, dl ; копируем	dl в cl
    118	    013A  D0 E1	D0 E1 D0 E1 D0+	  shl cl, 4 ; отделение low 1,	части эквивалентно  add cl,	    +
    119		  E1			 00001111b
    120	    0142  D0 E9	D0 E9 D0 E9 D0+	  shr cl, 4 ; отделение low 2,
    121		  E9
    122	    014A  D0 ED	D0 ED D0 ED D0+	  shr ch, 4 ; отделение hight части
    123		  ED
    124
    125					  ;mov dl, ch
    126					  ;call	xlec
    127	    0152  8A C5			  mov al, ch ; move ch to al for xlat
    128	    0154  BB 00CFr		  mov bx, offset hex_tab ; set bx to hex_tab(ram offset)
    129	    0157  D7			  xlat ; convert use hex_tab
    130	    0158  8A D0			  mov dl, al ; copy xlat result	to dl
    131
    132	    015A  E8 FF92		  call putch ; display result
    133
    134					  ;mov dl, cl
    135					  ;call	xlec
    136	    015D  8A C1			  mov al, cl ; move cl to al for xlat
    137	    015F  BB 00CFr		  mov bx, offset hex_tab ; set bx to hex_tab(ram offset)
    138	    0162  D7			  xlat ; convert use hex_tab
    139	    0163  8A D0			  mov dl, al ; copy xlat result	to dl
    140
    141	    0165  E8 FF87		  call putch ; display result
    142
    143	    0168  B2 20			  mov dl, 32 ; print space
    144	    016A  E8 FF82		  call putch
    145
    146	    016D  8B 0E	00CDr		  mov cx, tempw	; restore cx from ram
    147
    148	    0171  5B			 pop bx	; restore bx from stack
    149	    0172  C3			 ret
    150	    0173			 endp
    151
    152					 clrscr	macro ;	Очистка экрана
    153					  mov ah, 00 ; chenge display mod function
    154					  mov al, 3h ; 80x25 vga
    155					  int 10h ; call interrupt
    156					 endm
    157
    158	    0173			 proc HEX ; print str as hex
    159	    0173  B2 20			  mov dl, 32 ; print space
    160	    0175  E8 FF77		  call putch
    161	    0178  BE 0000		  mov si, 0 ; use si as	counter	and set	si to 0
    162	    017B			  phexst:
    163	    017B  8A 10			   mov dl, [bx+si] ; copy from ds[bx+si] ; ram[offset]
    164	    017D  80 FA	24		   cmp dl, 24h ; compare dl and	24h
    165	    0180  74 0C			   je cod_end ;	if(dl == 24h) goto cod_end;
    166	    0182  46			   inc si ; si++
    167	    0183  E8 FFAB		   call	hex_print ; print char as ex
    168	    0186  81 FE	00FE		   cmp si, 00feh ; compare si and FEh
    169	    018A  74 02			   je cod_end ;	if( si == FE) goto cod_end;
    170	    018C  75 ED			   jne phexst ;	if( si != FE) goto phexst;
    171
Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 4
KEK_5.asm



    172	    018E			  cod_end:
    173	    018E  C3			   ret
    174	    018F  C3			 ret
    175	    0190			 endp
    176
    177	    0190			 proc xlet ; альтернатива xlat
    178					  ;push	si ; сохраняем	si в стек
    179					  ;mov ah, 0 ; чистим ah для
    180					  ;mov si, ax ;	копируем декодируемую цифру в	si
    181					  .386
    182	    0190  0F B6	F0		  movzx	si, al ; копируем декодируемую цифру в si
    183	    0193  8A 00			  mov al, ds:[si+bx] ; считываем из ds по смещению	+ адресу
    184					  ;pop si ; востанавливаем из стека
    185	    0195  C3			 ret
    186	    0196			 endp
    187
    188	    0196			 proc putchcol
    189	    0196  83 3E	00CBr 0A	 cmp chcol, 10
    190	    019B  72 17	90 90		 jb lo
    191	    019F  73 02	90 90		 jae hi	;if(dx>=10)
    192	    01A3			  hi:
    193	    01A3  BA 0031		   mov dx, 49
    194	    01A6  E8 FF46		   call	putch
    195	    01A9  8B 16	00CBr		   mov dx, chcol
    196	    01AD  83 C2	26		   add dx, 38
    197	    01B0  E8 FF3C		   call	putch
    198	    01B3  C3			   ret
    199	    01B4			  lo:
    200	    01B4  8B 16	00CBr		   mov dx, chcol
    201	    01B8  83 C2	30		   add dx, 48
    202	    01BB  E8 FF31		   call	putch
    203	    01BE  C3			   ret
    204	    01BF  C3			 ret
    205	    01C0			 endp
    206
    207	    01C0			 START:
    208	    01C0  0E			  PUSH CS
    209	    01C1  1F			  POP DS
    210					  clrscr ; clear screen
1   211	    01C2  B4 00			  mov ah, 00 ; chenge display mod function
1   212	    01C4  B0 03			  mov al, 3h ; 80x25 vga
1   213	    01C6  CD 10			  int 10h ; call interrupt
    214
    215	    01C8  C7 06	00C9r 0000r	  mov d_index, offset dstring1 ; Устанавливаем в d_index смещение	    +
    216					 байт массива dstring1
    217
    218	    01CE  B9 000A		  mov cx, 10 ; m1 loop timer
    219	    01D1			  m1:
    220	    01D1  8B 1E	00C9r		   mov bx, d_index ; restore data offset
    221
    222	    01D5  E8 FF3B		   call	getstr2	; Считываем строку
    223	    01D8  8A 17			   mov dl, [bx]	;
    224	    01DA  80 FA	2A		   cmp dl, 2Ah
    225	    01DD  74 27	90 90		   je disp ; if(ds[bx][0] == '*') goto disp;
    226
    227	    01E1  8B D3			   mov dx, bx ;	копируем значение bx в	dx
    228
Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 5
KEK_5.asm



    229	    01E3  B2 20			   mov dl, 32 ;	' '
    230	    01E5  E8 FF07		   call	putch
    231	    01E8  B2 28			   mov dl, 28h ; '('
    232	    01EA  E8 FF02		   call	putch
    233					   ;mov	dx, chcol ; sym	col
    234					   ;add	dx, 48
    235	    01ED  E8 FFA6		   call	putchcol
    236	    01F0  B2 29			   mov dl, 29h ; ')'
    237	    01F2  E8 FEFA		   call	putch
    238
    239
    240	    01F5  83 06	00C9r 14	   add d_index,	20 ; add 10 to offset
    241
    242					   endl	; Выводим переход	на следующию	строку
1   243	    01FA  B2 0A			  mov DL, 10
1   244	    01FC  E8 FEF0		  call putch
1   245	    01FF  B2 0D			  mov DL, 13
1   246	    0201  E8 FEEB		  call putch
    247
    248	    0204  E2 CB			  loop m1
    249
    250	    0206			  disp:
    251
    252	    0206  C7 06	00C9r 0000r	  mov d_index, offset dstring1 ; Устанавливаем в dx смещение байт +
    253					 массива	dstring1
    254
    255	    020C  B9 000A		  mov cx, 10
    256	    020F			  m2:
    257
    258	    020F  8B 1E	00C9r		   mov bx, d_index
    259
    260	    0213  8A 17			   mov dl, [bx]	;
    261	    0215  80 FA	2A		   cmp dl, 2Ah
    262	    0218  74 1E	90 90		   je endprog ;	if(ds[bx][0] ==	'*') endprog ;
    263
    264					   ;call getstr2 ; Считываем строку
    265
    266	    021C  8B D3			   mov dx, bx ;	копируем значение dx в	bx
    267
    268
    269	    021E  E8 FED3		   call	putstr ; Выводим	строку
    270
    271	    0221  E8 FED5		   call	delim ;	Выводим разделитель
    272
    273	    0224  E8 FF4C		   call	HEX ; выводим строку в HEX формате
    274
    275					   endl	; Выводим переход	на следующию	строку
1   276	    0227  B2 0A			  mov DL, 10
1   277	    0229  E8 FEC3		  call putch
1   278	    022C  B2 0D			  mov DL, 13
1   279	    022E  E8 FEBE		  call putch
    280
    281	    0231  83 06	00C9r 14	   add d_index,	20
    282
    283	    0236  E2 D7			  loop m2
    284
    285	    0238			  endprog:
Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 6
KEK_5.asm



    286
    287	    0238  B8 4C00		  mov ax, 4C00h
    288	    023B  CD 21			  int 21h
    289
    290					 END START
*Warning* KEK_5.asm(272) Open segment: NOTCODE
Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 7
Symbol Table




Symbol Name			  Type	 Value

??DATE				  Text	 "05/15/18"
??FILENAME			  Text	 "KEK_5	  "
??TIME				  Text	 "20:24:51"
??VERSION			  Number 030A
@CPU				  Text	 0F0FH
@CURSEG				  Text	 NOTCODE
@FILENAME			  Text	 KEK_5
@WORDSIZE			  Text	 4
CHCOL				  Word	 NOTCODE:00CB
COD_END				  Near	 NOTCODE:018E
DELIM				  Near	 NOTCODE:00F9
DISP				  Near	 NOTCODE:0206
DSTRING1			  Byte	 NOTCODE:0000
D_INDEX				  Word	 NOTCODE:00C9
ENDGC				  Near	 NOTCODE:012C
ENDPROG				  Near	 NOTCODE:0238
GETC				  Near	 NOTCODE:0116
GETCH				  Near	 NOTCODE:0109
GETSTR				  Near	 NOTCODE:010E
GETSTR2				  Near	 NOTCODE:0113
HEX				  Near	 NOTCODE:0173
HEX_PRINT			  Near	 NOTCODE:0131
HEX_TAB				  Byte	 NOTCODE:00CF
HI				  Near	 NOTCODE:01A3
HIER				  Near	 NOTCODE:00E6
LO				  Near	 NOTCODE:01B4
LOWER				  Near	 NOTCODE:00EA
M1				  Near	 NOTCODE:01D1
M2				  Near	 NOTCODE:020F
PHEXST				  Near	 NOTCODE:017B
PUTCH				  Near	 NOTCODE:00EF
PUTCHCOL			  Near	 NOTCODE:0196
PUTSTR				  Near	 NOTCODE:00F4
START				  Near	 NOTCODE:01C0
TEMPW				  Word	 NOTCODE:00CD
XLEC				  Near	 NOTCODE:00DF
XLET				  Near	 NOTCODE:0190

Macro Name

CLRSCR
ENDL
GRODB
GRODW
RFRODB
RFRODW

Groups & Segments		  Bit Size Align  Combine Class

NOTCODE				  16  023D Para	  none	  CODE
Turbo Assembler	 Version 3.1	    05/15/18 20:24:51	    Page 8
Error Summary



*Warning* KEK_5.asm(272) Open segment: NOTCODE
