Получите файлы count.obj и count.hex. Запустите симулятор AVSIM51 и загрузите в него файл для отладки. Перед выполнением программы запишите на вход порта P1 адрес ячейки ПД, где будет анализируемый байт (произвольное число в диапазоне от 08H до 37H). Затем занесите по указанному адресу произвольное число в ячейку ПД. Например, на входе порта запишите 20H, а в ячейку с адресом 0020H (дамп 2 на экране) занесите число 55H = 01010101.
Выполните программу в пошаговом режиме, наблюдая за изменением указателя стека и областью стека при вызове и возврате из подпрограммы. Повторите программу при других исходных данных в автоматическом режиме. Убедитесь в правильности ее работы.
3.2.2. Часто подпрограммы используют те же регистры, что и основная программа. Поэтому необходимо сохранять содержимое регистров основной программы на время работы подпрограммы. Можно сохранять регистры в стеке при входе в подпрограмму, а затем восстанавливать их содержимое перед выходом из подпрограммы. Однако, часто более удобным и коротким способом сохранения регистров является переключение банков регистров на время выполнения подпрограммы.
Рассмотрим программу, которая заполняет массив ячеек памяти данных константой, а затем подсчитывает контрольную сумму этого массива. Адрес начала массива вводится из порта P0, количество элементов (ячеек) массива вводится из порта P1, а значение константы – из порта P2. Результат работы программы – контрольная сумма выводится в порт P3. Основная программа использует регистры банка 0. Процедуру заполнения ячеек массива константой необходимо оформить как подпрограмму, которая использует регистры 1-го банка. После заполнения всех ячеек константой подпрограмма должна установить флаг F0. Подсчет контрольной суммы массива также необходимо оформить в виде подпрограммы, которая использует регистры 2-го банка. После выполнения всех указанных действий основная программа должна зациклиться.
Создайте в Вашей папке файл с именем check.asm и занесите в него текст программы:
CHECK: MOV SP, #38H ; Определить стек
MOV P3, #0 ; Вывести нули в порт P3
MOV R0, P0 ; Ввод из порта P0 начального адреса массива
MOV R1, P1 ; Ввод из порта P1 количества элементов массива
MOV R2, P2 ; Ввод из порта P2 значения константы
CLR F0 ; Сбросить флаг F0
CALL FILL ; Вызов подпрограммы заполнения массива константой
CALL SUM ; Вызов подпрограммы подсчета контрольной суммы
MOV P3, A ; Вывод контрольной суммы в порт P3
JMP $ ; Зацикливание основной программы
; FILL – подпрограмма заполнения массива ячеек ПД константой
; Входные параметры: ячейка с адресом 00H – начальный адрес массива
; ячейка с адресом 01H – количество элементов
; ячейка с адресом 02H – значение константы
; Выходной параметр: флаг F0 – равен единице, если заполнение массива выполнено
; Используется 1-й банк РОН
FILL: SETB RS0 ; Выбрать 1-й банк РОН
MOV R0, 00H ; Загрузить указатель адреса ячеек
MOV R7, 01H ; Загрузить счетчик элементов массива
LOOP: MOV @R0, 02H ; Пересылка константы в ячейку массива
INC R0 ; Адрес следующего элемента
DJNZ R7, LOOP ; Цикл записи, если (R7) ¹ 0
SETB F0 ; Установить F0=1
CLR RS0 ; Переход в 0-й банк РОН
RET ; Возврат из подпрограммы
; SUM – подпрограмма подсчета контрольной суммы массива ячеек ПД
; Входные параметры: ячейка с адресом 00H – начальный адрес массива
; ячейка с адресом 01H – количество элементов
; Выходной параметр: регистр A – контрольная сумма массива
; Используется 2-й банк РОН
SUM: SETB RS1 ; Выбор 2-го банка РОН
MOV R0, 00H ; Загрузить указатель адреса
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.