Здавалка
Главная | Обратная связь

Теоретические указания



MOVS приемник, источник /MOVSB/MOVSW/MOVSD - пересылка строк байтов/слов/двойных слов в память.

Алгоритм работы: выполнить копирование байта, слова или двойного слова из операнда источника в операнд приемник, при этом адреса элементов предварительно должны быть загружены:

адрес источника — в пару регистров ds:esi/si (ds по умолчанию, допускается замена сегмента);

адрес приемника — в пару регистров es:edi/di (замена сегмента не допускается);

в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:

если df=0, то увеличить содержимое этих регистров на длину структурного элемента последовательности;

если df=1, то уменьшить содержимое этих регистров на длину структурного элемента последовательности;

если есть префикс повторения, то выполнить определяемые им действия (см. команду rep).

Применение: команды пересылают элемент из одной ячейки памяти в другую. Размеры пересылаемых элементов зависят от применяемой команды. Команда movs может работать с элементами размером в байт, слово, двойное слово. В качестве операндов в команде указываются идентификаторы последовательностей этих элементов в памяти. Реально эти идентификаторы используются лишь для получения типов элементов последовательностей, а их адреса должны быть предварительно загружены в указанные выше пары регистров. Транслятор, обработав команду movs и выяснив тип операндов, генерирует одну из машинных команд movsb, movsw или movsd. Для адресации операнда приемник обязательно должен использоваться регистр es.

PRIVATEstr1 db 'str1 копируется в str2'

len_str1=$-str1

a_str1 dd str1

str2 db len_str1 dup (' ')

a_str2 dd str2

...

mov cx, len_str1

lds si, str1

les di, str2

cld

rep movsb

CMPS приемник, источник /CMPSB/CMPSW/CMPSD - сравнение строк байтов/слов/двойных слов в память.

Алгоритм работы: выполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть загружены:

адрес источника — в пару регистров ds:esi/si;

адрес назначения — в пару регистров es:edi/di;

в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:

если df=0, то увеличить содержимое этих регистров на длину элемента последовательности;

если df=1, то уменьшить содержимое этих регистров на длину элемента последовательности;

в зависимости от результата вычитания установить флаги:

если очередные элементы цепочек не равны, то cf=1, zf=0;

если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;

при наличии префикса выполнить определяемые им действия (см. команды repe/repne).

PRIVATE.data

obl1 db 'Строка для сравнения'

obl1 db 'Строка для сравнения'

a_obl1 dd obl1

a_obl2 dd obl2

.code

... cld ;просмотр цепочки в направлении

;возрастания адресов

mov cx,20 ;длина цепочки

lds si,a_obl1 ;адрес источника в пару ds:si

les di,a_obl2 ;адрес назначения в пару ds:si

repe cmpsb ;сравнивать, пока равны

jnz m1 ;если не конец цепочки, то встретились разные элементы

... ;действия, если цепочки совпали

m1: ... ;действия, если цепочки не совпали

SCAS приемник, источник /SCASB/SCASW/SCASD - сканирование строки байтов/слов/двойных слов.ASCII-коррекция после сложения.

Алгоритм работы:

выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di. Замена сегмента es не допускается;

по результату вычитания установить флаги;

изменить значение регистра edi/di на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:

df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;

df=1 — величина отрицательная, то есть просмотр от конца цепочки к ее началу.

Применение: команды сканирования сравнивают значение в регистре eax/ax/al с ячейкой памяти, локализуемой парой регистров es:edi/di. Размер сравниваемого элемента зависит от применяемой команды. Команда scas может работать с элементами размером в байт, слово или двойное слово. В качестве операнда в команде указывается идентификатор последовательности элементов в памяти. Реально этот идентификатор используется лишь для получения типа элементов последовательности, а ее адрес должен быть предварительно загружен в указанную выше пару регистров. Транслятор, обработав команду scas и выяснив тип операндов, генерирует одну из машинных команд:: scasb, scasw или scasd.

LODS приемник, источник /LODSB/LODSW/LODSD - загрузка строки байтов/слов/двойных слов в регистр-аккумулятор al/ax/eax.

Алгоритм работы: загрузить элемент из ячейки памяти, адресуемой парой ds:esi/si, в регистр al/ax/eax. Размер элемента определяется неявно (для команды lods) или явно в соответствии с применяемой командой (для команд lodsb, lodsw, lodsd);

изменить значение регистра si на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:

df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;

df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.

Применение: команды извлекают элемент из ячейки памяти в один из регистров. Перед командой lods можно указать префикс повторения rep, но в этом нет особого смысла, так как обычно эту команду используют в некотором цикле для просмотра некоторой цепочки с элементами фиксированного размера.

