Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ-ВМСиС-Ч1.doc
Скачиваний:
10
Добавлен:
16.11.2019
Размер:
671.74 Кб
Скачать

9.3 Задание на лабораторную работу

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) Какое значение будет находиться в регистре для НОД после подсчета количества единиц? Сколько раз нужно выполнить команду циклического сдвига, чтобы получить первоначальное значение?

10 Лабораторная работа № 4. Использование стека и подпрограмм. Организация внутрисегментных и межсегментных переходов

10.1 Цель работы

Цели лабораторной работы:

1) изучение принципов функционирования памяти и микропроцессора компьютера при выполнении внутрисегментных и межсегментных переходов, а также при работе со стеком;

2) приобретение навыков использования команд безусловного перехода для организации внутрисегментных и межсегментных переходов и стека при написании ассемблерных программ;

3) получение представления об особенностях обработки данных, команд и режимах доступа к данным при организации переходов и использовании стека.

10.2 Контрольные вопросы

1) Процедуры и их размещение в программе.

2) Переходы, виды переходов.

3) Механизмы обработки процедур ближнего вызова и процедур дальнего вызова.

4) Стек, организация стека, принципы работы стека.

5) Особенности размещения в стеке данных разных размерностей.

6) Как описать в программе несколько сегментов данных? Каким образом процессору указывается текущий сегмент данных?

7) Какой вид перехода происходит при изменении текущего сегмента данных, и какие регистры при этом используются?

10.3 Задание на лабораторную работу

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 в процедуре?