- •Цель работы
- •3.1. Исследование команд пересылки, использующих внешнюю память данных
- •3.1.1. Запишите в память симулятора текст программы
- •3.2. Исследование команд обмена
- •3.7. Исследование команд чтения из памяти программ
- •3.8. Программирование операций пересылки между регистрами общего назначения
- •3.8.1. Первый способ
- •3.8.2. Второй способ
- •3.9. Задания для самостоятельной работы
- •4.Содержание отчета
- •Контрольные вопросы
3.2. Исследование команд обмена
Запишите в память программ симулятора коды команд
MOV A, #0AAH ; Загрузить в аккумулятор число AAH
MOV R1, #11H ; Загрузить в аккумулятор число 11H
MOV 30H, #33H ; Загрузить в ячейку 30H число 33H
MOV B, #0BBH ; Загрузить в регистр B число BBH
XCH A, R1 ; Обмен аккумулятора с регистром R1
XCH A, 30H ; Обмен аккумулятора с ячейкой ПД
XCH A, B ; Обмен аккумулятора с регистром B
MOV R0, #30H ; Загрузить в R0 адрес ячейки ПД
MOV @R0, # 33H ; Загрузить в ячейку ПД число 33H
MOV A, #55H ; Загрузить в аккумулятор число 55H
XCHD A, @R0 ; Обмен младшей тетрады аккумулятора с младшей тетрадой
ячейки ПД
NOP
Исследуйте работу программы в пошаговом режиме. Наблюдайте за изменением содержания регистров, ячеек памяти, а также флагами МК.
3.7. Исследование команд чтения из памяти программ
В микроконтроллерах семейства МК51 имеется возможность прочитать данные из памяти программ, в том числе для выборки элемента с порядковым номером из таблицы. Обычно для этих целей используется команда
MOVC A, @A + DPTR.
Действие этой команды можно описать так переслать в аккумулятор содержимое ячейки памяти программ, адрес которой вычисляется сложением двухбайтного значения регистра-указателя данных DPTR с однобайтным беззнаковым операндом из аккумулятора. Эту же операцию можно интерпретировать, как чтение элемента с номером, который задан в аккумуляторе, из таблицы с начальным адресом, который хранится в DPTR.
Рассмотрим применение этой команды на примере вычисления функций с помощью таблиц. Предположим, что нужно иметь программу вычисления квадрата целого десятичного числа X в диапазоне от 0 до 10 включительно. Для вычисления используем подпрограмму SQ, которая выбирает результаты из таблицы SQTAB, размещенной в памяти программ. Текст подпрограммы
;****************************************************************
; SQ – подпрограмма вычисления квадрата числа
; Входной параметр регистр R7 – десятичное число в HEX-коде
; Выходной параметр регистр A – квадрат исходного числа в HEX-коде
;*****************************************************************
SQ: MOV A,R7 ; Пересылка исходного числа в аккумулятор
MOV DPTR, #SQTAB ; Загрузить в DPTR адрес таблицы SQTAB
MOVC A, @A+DPTR ; Пересылка в аккумулятор данных из таблицы
RET ; Возврат из подпрограммы
; Таблица квадратов чисел
SQTAB: DB 00H
DB 01H
DB 04H
DB 09H
DB 10H
DB 19H
DB 24H
DB 31H
DB 40H
DB 51H
DB 64H
END ; Конец программного модуля
3.7.1. Создайте в вашей папке файл sq.asm и запишите в него коды программы SQ.
Получите файлы с расширением .obj и .hex. Запустите симулятор AVSIM51 и загрузите в него файл sq.hex. Отключите отображения меток с помощью комбинации клавиш Alt-F5. При рассмотрении текста подпрограммы SQ недоумение могут вызвать команды, расположенные с адреса 0006H. В исходной программе здесь должны располагаться константы 00H, 01H и т.д. Дело в том, что симулятор AVSIM51 не может различать константы и коды команд, которые размещены в программной памяти. Любые данные он интерпретирует как коды команд. Таким образом, значению 00H соответствует команда NOP и т.д.
Отладка подпрограммы SQ состоит в проверке соответствия полученных данных (выходной параметр) и исходных данных (входной параметр). Исследуйте работу подпрограммы SQ в пошаговом режиме при следующих исходных данных (R7) = 00H, (R7) = 05H, (R7) = 0AH. Выполнение подпрограммы заканчивайте при достижении команды RET.