Лабораторная работа № 3. Команды условного и безусловного переходов. Организация ветвлений и циклов в программе
Цель работы
Цели лабораторной работы:
1) изучение принципов функционирования памяти и микропроцессора компьютера при выполнении ветвлений и циклов;
2) приобретение навыков использования команд условного и безусловного переходов, циклов при написании ассемблерных программ;
3) получение представления об особенностях обработки данных, команд и режимах доступа к данным при организации ветвлений и циклов.
Контрольные вопросы
1) Ветвления в алгоритмах. Реализация ветвлений на языке ассемблера.
2) Флаги процессора и их использование в условиях.
3) Циклы в алгоритмах. Организация циклов на языке ассемблера.
4) В каком регистре находится во время выполнения программы смещение кода?
5) Какую принципиальную роль играет оператор безусловного перехода JMP при организации ветвлений?
6) Что означает корректное завершение программы?
Задание на лабораторную работу
1) Написать программу на языке ассемблера, которая реализует ветвления и циклы.
1.1) В сегменте данных определить два числа в шестнадцатеричной системе счисления, размером в один байт каждое.
1.2) Также в сегменте данных описать однобайтовую ячейку для хранения наибольшего общего делителя (НОД) двух чисел с произвольным первоначальным значением.
1.3) Используя команды переходов и цикла, найти НОД двух чисел, описанных в сегменте данных.
1.4) Полученный результат поместить в соответствующую ячейку памяти.
1.5) Используя команды циклического сдвига, переходов и цикла подсчитать количество единиц в НОД.
1.6) Полученное значение поместить в регистр DL.
2) На основе исходной программы получить исполняемый файл. Выполнить программу по шагам с помощью отладчика TURBO DEBUGGER, описать изменение состояния регистров и ячеек памяти при выполнении программы. Обратить особое внимание на следующие моменты:
2.1) Как изменяется содержимое регистра IP при выполнении нелинейных переходов?
2.2) Чему равен адрес следующей команды при выполнении условия для перехода и в противном случае?
2.3) Каким образом организованы циклы в программе?
2.4) Какое значение будет находиться в регистре для НОД после подсчета количества единиц? Сколько раз нужно выполнить команду циклического сдвига, чтобы получить первоначальное значение?
Лабораторная работа № 4. Использование стека и подпрограмм. Организация внутрисегментных и межсегментных переходов
Цель работы
Цели лабораторной работы:
1) изучение принципов функционирования памяти и микропроцессора компьютера при выполнении внутрисегментных и межсегментных переходов, а также при работе со стеком;
2) приобретение навыков использования команд безусловного перехода для организации внутрисегментных и межсегментных переходов и стека при написании ассемблерных программ;
3) получение представления об особенностях обработки данных, команд и режимах доступа к данным при организации переходов и использовании стека.
Контрольные вопросы
1) Процедуры и их размещение в программе.
2) Переходы, виды переходов.
3) Механизмы обработки процедур ближнего вызова и процедур дальнего вызова.
4) Стек, организация стека, принципы работы стека.
5) Особенности размещения в стеке данных разных размерностей.
6) Как описать в программе несколько сегментов данных? Каким образом процессору указывается текущий сегмент данных?
7) Какой вид перехода происходит при изменении текущего сегмента данных, и какие регистры при этом используются?
Задание на лабораторную работу
1) Написать программу на языке ассемблера, которая использует стек и подпрограммы.
1.1) Описать сегмент стека, в котором зарезервировать 30 ячеек, занятых нулями.
1.2) Описать два сегмента данных: в первом определить массив из семи однобайтовых чисел; во втором – определить массив из семи однобайтовых элементов, первоначально занятых нулями, а также две однобайтовые ячейки для хранения минимального и максимального элементов массива соответственно.
1.3) Программы нахождения минимального, максимального элементов массива, а также реверсирования массива оформить в виде процедур ближнего вызова.
1.4) Реверсирование массива реализовать с использованием стека.
1.5) Результаты работы каждой процедуры поместить в другой сегмент данных в соответствующие ячейки. При этом переход в другой сегмент необходимо выполнить один раз в конце основной программы, после чего переписать в него данные из соответствующих регистров.
2) На основе исходной программы получить исполняемый файл. Выполнить программу по шагам с помощью отладчика TURBO DEBUGGER, описать изменение состояния регистров и ячеек памяти при выполнении программы. Обратить особое внимание на следующие моменты:
2.1) Как расположены процедуры в сегменте кода?
2.2) Сколько ячеек памяти отведено под стек?
2.3) Каким образом изменяется состояние стека при обращении к процедуре ближнего вызова?
2.4) Содержимое каких регистров, и каким образом необходимо изменить для выполнения перехода ко второму сегменту данных?
2.5) Что содержит регистр IP при выполнении команды CALL?
2.6) Что представляет собой адрес возврата и чему он равен? В какую точку основной программы выполняется возврат из процедуры?
2.7) Для чего нужна команда RET в процедуре?