3.4.1 Запустить симулятор и ввести подготовленную программу.
3.4.2 Проанализировать формат команда выборки элемента из массива.
3.4.3 Ввести в память исходные массивы.
3.4.4 Выполнить один цикл программы в пошаговом режиме. Результаты наблюдений заносить в таблицу типа табл. 1.4.
3.4.5 Если программа выполняется правильно установить точку останова в конце цикла. Выполнить программу в автоматическом режиме с точками останова. Состояния регистров записывать в таблицу.
Содержание отчета
В отчете должны быть представлены схема алгоритма, текст программы и результаты их трассировки в форме табл.1.4.
а) б)
MOV DS,0400 | ; определение основного сегмента данных | 4050h | первый массив |
MOV ES,04200 | ; сегмент для результатов | : | |
MOV CX,10 | ; число циклов | : | |
MOV BX,00 | ; база первого и третьего массивов | : | |
MOV BP,10 | ; база второго и четвертого массивов | ||
MOV SI,00 | ; начальный индекс | ||
repeat: | 4060h | второй | |
MOV AL, [BX+SI+50] | ; чтение элемента первого массива | : | массив |
ADD ES: [0], AL | ; накопление первой суммы | : | |
ADC ES: [1], 00 | ; учет переноса | : | |
MOV AL, [BP+SI+50] | |||
ADD ES: [2], AL | ; накопление второй суммы | 4070h | третий |
ADC ES: [3], 00 | ; учет переноса | : | массив |
MOV AX, [BX+SI+70] | : | ||
ADD ES: [4], AL | ; накопление третьей суммы | : | |
ADC ES: [5], 00 | ; учет переноса | ||
MOV AX, [BP+SI+70] | 4080h | четвертый | |
ADD ES: [6], AL | ; накопление четвертой суммы | : | массив |
ADC ES: [7], 00 | ; учет переноса | : | |
INC SI | ; новый индекс | : | |
LOOP repeat | ; повторять до исчерпанная массивов | ||
: | |||
: | |||
1-я сумма | |||
: | |||
: | |||
4-я сумма | |||
Рис.3.1. Пример программы обработки массивов(а) заданных картой памяти (б)
Лабораторная работа № 4
ИЗУЧЕНИЕ КОМАНД БЕЗУСЛОВНЫХ ПЕРЕХОДОВ
Краткие сведения
Синтаксис команд безусловного перехода в языке ассемблера микропроцессора 80х86 определяется следующим образом:
<команда безусловного перехода>::= JMP tab <адрес перехода>;
<адрес перехода>::= <имя регистра>|! адрес записан в регистре
<константа>|! прямая адресация
[{<базовый регистр> +},<индексный регистр>{+<смещение>}] |! подобно! адресации данных, см. лаб. № 3
FAR <сегментный адрес>:< смещение в новом сегменте>;! межсегментный прямой
! переход
В отличие от команд условных переходов исполнительный адрес перехода дает не смещение, а собственно физический адрес команды, которая будет исполняться.
Безусловные переходы используются в разнообразных ситуациях:
- объединение программных блоков, находящихся в различных частях памяти, например, вследствие раздельного написания разными программистами:
- обход части памяти, занятой «жестко» привязанными фрагментами программы или таблицами
- в случаях, когда некоторый программный блок может выполняться после нескольких других блоков
- реализация ветвлений по нескольким направлениям.
Приведем несколько примеров:
Пример 1.
Требуется реализовать фрагмент программы, эквивалентный оператору языка PASCAL
IF w THEN e1 ELSE e2;
где w- некоторое условие, e1 и e2 - операторы.
Примерная структура программы для реализации оператора “if - then - else” представлена на рис 4.1.а. Схематическое представление алгоритма представлено на рис 4.1.б. Далее здесь не будем раскрывать способов вычисления условий или реализацию операторов
e1 и e2.
Если условие, проверяемое оператором Jxx (xx - любой из возможных признаков перехода - см. лаб.раб № 1) не выполнено, выполняется последовательность операторов, реализующая блок е1, иначе осуществляется переход на начальный адрес последовательности операторов, реализующей е2. Обратите внимание на то что после выполнения е1 в подобных конструкциях необходимо введение команды безусловного перехода, с тем чтобы обойти фрагмент памяти, занятый блоком е2.
а) Б)
Jxx adr1; проверка условия
:
:; реализация е1
:
JMP adr2; выход на прдолж.
adr1::
:;реализация е2
:
adr2::; ПРОДОЛЖЕНИЕ
Рис 4.1 Ветвление по одному условию; а -примерная структура программы, б- схема алгоритма
Обычно в подобной программе используют прямое задание адреса перехода.
Косвенная и более сложные способы адресации используется в тех случаях, когда вычисляется сам адрес перехода, в частности если в зависимости от условий управление может передаваться одному из нескольких возможных адресов, такое переключение соответствует, например, оператору CASE языке PASCAL:
Сase W of
0: A1;
1: A2;
2: A3;
3: A4;
end;
где W - переменная задающая номер варианта;
A1 – А4 - операторы.
Схема алгоритма выполнения оператора Сase и его интерпретация в языке ассемблера семейства 80х86 приведены на рис.4.2.
Все фрагменты программы, обеспечивающие выполнение операторов А1 - А4 начинаются в текущем сегменте, причем их внутрисегментные адреса занесены в таблицу (по два байта на адрес), начинающуюся с относительного адреса (базовый адрес - ВР) равного 1000 в порядке возрастания номеров. Прибавив удвоенное W к базовому адресу таблицы получим адрес адреса команды перехода. Этот переход исполняется последним оператором ассемблерной программы рис.4.2.
; к этому моменту W вычислено и ; находится в АХ MOV CX, 02 MOV BP, 1000 ROL AX, CX MOV SI,AX JMP FAR [BP+SI] org 1000 dw <стартовый адрес А1> dw <стартовый адрес А2> dw <стартовый адрес А3> dw <стартовый адрес А4> |
Рис. 4.2 Схема алгоритма выполнения оператора Сase и его интерпретация в языке ассемблера
Подготовка к работе
4.2.1 Изучить команды безусловных переходов процессоров семейства 80х86.
4.2.2 Приготовить тексты программ и ручную прокрутку исполнения алгоритмов в соответствии с индивидуальными заданиями выбираемыми преподавателем из п.4.3.
4.2.3 Приготовить таблицы для записи результатов выполнения работы.
Индивидуальные задания
Варианты индивидуальных заданий сведены в таблицу 4.1.
В таблице обозначено:
В первой колонке - номер варианта
Во второй колонке - структура программы, где
1. Программа начинается с оператора типа “if-then-else”, за которым следует оператор типа “Сase”.
2. Программа в целом соответствует структуре “Сase”, но в первой ветви оператора выполняется оператор типа “Сase”.
Предполагается что условия переходов вычислены до входа в создаваемый фрагмент программы и размещены в регистрах: AH равно нулю или единице и задает путь решения в операторе типа “if-then-else”, a AL - целым и задает путь исполнения в операторе типа “Сase”.
В колонке “локализация” определено место в памяти, в которое следует поместить фрагменты программы, вычисляющие соответствующие блоки, причем Е1 означает блок, выполняемый если условие анализируемой оператором “if” истинно, Е2 - если ложно, А1- А4 - блоки, исполняемые в операторе “Сase”. Символ “R” в этой колонке означает локализацию в сегменте основной программы, а “O” - в произвольном другом сегменте. Напомним, что Е2 всегда расположено сразу за командой условного перехода.
Колонки “Содержание блоков” определяют выражения, которые должны быть вычислены внутри каждого из блоков в соответствии с нижеприведенным списком. Пропуск в ветви А1 означает, что здесь выполняется оператор типа “if-then-else”, формулы для вычисления в соответствующих ветвях заданы в колонках Е1 и Е2.
Таблица 4.1
№ | Структура программы | Условие в IF | Локализация | Содержание блоков | ||||||
Е1 | А1-А4 | Е1 | Е2 | А1 | А2 | А3 | А4 | |||
AH >= 0 | R | O | ||||||||
AH = 0 | O | R | ||||||||
AH <> 0 | O | R | ||||||||
AH < 0 | R | O | ||||||||
AH =< 0 | R | O | - | |||||||
AH = 0 | R | O | - |
Список вычисляемых выражений:
1. z = r2 + s2; | 5. z = r2 - rs + s2; |
2. z = (r + s) / (r-s); | 6. z = r2/(s+2) |
3. z = r/s + s/r +10; | 7. z = rs / (r+1) |
4. z = r (s+15) |
Результат формируется в BX; исходные аргументы - в памяти.