NOTCODE SEGMENT 'CODE'
ASSUME CS:NOTCODE, DS:NOTCODE

proc endl
 mov DL, 10
 call putch
 mov DL, 13
 call putch
ret
endp

proc putch
 mov AH, 02
 int 21H
ret 
endp

proc delim ; Вывод разделителей
 mov DL, 32
 call putch
 mov DL, 45
 call putch
 mov DL, 32
 call putch
ret
endp
 
proc getch
 mov AH, 07
 int 21h
ret 
endp

proc xlec ; прочедура получения hex без словаря
 cmp al, 10 ; 
 jae hier ;больше или равно
 jb lower ;меньше
 hier:
  ;call delim
  add al, 65-10 ; для букв 65(A) - offset 10
  ret
 lower:
  add al, 48 ; для чисел
  ret
ret
endp

proc hex_spl
  mov ch, dl ; копируем dl в ch
  mov cl, dl ; копируем dl в cl
  shl cl, 4 ; отделение low 1, части эквивалентно  add cl, 00001111b
  shr cl, 4 ; отделение low 2,
  shr ch, 4 ; отделение hight части
ret
endp

proc xlet ; альтернатива xlat
 ;push si ; сохраняем si в стек
 ;mov ah, 0 ; чистим ah для 
 ;mov si, ax ; копируем декодируемую цифру в si
 .386
 movzx si, al ; копируем декодируемую цифру в si
 mov al, ds:[si+bx] ; считываем из ds по смещению + адресу
 ;pop si ; востанавливаем из стека
ret
endp

START:
 PUSH CS
 POP DS
 mov cx, 10
 call getch
 mov dl, al
 mov dh, dl ; копируем dl в dh

 m1:
  push cx ; Сохраняем cx в стек
  call putch ; Выводим символ
  call hex_spl
  call delim ; вывод разделителей
  lea bx, HEX_TABLE ;
  mov al, ch ;
  call xlet ;
  ;xlat
  mov dl, al ;
  call putch ;
  mov al, cl ;
  call xlet
  ;xlat
  mov dl, al ;
  call putch ;
  call endl ;
  inc dh ;
  mov dl, dh ;
  pop cx ;
 loop m1

 mov AL, 0
 mov AH, 4CH
 int 21H

HEX_TABLE db '0123456789ABCDEF'
NOTCODE ENDS
END START