Команда перекодировки XLAT преобразует информацию из одного представления в другое. Команда XLAT преобразует значение в регистре AL в другое значение, выбираемое из таблицы, на которую указывает регистр BX. На Фиг.4.4 схематически показано, как работает эта команда. Регистр BX вместе с выбранным сегментным регистром определяет точку начала таблицы перекодировки в памяти. К этому адресу таблицы команда прибавляет содержимое регистра AL, значение между 0 и 255. Данные, расположенные по этому адресу, команда XLAT пересылает в регистр AL. Команда XLAT выполняет операцию просмотра таблицы.
На Фиг. 4.6 показана подпрограмма, которая производит это декодирование. Подпрограмма перекодирования читает начальное значение из порта ввода=вывода, и возвращает кодированное или декодированное значение в вызывающую программу через регистр AL. Одна и та же программа выполняет как кодирование, так и декодирование, меняя таблицы кодировки.
Сначала подпрограмма читает данные из вводного порта 40H в регистр AL. Затем она вычитает значение "0" в коде ASCII из значения данных, чтобы получить цифровое значение. Это означает, что символ "0" дает значение 0 в регистре AL, символ "1" дает 1, и т.д. Команда LDS загружает указатель нужной таблицы в пару регистров DS:BX. Загружая этот указатель из ячейки памяти - вMicrosoft (R) Macro Assembler Version 5.00 1/1/80 04:00:38
Фиг. 4.6 Пример перекодировки Page 1-1
PAGE ,132
TITLE Фиг. 4.6 Пример перекодировки
0000 CODE SEGMENT
ASSUME CS:CODE, DS:CODE
; Эта программа вводит значение из порта 040H и
; декодирует его, используя таблицу перекодировки.
; Так как одна и та же программа используется как для
; кодировки, так и декодировки, указатель TABLE_POINTER
; указывает на соответсвующую таблицу перекодировки.
; Вызывая подпрограмму, необходимо установить
; этот указатель на соответствующую таблицу.
0000 TRANSLATE PROC NEAR ; Подпрограмма TRANSLATE
0000 E4 40 IN AL,040H ; Ввод значения из порта
0002 2C 30 SUB AL,"0" ; Значение относительно символа "0",
; т.е. относительно начала таблицы
0004 C5 1E 000A R LDS BX,TABLE_POINTER ; (DS,BX) указывает на таблицу
0008 D7 XLAT XMIT_TABLE ; Перекодировка числа
0009 C3 RET
000A 000E ---- R TABLE_POINTER DD XMIT_TABLE
000E 35 37 39 31 33 36 38 XMIT_TABLE DB '5791368024'
30 32 34
0018 37 33 38 34 39 30 35 RECV_TABLE DB '7384905162'
31 36 32
0022 TRANSLATE ENDP
0022 CODE ENDS
END
Фиг. 4.6 Пример перекодировки
Итак, команда XLAT является весьма мощным средством перекодировки байтовой или символьной информации. Мощность этой команды делает ее редко используемой, так как возможность использовать ее преимущества возникает не часто. Однако помните об этой команде на тот случай, когда она окажется полностью оправданной.