Изучение операторов обмена XCHG и XLAT

Команда обмена XCHG позволяет обменивать содержимое любого общего регистра и ячейки памяти, а также любой пары общих регистров. Пример:

XCHG AL, SEMA; обмен содержимого байта памяти и регистра AL

XCHG CX, [BP]; обмен содержимого слова памяти и регистра CX

XCHG AH, DL; обмен байтами регистр-регистр

XCHG AX, CX; обмен словами регистр-регистр

В команде XCHG нельзя использовать сегментные регистры.

Команда XLAT заменяет содержимое аккумулятора AL на байт из 256 байтов таблицы, начальный адрес которой находится в регистре BX (см.рисунок).

XX (YY)
Алгоритм выполнения команды XLAT

BX
состоит из двух шагов:

а) прибавить содержимое регистра AL к

содержимому регистра BX;

б) использовать результат как смещение

в сегменте данных (относительно DS)

XX поместить адресуемый байт из памяти

YY в регистр AL.

Память

Команда XLAT обычно применяется для быстрого преобразования символов из одного символьного кода в другой. Команда XLAT транслирует содержимое одного байта в другое предопределенное значение. При передачи данных между персональными компьютерами и большими ЭВМ с помощью команды XLAT можно выполнять перекодировку данных между форматами ASCII и EBCDIC.

В следующем примере происходит преобразование цифр от 1 до 9 из кода ASCII в код EBCDIC – как шестнадцатеричные F0…F9. Для команды XLAT необходимо определить таблицу перекодировки. КомандаXLAT предполагает адрес таблицы в регистре BX, а транслируемый байт (напр. поля ASCNO) – в регистре AL. Следующие команды выполняют подготовку и трансляцию байта:

MOV BX, offset XLTBL

MOV AL, ASCNO

XLAT

Команда XLAT использует значение в регистре AL в качестве относительного адреса в таблице, т.е. складывает адрес в BX и смещение в AL. Если, например, 32Н, то адрес соответствующего байта, а таблице будет XLTBL+50. Этот байт содержит значение 0F2H (2 в коде EBCDIC), которое команда XLAT загружается в регистр AL.

Пример использования в программе оператора XLAT.

В данном примере производится преобразования шести значений из таблицы ASCNO (код ASCII) в код XLTАL. Результат заносится в область с начальным адресом ЕВCNO.

ASSUME CS: PREOB, DS: TABL

TABL SEGMENT

ASCNO DB 33H, 35H, 32H, 35H, 37H, 33H

XLTAB DB 0F0H, 0F1H, 0F2H, 0F3H, 0F4H

DB 0F5H, 0F6H, 0F7H, 0F8H, 0F9H

EBCNO DB 6 DUP (?)

TABL ENDS

PREOB SEGMENT

START: MOV AX, TABL; инициализация сегментного

MOV DS,AX; регистра DS

MOV DI, OFFSET EBCNO; адрес таблицы перекодируемых

;элементов заносится в регистр DI

MOV SI, OFFSET ASCNO; адрес таблицы куда заносится рез-т

MOV BX, OFFSET XLTAB; адрес таблицы, с помощью которой

;производится преобразование, заносится в регистр BX

MOV CX, 6; инициализация счетчика числа перекодируемых

;элементов

А20: MOV AL, [SI]; в AL очередной перекодируемый байт

SUB AL, 30H; преобразование ASCII кода в число

XLAT; преобразование содержимого AL в код EBCDIC

MOV [DI], AL; запись преобразованного значения в память

INC DI; смещение указателя адреса памяти на след-й байт

INC SI; смещение указателя адреса памяти на след-й байт

LOOP F20; если CX<>0, переходит на метку А20

RET

PREOB ENDS

END START


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: