Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПР 11.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
99.84 Кб
Скачать

МИНИСТЕРСТВО ПРОМЫШЛЕННОСТИ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ

«ЖЛОБИНСКИЙ ГОСУДАРСТВЕННЫЙ МЕТАЛЛУРГИЧЕСКИЙ КОЛЛЕДЖ»

Практическая работа № 11

Учебная дисциплина: Цифровая и микропроцессорная техника

Тема: Ассемблирование и компоновка программ

Преподаватель А.С. Негру

Рассмотрено

на заседании цикловой комиссии

электротехнических дисциплин

Протокол № ____ от__ ______2014

Председатель ___________М.И.Матюшонок

Цель работы: Изучить внутреннюю структуру однокристальных микроконтрол леров семейства MCS-51 (МК51). Изучить основы программирования микроконтроллеров на языке Ассемблера.

Теоретическое обоснование практической работы

Стек – это область памяти данных микроконтроллера, адресация к ячейкам которой производится с помощью специального регистра – указателя стека SP. Работа стека организована по принципу регистровой памяти LIFO, т.е. число, записанное в стек последним, извлекается из него первым. Стек используется для организации обращения к подпрограммам и при обработке прерываний, может быть использован для передачи параметров подпрограммам и для временного хранения содержимого регистров общего назначения и специальных функций.

Стек может располагаться в любом месте внутренней памяти данных. По сигналу сброса (начальной установки) в указатель стека SP заносится значение 07H. Это сделано для совместимости микроконтроллеров семейства МК51 с ранее разработанным семейством МК48. Однако, при этом стек будет занимать область банков 1, 2 и 3 регистров общего назначения, что ограничивает возможности микроконтроллера. Поэтому обычно после сброса программа переопределяет местоположение стека, который удобно разместить по адресам от 60H до 7FH. Для переопределения стека необходимо выполнить команду MOV SP, #d , где d – число, определяющее адрес вершины стека, т.е. его нижнюю границу. Например, если мы желаем расположить стек с адреса 60H памяти данных, то необходимо выполнить команду инициализации стека вида

MOV SP, #60H

Механизм доступа к стеку в МК51 следующий перед загрузкой в стек содержимое регистра-указателя стека SP инкрементируется, а после извлечения из стека – декрементируется. В МК51 имеются две команды операций со стеком

PUSH ad ; (SP)  (SP) + 1, ((SP))  ad - Загрузка (запись) в стек

POP ad ; (ad)  ((SP)), (SP)  (SP) – 1 Извлечение (чтение) из стека

Здесь обозначено: ad - это прямой адрес ячейки памяти данных или регистра специальных функций. Следует отметить, что в случае регистров специальных функций более удобно использовать не действительные адреса, а их символические имена.

Рассмотрим процесс загрузки в стек. Допустим, что в исходном состоянии в указателе стека будет (SP) = 60H. Нужно сохранить в стеке содержимое аккумулятора, регистра состояния PSW и регистра указателя данных DPTR. Загрузку в стек этих регистров можно выполнить последовательностью следующих команд

PUSH ACC ; Загрузить в стек содержимое аккумулятора

PUSH PSW  Загрузить в стек содержимое регистра PSW

PUSH DPL  Загрузить в стек младший байт регистра DPTR

PUSH DPH  Загрузить в стек старший байт регистра DPTR

Обратите внимание, что при загрузке в стек содержимого аккумулятора использовано его имя ACC как регистра специальных функций. Это необходимо обязательно учитывать!

Стек после выполнения этих команд будет выглядеть следующим образом

Память данных

64H

DPH

 Вершина стека (новое значение)

63H

DPL

62H

PSW

61H

ACC

60H

xxxx xxxx

 Вершина стека (исходное значение)

5FH

В указателе стека будет (SP) = 64H. Это новая вершина стека.

Извлечение из стека содержимого регистров должно выполняться в обратном порядке последовательностью команд

POP DPH  Извлечь из стека содержимое регистра DPH

POP DPL  Извлечь из стека содержимое регистра DPL

POP PSW  Извлечь из стека содержимое регистра PSW

POP ACC  Извлечь из стека содержимое аккумулятора

Стек после выполнения этих команд будет выглядеть следующим образом

Память данных

64H

DPH

 Вершина стека (старое значение)

63H

DPL

62H

PSW

61H

ACC

60H

xxxx xxxx

 Вершина стека (новое значение)

5FH

В указателе стека вновь будет (SP) = 60H. Обратите внимание, что после извлечения из стека в нем сохранились записанные ранее значения, однако использовать их при адресации через SP сложно (нужно задавать вершину стека для извлечения данных, что нарушает логику работы стека).

При вызове подпрограммы в стек записывается содержимое программного счетчика (счетчика команд) PC, который содержит в этот момент адрес команды, следующей за командой вызова подпрограммы. Адрес команды – это 16-разрядное (двухбайтное число), поэтому вначале в стек загружается младший байт счетчика PCL, а затем – старший байт PCH. Указатель стека SP при этом дважды инкрементируется.

При возврате из подпрограммы в счетчик команд из стека записывается адрес возврата. Сначала извлекается старший байт PCH, а затем – младший байт PCL. Указатель стека при этом дважды декрементируется.

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

Для успешной работы любой подпрограммы необходимо однозначно определить способ передачи в нее исходных данных и способ вывода результатов ее работы. Подпрограмма, которой требуется дополнительная информация в виде параметров ее настройки или операндов, называется параметризуемой. Примером параметризуемой программы может служить подпрограмма временной задержки, если основной программе требуется реализация временных задержек различной длительности. Основная программа при этом должна обеспечить передачу в подпрограмму уставок, обеспечивающих требуемое время задержки.

Получили распространение три способа передачи параметров: через память, через регистры общего назначения и через область флагов.

При передаче входных параметров через память основная программа обязательно содержит команды загрузки некоторых ячеек памяти, а подпрограмма – команды считывания из этих ячеек. При передаче выходных параметров подпрограмма должна загрузить некоторые ячейки памяти, а основная программа – считать. Передача параметров через регистры осуществляется аналогичным образом. В третьем способе используются флаги C и F0, сохраняемые в регистре состояния PSW, либо флаги пользователя (128 флагов) из области прямоадресуемых битов памяти данных (адреса ячеек 20H…2FH).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]