STOS приемник, источник /STOSB/STOSW/STOSD - сохранение строки байтов/слов/двойных слов из регистра-аккумулятора al/ax/eax в последовательности (цепочке).

Алгоритм работы: записать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi. Размер элемента определяется неявно (для команды stos) или конкретной применяемой командой (для команд stosb, stosw, stosd);

изменить значение регистра di на величину, равную длине элемента цепочки. Знак этого изменения зависит от состояния флага df:

df=0 — увеличить, что означает просмотр от начала цепочки к ее концу;

df=1 — уменьшить, что означает просмотр от конца цепочки к ее началу.

Применение: команды сохраняют элемент из регистров al/ax/eax в ячейку памяти. Перед командой stos можно указать префикс повторения rep, в этом случае появляется возможность работы с блоками памяти, заполняя их значениями в соответствии с содержимым регистра ecx/cx.

INS приемник, порт /INSB/INSW/INSD - ввод строк байтов/слов/двойных слов из порта.

Алгоритм работы: передать данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:edi/di;

в зависимости от состояния флага df изменить значение регистров edi/di:

если df=0, то увеличить содержимое этих регистров на длину структурного элемента последовательности;

если df=1, то уменьшить содержимое этих регистров на длину структурного элемента последовательности;

при наличии префикса выполнить определяемые им действия (см. команду rep).

Применение: команда вводит данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:edi/di. Сегментная составляющая адреса должна быть обязательно в регистре es. Замена сегментного регистра недопустима. Непосредственное задание порта в команде также недопустимо - для этого используется регистр dx. Размеры вводимых элементов зависят от применяемой команды. Команда ins может работать с элементами размером в байт, слово, двойное слово. В качестве операндов в команде указывается символическое имя ячейки памяти, в которую вводятся элементы из порта ввода-вывода. Реально это символическое имя используется лишь для получения типа элемента последовательности, а его адрес должен быть предварительно загружен в пару регистров es:edi/di. Транслятор, обработав команду ins и выяснив тип операнда, генерирует одну из машинных команд insb, insw или insd.

OUTS порт, источник /OUTSB/OUTSW/OUTSD - вывод строки байтов/слов/двойных слов в порт.

Алгоритм работы: передать данные в порт ввода-вывода, номер которого загружен в регистр dx, из ячейки памяти по адресу ds:esi/si;

в зависимости от состояния флага df изменить значение регистров esi/si:

если df=0, то увеличить содержимое этих регистров на длину структурного элемента последовательности;

если df=1, то уменьшить содержимое этих регистров на длину структурного элемента последовательности;

при наличии префикса выполнить определяемые им deiqrbh

Применение: команда выводит данные в порт ввода-вывода, номер которого загружен в регистр dx, из ячейки памяти по адресу ds:esi/si (допускается замена сегмента). Недопустимо задание номера порта в команде в виде непосредственного операнда — для этого используется регистр dx. Размеры вводимых элементов зависят от применяемой команды. Команда outs может работать с элементами размером в байт, слово или двойное слово. В качестве операнда в команде указывается символическое имя ячейки памяти, из которой элемент выводится в порт ввода-вывода. Реально символическое имя используется лишь для получения типа элемента последовательности, а ее адрес должен быть предварительно загружен в пару регистров ds:esi/si. Транслятор, обработав команду outs и выяснив тип операндов, генерирует одну из машинных команд outsb, outsw или outsd. Машинного аналога для команды outs нет. Для того чтобы эти команды можно было использовать для вывода в порт последовательности элементов, имеющих размерность байт, слово или двойное слово, необходимо использовать префикс rep.

Задания

1. Написать программу запроса имени пользователя (name) и вывести приветствие: «Здравствуй, » + name.

2. Переслать строку (массив) произвольной длины, включив ее в состав другой, более длинной строки. Вывести полученную строку на экран.

3. Сравнить две строки, вывести на экран результат сравнения.

4. Написать программу – перевертыш. Строку ввести с клавиатуры.

5. Проверить, если ли во введенной строке символ «а» и подсчитать, сколько раз он встречается.

6. Сравнить две строки и вывести на экран не совпавшие символы.

7. В данной строке замените несколько подряд встречающихся одинаковых символов одним.

8. Во введенной с клавиатуры строки подсчитать количество слов.

9. Дано слово, необходимо заменить букву «л» на «Н».

 

Вопросы для самоконтроля

1. Алгоритм работы MOVS приемника.

2. Применение CMPS приемника.

3. Перечислить все цепочечные команды.

4. Применение команды STOP приемник.

5. Алгоритм работы STOP приемника.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.