
3к5с Архитектура информационных систем / МУ ПР 6
.pdfАПРОБАЦИЯ
Министерство образования и науки Российской Федерации
Саратовский государственный технический университет
Балаковский институт техники, технологии и управления
ЦЕПОЧЕЧНЫЕ КОМАНДЫ АССЕМБЛЕРА
Методические указания к выполнению лабораторной работы по дисциплине «Архитектура ЭВМ и систем» для студентов очного
обучения специальности 230201 и направления 230400.
Одобрено
редакционно-издательским советом
Балаковского института техники,
технологии и управления
Балаково 2011
Цель работы — изучение цепочных команд, используемых для обра-
ботки символьных данных.
ОСНОВНЫЕ ПОНЯТИЯ
Под строкой символов в языке ассемблера понимается последова-
тельность байтов, а цепочка — это более общее название для случаев, ко-
гда размер элемента последовательности превышает байт и составляет слово или двойное слово.
Всего в системе команд процессора поддерживаются семь операций-
примитивов обработки цепочек. Каждая из них реализуется в процессоре тремя командами, в свою очередь, каждая из этих команд работает с соот-
ветствующим размером элемента — байтом, словом или двойным словом.
Особенность всех цепочечных команд в том, что они, кроме обработки те-
кущего элемента цепочки, корректируют содержимое определенных реги-
стров с тем, чтобы автоматически продвинуться к следующему элементу цепочки.
Основные операции-примитивы обработки цепочек:
пересылка цепочки;
сравнение цепочек;
сканирование цепочки;
загрузка элемента из цепочки;
сохранение элемента в цепочке;
получение элементов цепочки из порта ввода-вывода;
вывод элементов цепочки в порт ввода-вывода.
Логически к этим командам можно отнести и так называемые пре-
фиксы повторения. Они предназначены для использования цепочечными командами.
Эти префиксы повторения указываются перед нужной цепочечной командой в поле метки. Цепочечная команда без префикса выполняется один раз. Размещение префикса перед цепочечной командой заставляет ее
2
выполняться в цикле. Различия приведенных префиксов — в основании, по которому принимается решение о циклическом выполнении цепочечной команды: по состоянию регистра ЕСХ/СХ или по флагу нуля ZF.
Префикс повторения REP (REPeat) используется с командами, реа-
лизующими операции-примитивы пересылки и сохранения элементов це-
почек, — соответственно, MOVS и STOS. Префикс REP заставляет данные команды выполняться, пока содержимое в ЕСХ/СХ не станет равным 0.
При этом цепочечная команда, перед которой стоит префикс, автоматиче-
ски уменьшает содержимое ЕСХ/СХ на единицу. Та же команда, но без префикса, этого не делает.
Префиксы повторения REPE (REPeat while Equal) и REPZ (REPeat while Zero) являются абсолютными синонимами. Они заставляют цепочеч-
ную команду выполняться до тех пор, пока содержимое ЕСХ/сх не равно 0
или флаг ZF равен 1. Как только одно из этих условий нарушается, управ-
ление передается следующей команде программы. Благодаря возможности анализа флага ZF наиболее эффективно эти префиксы можно использовать с командами CMPS и SCAS для поиска различающихся элементов цепо-
чек.
Префиксы повторения REPNE (REPeat while Not Equal) и REPNZ
(REPeat while Not Zero) также являются абсолютными синонимами. Их действие на цепочечную команду несколько отличается от действий пре-
фиксов REPE/REPZ. Префиксы REPNE/REPNZ заставляют цепочечную команду циклически выполняться до тех пор, пока содержимое ЕСХ/СХ не равно нулю или флаг ZF равен нулю. При нарушении одного из этих усло-
вий работа команды прекращается. Данные префиксы также можно ис-
пользовать с командами CMPS и SCAS, но для поиска совпадающих эле-
ментов цепочек.
Цепочка-источник, адресуемая операндом адрес_источника, может находиться в текущем сегменте данных, определяемом регистром DS. Це-
3
почка-приемник, адресуемая операндом адрес_приемника, должна быть в дополнительном сегменте данных, адресуемом сегментным регистром ES.
Допускается замена (с помощью префикса замены сегмента) только реги-
стра DS, регистр ES подменять нельзя. Вторые части адресов (смещения цепочек) также находятся в строго определенных местах. Для цепочки-
источника это регистр ESI/SI (Source Index register — индексный регистр источника). Для цепочки-получателя это регистр EDI/DI (Destination Index register — индексный регистр приемника).
Полные физические адреса для операндов цепочечных команд сле-
дующие:
адрес_источника — пара ds:esi/si;
адрес_приемника — пара es:edi/di.
Команды, реализующие операцию-примитив пересылки цепочек,
производят копирование элементов из одной области памяти (цепочки) в
другую. Размер элемента определяется применяемой командой. Ассемблер предоставляет в распоряжение программиста четыре команды, работаю-
щие с разными размерами элементов цепочки:
MOVS адрес_приемника,адрес_источника — переслать цепочку
(MOVe String);
MOVSB — переслать цепочку байтов (MOVe String Byte);
MOVSW — переслать цепочку слов (MOVe String Word);
MOVSD — переслать цепочку двойных слов (MOVe String
Double word).
Команды, реализующие операцию-примитив сравнения цепочек,
производят сравнение элементов цепочки-источника с элементами цепоч-
ки-приемника. Ситуация с набором команд и методами работы с ними ана-
логична операции-примитиву пересылки цепочек. Команды сравнения цепочек, работающие с разными размерами элементов цепочки:
4
CMPS адрес_приемника,адрес_источника — сравнить строки
(CoMPare String);
CMPSB — сравнить строку байтов (CoMPare String Byte);
CMPSW — сравнить строку слов (CoMPare String Word);
CMPSD — сравнить строку двойных слов (CoMPare String
Double word).
Команды, реализующие операцию-примитив сканирования цепочек,
производят поиск некоторого значения в области памяти. Логически эта область памяти рассматривается как последовательность (цепочка) эле-
ментов фиксированной длины размером 8, 16 или 32 бита. Искомое значе-
ние предварительно должно быть помещено в один из регистров
AL/AX/EAX. Выбор конкретного регистра из этих трех должен быть со-
гласован с размером элементов цепочки, в которой осуществляется поиск.
Система команд процессора предоставляет программисту четыре команды сканирования цепочки. Выбор конкретной команды определяется разме-
ром элемента:
SCAS адрес_приемника — сканировать цепочку (SCAning
String);
SCASB — сканировать цепочку байтов (SCAning String Byte);
SCASW — сканировать цепочку слов (SCAning String Word);
SCASD — сканировать цепочку двойных слов (SCAning String
Double Word).
Операция-примитив загрузки элемента цепочки в аккумулятор поз-
воляет извлечь элемент цепочки и поместить его в регистр-аккумулятор
AL, АХ или ЕАХ. Эту операцию удобно использовать вместе с поиском
(сканированием) с тем, чтобы, найдя нужный элемент, извлечь его (напри-
мер, для изменения). Возможный размер извлекаемого элемента определя-
ется применяемой командой. Программист может использовать четыре
5
команды загрузки элемента цепочки в аккумулятор, работающие с элемен-
тами разного размера:
LODS адрес_источника — загрузить элемент из цепочки (LOaD String) в регистр аккумулятор AL/AX/EAX;
LODSB — загрузить байт из цепочки (LOaD String Byte) в ре-
гистр AL;
LODSW — загрузить слово из цепочки (LOaD String Word) в ре-
гистр АХ;
LODSD — загрузить двойное слово (LOaD String Double Word)
из цепочки в регистр ЕАХ.
Операция-примитив переноса элемента из аккумулятора в цепочку позволяет произвести действие, обратное действию команды LODS, то есть сохранить значение из регистра-аккумулятора в элементе цепочки.
Эту операцию удобно использовать вместе с операциями поиска (сканиро-
вания) SCANS и загрузки LODS с тем, чтобы, найдя нужный элемент, из-
влечь его в регистр и записать на его место новое значение. Команды, под-
держивающие эту операцию-примитив, могут работать с элементами раз-
мером 8, 16 или 32 бита. Команды сохранения элемента цепочки из реги-
стра-аккумулятора, работающие с элементами разного размера:
STOS адрес_приемника — сохранить в цепочке элемент (STOre String) из регистра-аккумулятора AL/AX/EAX;
STOSB — сохранить в цепочке байт (STOre String Byte) из реги-
стра AL;
STOSW — сохранить в цепочке слово (STOre String Word) из ре-
гистра АХ;
STOSD — сохранить в цепочке двойное слово (STOre Siring Double Word) из регистра ЕАХ.
6
ТЕХНОЛОГИЯ РАБОТЫ
ЗАДАНИЕ 1. ПОИСК И ЗАМЕНА СИМВОЛА В СТРОКЕ.
1.Ознакомьтесь с программой, которая в заданной строке заменяет символы а на *.
2.Пример программы:
1#include "stdafx.h"
2#include <iostream>
3#include <string.h>
4#include "conio.h"
5int _tmain(int argc, _TCHAR* argv[]) {
6 |
setlocale(0, "rus"); |
7 |
char name[]="badalandabad"; |
8 |
printf("Первоначальная срока: %s", name); |
9 |
_asm { |
10 |
lea ebx, name |
11 |
mov ecx, 12 |
12 |
lab: |
13 |
mov ah, [ebx] |
14 |
cmp ah, 61h |
15 |
jnz lab2 |
16 |
mov [ebx], 2Ah |
17 |
lab2: |
18 |
inc ebx |
19 |
loop lab |
20 |
} |
21 |
printf("\nОтредактированнаясрока: %s", name); |
22 |
getch(); |
23 |
return 0; |
24 |
} |
3. Реализуйте данный алгоритм применительно к своему варианту:
Вариант |
Задание |
1 |
Заменить заглавные символы на строчные |
2 |
Заменить строчные символы символом ‘ * ‘ |
3 |
Заменить заглавные символы символом ‘ $ ’ |
4 |
Найти в строке символ ‘a’ и заменить его символом ‘# ’, а |
|
символ ‘o ‘ на ‘*’ |
5 |
Найти в строке символ ‘m’ и заменить его символом ‘&’ , а |
|
символ ‘n’ пробелом |
|
7 |
6 |
Найти в строке символ ‘e’ и заменить его символом ‘$’, ес- |
|
ли это строчная буква и символом ‘@’– если заглавная. |
7 |
Найти в строке символ ‘r’ и заменить его символом ‘?’, ес- |
|
ли это строчная буква и символом ‘!’– если заглавная. |
8 |
Найти в строке символ ‘k’ и заменить его символом ‘^’, ес- |
|
ли это строчная буква и символом ‘~’ – если заглавная. |
9 |
Найти в строке символ ‘o’ и заменить его символом ‘<’, ес- |
|
ли это строчная буква и символом ‘>’– если заглавная. |
10 |
Найти в строке символ ‘u’ и заменить его символом ‘$’, ес- |
|
ли это строчная буква и символом ‘+’– если заглавная. |
ТРЕБОВАНИЯ БЕЗОПАСНОСТИ ТРУДА
При выполнении лабораторной работы необходимо соблюдать об-
щие правила техники безопасности:
использовать ПК только в соответствии с их назначением;
не размещать на корпусе ПК посторонние предметы (тетради,
книги, карандаши и т.п.);
оберегать ПК от толчков, ударов, сотрясений;
немедленно поставить в известность оператора ИВЦ об обна-
ружении задымления, загорания, пожара;
немедленно сообщить оператору ИВЦ обо всех неисправностях в работе ПК.
СОДЕРЖАНИЕ ОТЧЕТА
Отчѐт по лабораторной работе на листах формата А4, который дол-
жен содержать: цель работы и выполненные задания по лабораторной ра-
боте.
8