Порядок выполнения работы
1. Исследование команд загрузки и извлечения из стека
1.1. Запустите симулятор/отладчик AVSIM51, отключите отображение меток и запишите в память программу загрузки в стек содержимого регистров микроконтроллера A, B и DPTR:
MOV SP, #38H Определить стек
PUSH ACC Загрузить в стек содержимое аккумулятора
PUSH B Загрузить в стек содержимое регистра B
PUSH DPL Загрузить в стек младший байт регистра DPTR
PUSH DPH Загрузить в стек старший байт регистра DPTR
NOP
Задайте содержимое регистров (A) = AAH, (B) = BBH, (DPTR) = 2211H. Выполните программу в пошаговом режиме, наблюдая за изменением указателя стека SP и содержимого ячеек стека (нижний дамп памяти данных). Содержимое стека отобразите по форме
Область стека
-
Адрес
Содержимое
Значение SP
SP= (Конечное значение)
SP=
SP=
SP= (Исходное значение)
Укажите на рисунке, как разместились в стеке содержимое регистров A, B, DPTR.
1.2. Запишите в память симулятора программу восстановления содержимого регистров (извлечения из стека)
POP DPH Извлечь из стека содержимое старшего байта регистра DPTR
POP DPL Извлечь из стека содержимое младшего байта регистра DPTR
POP B ; Извлечь из стека содержимое регистра B
POP ACC ; Извлечь из стека содержимое аккумулятора
NOP
Перед выполнением этой программы очистите регистры A, B и DPTR, записав в них нули.
Выполните программу восстановления содержимого регистров в пошаговом режиме. Убедитесь, что восстановленное содержимое регистров совпадает с исходным, а указатель стека принял начальное значение.
1.3. Часто при вызове подпрограмм требуется запомнить содержимое регистров общего назначения, которые использовала основная программа. Затем, при возврате из подпрограммы надо восстановить содержимое этих регистров. Для этой цели удобно использовать стек. Однако следует помнить, что в командах обращения к стеку нужно использовать прямой адрес регистра общего назначения в памяти данных, а не его имя R0, R1,…,R7. При этом надо учитывать, в каком регистровом банке находятся эти регистры. Например, адрес регистра R0 в банке 0 будет 00H, адрес этого же регистра в банке 1 будет 08H, а в банке 3 – 18H.
Запишите в память симулятора программу сохранения в стеке содержимого регистров R1, R2, R7 0-го банка
PUSH 01H ; Загрузить в стек содержимое регистра R1
PUSH 02H ; Загрузить в стек содержимое регистра R2
PUSH 07H ; Загрузить в стек содержимое регистра R7
NOP
Перед выполнением программы занесите в ячейки памяти данных с адресами 01H, 02H и 07H, соответствующие регистрам R1, R2 и R7 0-го банка, произвольные значения, например, 01H, 02H, 07H.
Выполните программу в пошаговом режиме, наблюдая за областью стека и изменением содержимого регистра SP.
Занесите в память симулятора программу восстановления содержимого регистров R1, R2 и R7 0-го банка
POP 07H ; Извлечь из стека содержимое регистра R7
POP 02H ; Извлечь из стека содержимое регистра R2
POP 01H ; Извлечь из стека содержимое регистра R1
NOP
Перед выполнением программы очистите ячейки памяти данных с адресами 01H, 02H и 07H, соответствующие регистрам R1, R2 и R7 0-го банка.
Выполните программу восстановления содержимого регистров в пошаговом режиме, наблюдая за ячейками памяти данных, соответствующими этим регистрам.
