
- •Практическая работа № 8.
- •2) Lds и les (Load ds и Load es) — команды загрузки адреса, состоящего из двух слов, в пару регистров (сегментный регистр и, чаще всего, базовый).
- •Организация циклов.
- •Inc al ; в регистре al организуем счетчик нулевых элементов
- •Inc si ; увеличиваем si на 1, для перехода к след. Элементу mas
- •Команды, организующие циклы
- •Доступ к элементам массива
- •Осторожно ошибки!
- •Int 21h ; вызов dos
- •Inc cx ; добавляем 1 к cx (!)
- •Варианты заданий
- •Контрольные вопросы:
Практическая работа № 8.
ТЕМА: "Разработка программ циклической структуры для CPU i8086".
ЦЕЛЬ:
Изучить особенности выполнения команд, организующих циклы (LOOPx), и команд загрузки исполнительного адреса (LEA).
Научиться использовать указанные команды при составлении программ циклической структуры на языке ассемблера.
Порядок работы:
Повторить приведенный ниже теоретический материал.
Разобрать примеры приведенных программ, реализующих обработку массивов.
Внимательно изучить задание своего варианта на обработку элементов массива.
Разработать блок-схему обработки элементов массива и вывода полученного результата.
Задать одномерный массив целочисленных данных MAS в одном из заданных форматов (DB, DW, DD) и реализовать обработку массива в соответствии с заданием. Длина массива N. Исходные данные задать самостоятельно, учитывая формат элементов массива MAS. Тип результата определяется из контекста задачи.
Произвести тестовые проверки, отметить нормальные и аномальные результаты, сделать анализ результатов.
Сравнить результаты, полученные в результате работы программы, с рассчитанными вручную.
Ответить на контрольные вопросы.
Оформить отчет по практической работе, включающий тему и цель работы, листинги программ, тестовые примеры, ответы на контрольные вопросы.
Необходимый теоретический материал:
Команды пересылки адреса
LEA – Load Effective Address – загрузить эффективный адрес (смещение) операнда источник в приемник.
LEA Reg, Mem.
Команда эквивалентна команде MOV Reg, offset Mem
Команда LEA вычисляет смещение операнда-источника команды (который должен быть операндом в памяти) и сохраняет его в 16-разрядном регистре – приемнике. Следовательно, источником является относительный адрес операнда, находящегося в памяти, но не его значение! Сегментные регистры использовать нельзя!!!
Команда на флаги не влияет.
Таблица 1 – Кодирование команды LEA
16-ричный код (1 байт) |
MOD Reg/OPC Reg/Mem (2-ой байт) |
смещение disp_Lo, disp_Hi |
формат операндов: приемник, источник |
8D |
MOD Reg Mem |
Disp_Lo, Disp_Hi |
Reg16, Mem16 |
MOD не может быть равно 11 !
Примеры команд:
1. Мнемоническая запись: LEA AX, [BX+SI] ; формат операндов Reg16, Mem16
Машинный код команды: 10001101 00000000 ; команда занимает 2 байта
16-ричный код команды: 8D00h.
2. Мнемоническая запись: LEA SI, [BX+88h] ; формат операндов Reg16, Mem16
Машинный код команды: 10001101 01110111 10001000 ; команда занимает 3 байта
16-ричный код команды: 8D7788h.
ПРИМЕР
Произвести деление: t1/b1 (двойного слова на слово)
................
b1 dw 5
t1 dd 1F45706Ah
................
LEA bx,t1 ; адрес t1 загружается в bx
MOV ax,[bx]; младшее слово двойного слова загружается
; в AX (706Ah)
MOV DX,[bx+2] ; старшее слово — в DX (1F45h)
IDIV b1 ; DX,AX/b1, частное — в ax
Здесь можно было бы использовать операцию WORD PTR, но это другой способ.