Команда обмена XCHG позволяет обменивать содержимое любого общего регистра и ячейки памяти, а также любой пары общих регистров. Пример:
XCHG AL, SEMA; обмен содержимого байта памяти и регистра AL
XCHG CX, [BP]; обмен содержимого слова памяти и регистра CX
XCHG AH, DL; обмен байтами регистр-регистр
XCHG AX, CX; обмен словами регистр-регистр
В команде XCHG нельзя использовать сегментные регистры.
Команда XLAT заменяет содержимое аккумулятора AL на байт из 256 байтов таблицы, начальный адрес которой находится в регистре 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