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

http://www.sklyaroff.ru

 

84

text1

db

"Not many people can do it."

len_text1=$-text1

 

 

mes_yes

db

"Символ найден",'$'

mes_no

db

"Символ не обнаружен",'$'

end start

4.7.4. Команды загрузки элемента из цепочки в аккумулятор

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

lods источник (LOaD String) — загрузить элемент из цепочки в регистр-аккумулятор

AL/AX/EAX;

lodsb (LOaD String Byte) — загрузить байт из цепочки в регистр AL; lodsw (LOaD String Word) — загрузить слово из цепочки в регистр AX;

lodsd (LOaD String Double Word) — загрузить двойное слово из цепочки в регистр

EAX.

Данные команды позволяют извлечь элемент из цепочки и поместить его в регистраккумулятор AL, AX или EAX. Адрес строки должен быть сформирован в регистрах ES:DI (ES:EDI). Размер извлекаемого элемента определяется применяемой командой. Так как за одно выполнение команда загрузки элемента из цепочки занимает регистраккумулятор, то практической пользы от использования префиксов повторения в данном случае нет. Часто команда загрузки элемента из цепочки полностью соответствует команде MOV, хотя MOV генерирует 3 байта машинного кода, а LODS

– только один, но требует инициализации регистра ES:DI (ES:EDI). Команды, эквивалентные команде LODSB:

MOV AL,[SI] INC SI

Пример использования команды lodsb, совместно с инструкцией stosb (см. ниже) показан в листинге 4.3. Данная программа переписывает строку text2 символами строки text1 и выводит новое содержимое text2 на экран.

4.7.5. Команды переноса элемента из аккумулятора

вцепочку

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

stos приемник (STOre String) — сохранить элемент из регистра-аккумулятора

AL/AX/EAX в цепочке;

stosb (STOre String Byte) — сохранить байт из регистра-аккумулятора AL/AX/EAX в цепочке;

stosw (STOre String Word) — сохранить слово из регистра AX в цепочке;

stosd (STOre String Double Word) — сохранить двойное слово из регистра EAX в

цепочке.

Данные команды осуществляют действия обратные команде LODS, то есть извлекают значение из регистра-аккумулятора и помещают его в элемент цепочки. Адрес строки должен адресоваться регистрами ES:DI (ES:EDI).

Префикс повторения с командами переноса элемента из аккумулятора в цепочку обычно используются для заполнения области памяти какими-либо фиксированными значениями.

Пример использования команды stosb показан в листинге 4.3. Данная программа переписывает строку text2 символами строки text1 и выводит новое содержимое text2 на экран.

Листинг 4.3. Замена символов строки (stostr.asm)

.model small

http://www.sklyaroff.ru

 

85

.stack

100h

 

 

 

.code

 

 

 

 

start:

 

 

 

 

mov

ax,@data

 

 

mov

ds,ax

 

 

 

mov

es,ax

 

 

 

cld

 

 

 

 

lea

si,text1

; в SI адрес начала строки text1

lea

di,text2

; в DI адрес начала строки text2

mov

cx,len_text1

; в CX длина строки text1

Mark: lodsb

 

 

; очередной элемент из text1 в AL

stosb

 

 

; очередной элемент из AL в text2

loop

Mark

 

 

 

mov

dx,offset text2 ; выводим строку-приемник

mov

ah,9

 

 

 

int

21h

 

 

 

mov

ax,4C00h

 

 

int

21h

 

 

 

.data

 

 

 

 

text1

db

"Пересылаемая строка$"

len_text1=$-text1

 

 

 

text2

db

"Строка-приемник$"

end start

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

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

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

insb (INput String Byte) — ввести из порта цепочку байт; insw (INput String Word) — ввести из порта цепочку слов;

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

Данные команды считывают данные из порта ввода-вывода, номер которого должен быть указан в регистре DX, байт (INSB), слово (INSW) или двойное слово (INSD) в память по адресу ES:EDI (или ES:DI, в зависимости от разрядности адреса). После пересылки команда в зависимости от флага направления DF увеличивает (DF=0) или уменьшает (DF=1) содержимое регистра DI/EDI на величину, равную размеру элемента, участвовавшего в операции пересылки.

Команда INS в зависимости от типа указанного операнда транслируется в одну из трех форм этой команды без операндов (INSB, INSW или INSD).

.data

mem db 100 dup(" ")

.code

...

push ds pop es