Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Команда xlat

Вопрос:
разбираюсь с командой xlat и хотела написать простейшую программку, но для меня она оказалась не простой. Вот допустим нам нужно ввести число от 0 до 15 в DEC, а затем вывести его на экран в hex виде. То есть уже по имеющейся таблице закодировать число. Хотя без ввода цифры (то есть когда, в al уже занесено число) все получается. Вот тут я что-то вымудряла (1 вариант не получается, а во втором варианте получается):
1.Вариант:
; Перевод цифры от 0 до 15 из DEC в Hex
        .model	tiny ; Модель памяти, используемая для COM
	.code        ; Начало сегмента кода
	.386
	org	100h ; Начальное значение счетчика - 100h
begin:
   xor dx,dx
   mov cx,2
Input:
   mov ah,0
   int 16h
   int 29h
   ror ax,4
   shld dx,ax,4
Loop Input
; Перевод курсора на новую строку
   mov ah,13
   mov al,10
   int 29h
;********************************
   mov ax,dx
; Настроим bx на начало массива Tabl
   lea bx,Tabl
   XLAT         ; al:=Tabl[al]
   mov ah,2
   mov dl,al
   int 21h
; Ждем нажатия клавиши
   xor ah,ah
   int 16h
; Выходим в DOS
   int 20h

Tabl db '0123456789ABCDEF'
end	begin


2.Вариант (здесь получается)
; Перевод цифры от 0 до 15 из DEC в Hex
        .model	tiny ; Модель памяти, используемая для COM
	.code        ; Начало сегмента кода
	.386
	org	100h ; Начальное значение счетчика - 100h
begin:
  mov al,12
; Настроим bx на начало массива Tabl
   lea bx,Tabl
   XLAT         ; al:=Tabl[al]
   mov ah,2
   mov dl,al
   int 21h
; Ждем нажатия клавиши
   xor ah,ah
   int 16h
; Выходим в DOS
   int 20h

Tabl db '0123456789ABCDEF'
end	begin



Ответ:
Займемся строками с помощью которых Вы формируете число:

ror ax,4
shld dx,ax,4

Допустим при вводе числа 14, начинаем смотреть на регистры:
клавиша 1 - AL=31h,AH=02h,DX=0
команда ROR - AL=23h,AH=10h,DX=0000h
команда SHLD - AL=23h,AH=10h,DX=0001h
клавиша 4 - AL=34h,AH=05h,DX=0001h
команда ROR - AL=53h,AH=40h,DX=0001h
команда SHLD - AL=53h,AH=40h,DX=0014h
После выполнения цикла у Вас в регистре DX=0014h находится упакованое двоично-десятичное число, которое не является двоичным представлением введеного числа. Ниже приведенный код вначале распаковывает ( т.е. переводит его к неупакованному виду) и после этого производится коррекция перед делением. Добавте его в свою программу.
mov ax,dx    
shl dx,4   
mov	ah,dh   
and	ax,0f0fh   
aad    
lea bx,Tabl 

   Вперёд
   Содержание
Как можно создать сайт по материалам http://cremi.ru. | перегородки в офис, стеклянные перегородки