Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

86

mov dx,777h lea di,mem mov cx,100

rep insb

...

4.7.7. Команды вывода элемента цепочки в порт ввода-вывода

В эту группу входят следующие команды:

outs порт,источник (Output String) — вывести элементы из цепочки в порт вводавывода;

outsb (OUTput String Byte) — вывести цепочку байт в порт ввода-вывода; outsw (OUTput String Word) — вывести цепочку слов в порт ввода-вывода;

outsd (OUTput String Double Word) — вывести цепочку двойных слов в порт вводавывода.

Данные команды записывают данные в порт ввода-вывода, номер которого должен быть указан в регистре DX, байт (OUTSB), слово (OUTSW) или двойное слово (OUTSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса). После пересылки команда в зависимости от флага направления DF увеличивает (DF=0) или уменьшает (DF=1) содержимое регистра SI/ESI на величину, равную размеру элемента, участвовавшего в операции пересылки.

Команда OUTS в зависимости от типа указанного операнда транслируется в одну из трех форм этой команды без операндов (OUTSB, OUTSW или OUTSD).

В качестве примера ниже показан фрагмент программы, который выводит последовательность символов в порт с номером 340h:

.data

str db "Текст для вывода в порт" len_str=$-str

.code

...

mov dx,340h lea di,str mov cx,len_str

rep outsb

...

4.8. Команды работы с адресами и указателями

В эту группу входят следующие команды:

lea приемник,источник — загрузка эффективного адреса;

lds приемник,источник — загрузка указателя в регистр сегмента данных DS;

les приемник,источник — загрузка указателя в регистр дополнительного сегмента данных ES;

lgs приемник,источник — загрузка указателя в регистр дополнительного сегмента данных GS;

lfs приемник,источник — загрузка указателя в регистр дополнительного сегмента данных FS;

lss приемник,источник — загрузка указателя в регистр сегмента стека SS.

Данные команды также как команда MOV копируют источник в приемник, только в отличие от MOV копируют не данные, а эффективный адрес данных (то есть смещение данных относительно начала сегмента данных).

http://www.sklyaroff.ru

87

Таким образом, источник должен быть ссылкой на ячейку памяти, а в качестве приемника может выступать любой 16-битный регистр, кроме сегментных.

Команда

lea BX,string

эквивалентна команде

mov BX,offset string

Но команда LEA имеет преимущество по сравнению с использованием оператора offset в команде MOV в том, что источник может содержать индексы. Например, следующая команда будет работать без ошибок:

lea BX,string[SI]

в то время как команда

mov BX,offset string[SI]

вызовет ошибку на этапе ассемблирования.

4.9. Команды трансляции (преобразования) по таблице

На самом деле речь здесь пойдет только об одной команде, которая имеет две формы записи:

xlat адрес xlatb

Эта команда преобразует байт согласно таблице преобразований, поэтому часто используется для шифрования методом подстановки.

Команда заменяет значение в регистре AL другим байтом из таблицы в памяти, начальный адрес которой находится в регистре BX. Таблица в памяти — это просто строка байт размером от 1 до 255 байт.

Обратите внимание: аргумент XLAT на самом деле не используется процессором и может выполнять лишь роль комментария. Если комментарий не нужен, можно использовать форму записи XLATB.

Адрес таблицы предварительно должен быть загружен в регистр BX (например, с помощью команды LEA). В AL предварительно должен быть помещен байт, который нужно перевести. Адрес байта в таблице, которым будет производиться замещение содержимого AL, определяется суммой (BX)+(AL), таким образом, первоначальное значение в AL выполняет роль индекса (смещения) в таблице преобразований.

Пример использования:

lea bx, HEX_TABLE

; адрес таблицы – в BX

mov al,7

 

; переводимая цифра – в AL

xlatb

 

; преобразование

; таблица преобразования в сегменте данных

HEX_TABLE

db

'0123456789ABCDEF'

После преобразования в регистре AL будет находиться символ '7'.