- •Содержание
- •Перечень практических занятий
- •Предисловие Назначение методических указаний
- •Требования к знаниям и умениям при выполнении практических занятий
- •Правила выполнения практических занятий Общие положения
- •Оформление иллюстраций и таблиц
- •Уфимский государственный колледж радиоэлектроники журнал
- •Практическое занятие 1
- •2 Пояснение к работе
- •Практическое занятие 2
- •3 Задание
- •4 Контрольные вопросы
- •5 Содержание отчета
- •6 Список литературы
- •Практическое занятие 3
- •2 Пояснение к работе
- •3 Задание
- •4 Контрольные вопросы
- •5 Содержание отчета
- •6 Список литературы
- •Практическое занятие 4
- •2 Пояснение к работе
- •3 Задание
- •4 Контрольные вопросы
- •5 Содержание отчета
- •6 Список литературы
- •Практическое занятие 5
- •2 Пояснение к работе
- •3 Задание
- •4 Контрольные вопросы
- •5 Содержание отчета
- •6 Список литературы
- •Практическое занятие 6
- •2 Пояснение к работе
- •3 Задание
- •Практическое занятие 7
- •3 Задание
- •Практическое занятие 8
- •3 Задание
- •Практическое занятие 9
- •3 Задание
- •Практическое занятие 10
- •Практическое занятие 11
- •3 Задание
- •4 Контрольные вопросы
- •Практическое занятие 12
- •Практическое занятие 13
- •Практическое занятие 14
- •Практическое занятие 15
- •3 Задание
- •4 Контрольные вопросы
- •5 Содержание отчета
- •6 Список литературы
3 Задание
3.1 Составить таблицу «Регистры процессора» с указанием названия регистра и его назначения.
3.2 Составить таблицу «Команды Ассемблера» с указанием названия команды, ее мнемокода и выполняемого действия.
3.3 Разработать программу на языке Ассемблер для вычисления арифметического выражения (таблица 4.6) и сохранения результата в указанном регистре.
Таблица 4.6 – Таблица вариантов
-
Вариант
Выражение
Регистр-приемник
1
(53+8)*2+(150-60)/3
DX
2
(1260-450)/2+310*3
SI
3
(176/2+23*3)-(125-50)/3
BX
4
(786+35)*3+(125-50)/5
DI
5
(5684/4+357/3+245/5)*3
CX
6
(25*7-31*2+11*3)/2
BL. В регистр BH записать 0
7
150/3+78/2+365/5
CL. В регистр CH записать 0
8
(35/7)*(78/2)-190
BH. В регистр BL записать 0
9
(81/9)*(65/5)-110
CH. В регистр CL записать 0
10
150/5-35/7+210/3
DL. В регистр DH записать 0
4 Контрольные вопросы
4.1 Что называется операндом и мнемокодом?
4.2 Что такое регистры процессора? Для чего используются регистры общего назначения?
4.3 Опишите работу команды MOV.
4.4 Опишите работу команд ADD и SUB.
4.5 Опишите работу команды MUL.
4.6 Опишите работу команды DIV.
5 Содержание отчета
5.1 Наименование работы
5.2 Цель работы
5.3 Задание
5.4 Необходимые таблицы
5.5 Код программы на языке Ассемблера
5.6 Выводы по работе
5.7 Ответы на контрольные вопросы
6 Список литературы
6.1 Бройдо В.Л., Ильина О.П. Архитектура ЭВМ и систем: Учебник для вузов. – СПб.: Питер, 2008.
6.2 Цилькер Б.Я., Орлов С.А. Организация ЭВМ и систем: Учебник для вузов. – СПб.: Питер, 2008.
Практическое занятие 5
Изучение системы команд Ассемблера. Команды обработки строк данных и команды организации циклов
1 Цель работы:
1.1 Изучить команды обработки строк данных.
1.2 Изучить команды организации циклов.
2 Пояснение к работе
2.1 Краткие теоретические сведения
2.1.1 Команды обработки строк данных
Строка – это последовательность байтов или слов, размещаемых в смежных ячейках памяти.
Таблица 5.1 – Команды обработки строк
-
Название
Мнемокод
Пересылка строки
MOVS, MOVSB
Загрузка символа из строки
LODS, LODSB
Запись символа в строку
STOS, STOSB
Сканирование строки
SCAS, SCASB
Сравнение строки
CMPS, CMPSB
Если обрабатываемая строка состоит из 16-разрядных машинных слов, то применяется мнемокоды команд без буквы “B” на конце (например, LODS); если строка состоит из байтов, то – мнемокоды команд с буквой “B” (например, LODSB). Операнды команд после из мнемокодов, как правило, не указываются; везде используется неявная адресация.
Команда MOVS, MOVSB (move strings) – это пересылка элемента строки из одной области памяти в другую (в отличие от MOV, которая не может выполнять пересылки «память-память»). Строка-источник адресуется регистрами DS:SI (то есть находится в сегменте памяти, на который указывает DS, и имеет смещение, находящееся в SI), строка-получатель – регистрами ES:DI. Таким образом, строка-получатель размещается в дополнительном сегменте данных, если только значения DS и ES не равны.
Содержимое индексных регистров SI и DI во время работы строковых команд не остаётся неизменным – оно также изменяется автоматически в соответствии с правилом SI←SI+delta, DI←DI+delta. Здесь delta=1 для байтовых строк и delta=2 для строк, состоящих из 16-разрядных машинных слов. Кроме того, в ряде случаев возникает необходимость в пересылке строки в обратном порядке, начиная не с первого, а с последнего элемента. Содержимое индексных регистров при этом должно не увеличиваться (автоинкрементирование), а уменьшаться (автодекрементирование). Направление изменения содержимого задаётся с помощью флага DF в регистре FLAGS микропроцессора: при DF=0 используется «плюс», при DF=1 – «минус». Сам же флаг DF управляется специальными командами: CLD (сбросить флаг, это значение по умолчанию) и STD (установить флаг).
Команда LODS, LODSB (load from string). Команда осуществляет загрузку элемента строки (слова или байта) в регистр AX или AL соответственно. Строка адресуется с помощью регистров DS:SI.
Команда STOS, STOSB (store to string). С помощью этой команды производится заполнение строки словом (байтом). Заполняемая строка адресуется с помощью регистров ES:DI.
Команда SCAS, SCASB (scan string). Эта команда используется для так называемого «сканирования» одной строки в поисках нужного элемента (слова или байта). В процессе работы команды осуществляется сравнение элемента строки, расположенного по адресу ES:DI, со значением в регистре AX (или AL) путём вычитания; результат вычитания не фиксируется, но устанавливаются соответствующие флаги. Как и при выполнении прочих строковых команд, производится автоинкрементирование (либо автодекрементирование) регистра DI.
Команда CMPS, CMPSB (compare strings). Команда осуществляет поэлементное сравнение элементов двух строк (слов или байтов), одна из которых, как и прежде, расположена в памяти по адресу в регистрах DS:SI, вторая – по адресу в ES:DI. При выполнении этой команды производится вычитание элемента строки с адресом в SI из элемента строки с адресом в DI; как и в обычной команде CMP, результат вычитания никуда не записывается, но зато устанавливаются соответствующие флаги (наиболее важным в данной ситуации является флаг ZF).
ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды – ноль.
2.1.2 Команды организации циклов
При работе на Ассемблере можно организовать циклы, используя команды условных переходов. Однако, кроме этого, 8086-совместимые МП предоставляют в распоряжение программиста специальные команды циклов LOOP, LOOPNZ, LOOPZ. Все эти команды используют метку, расположенную выше по программе. Часть программы между меткой и какой-либо из рассматриваемых команд и есть тело цикла. Перед входом в цикл следует записать в регистр CX число повторений цикла. Каждый раз при очередном повторении тела цикла процессор будет автоматически вычитать единицу их СХ. Цикл закончится, если:
- СХ будет равен 0 (для команды LOOP);
- СХ будет равен 0 или флаг ZF будет равен 1 (для команды LOOPNZ);
- СХ будет равен 0 или флаг ZF будет равен 0 (для команды LOOPZ).
Для организации циклов при работе со строковыми командами имеются специальные команды-префиксы REP (repeat), REPE, REPNE. Они записываются перед основной командой (например, REP MOVSB) и обеспечивают её выполнение не один, а несколько раз, организуя по сути дела аппаратный (очень быстрый) цикл. Число повторений предварительно записывается в CX и на каждом шаге содержимое CX автоматически уменьшается на 1.
Префикс REP («повторять, пока не обнулится счётчик») анализирует только одно условие окончания повторений, а именно CX = 0.
Префикс REPE («повторять, пока равно») анализирует следующее составное условие окончания повторений: (CX = 0) ИЛИ (ZF = 0).
Префикс REPNE («повторять, пока не равно») в качестве условия окончания повторений использует следующее: (CX = 0) ИЛИ (ZF = 1).
2.1.3 Примеры программ
Пример 1: вычислить сумму 1+2+…+19+20 и записать результат в регистр SI.
Удобно программировать вычисление этой суммы в обратном порядке, т.е. начиная с 20 – тогда можно воспользоваться регистром с убывающим содержимым. В данном случае нам подходит цикл LOOP со счетчиком в CX – ведь его содержимое как раз уменьшается на каждой итерации цикла.
MOV AX, 0 ; будем накапливать сумму в АХ
MOV CX, 20 ; подготовим счётчик цикла
MET: ; этой меткой обозначено начало цикла
ADD AX, CX ; прибавляем очередное слагаемое
LOOP MET ; переход на начало цикла, если СХ не равно нулю
MOV SI, AX ; выдадим результат.
Пример 2: Дан массив байтов (1,1,2). Получить другой массив, в котором каждый элемент первого массива увеличен на 5.
Рассматривая массив как строку байтов, разместим исходные данные в сегменте данных (DS) с адреса 0000h, а результат – в дополнительном сегменте (ES) также с адреса 0000h.
MOV SI, 0 ; начальное значение для LODS (источник данных)
MOV DI, 0 ; начальное значение для STOS (приемник)
MOV CX, 3 ; в нашем примере - три исходных элемента
MET:
LODSB ; загрузим очередной байт массива
ADD AL, 5 ; обработаем его, как указано в задаче
STOSB ; запишем обработанный байт в массив результата
LOOP MET
