Однокристальные микроконтроллеры семейства MCS-51. Подпрограммы и стек. Память данных. Исследование команд загрузки и извлечения из стека, страница 4

Получите файлы 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       ; Загрузить указатель адреса