 |
Ассемблер в примерах - Команда 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
|  |