Главная Не из ВолгГТУ » Файлы » Методички » Не из ВолгГТУ [ Добавить материал ]

Л/Р: Микроконтроллеры МСS-51: команды обработки данных

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

Задание:

  1. Изучить   набор   команд  арифметических,   логических,   битовых  операций   и сдвигов, выполняемых микроконтроллерами MCS-51.
  2. Запустить на инструментальном компьютере интегрированную систему программирования "ProView32" (../PV32.ехе). С помощью редактора текста создать демонстрационную программу:

Code
;--------------------программа demo4.asm------------------------------
;---------------------раздел объявлений-------------------------------
ADDRH   EQU   0Fh;                  Старший байт адреса внешней памяти
ADDR1L  EQU   00h;               Младший байт адреса 1-байта 1-го операнда
ADDR2L  EQU   10h;               Младший байт адреса 1-байта 2-го операнда
ADDR3L  EQU   20H;                  Младший байт адреса 1-байта результата<br>NCIRCLE EQU   16<br>;----------------------исполняемая часть -----------------------------
ORG     00H;                             Директива размещения программы
        Mov   P2,#ADDRH;         Через Р2 выдается ст.байт адреса внеш. памяти
        Mov   R0,#ADDR1L;           В R0 - адрес 1-операнда
        Mov   R1,#ADDR2L;           В R1 - адрес 2-операнда
        Mov   08h,#ADDR3L;         В ячейку 08 - адрес результата
       Mov   R2,#NCIRCLE;          В R2 - счетчик циклов = 2*N чисел
LP1:    JB    0D5h,LP2;          При флаге F0=1 флаг переноса не очищается
        Clr   C                     
LP2:    MovX  A,@R0;                 Чтение байта 1-операнда
        Mov   R3,A;                       и пересылка его в R3
        Movx  A,@R1                     Чтение байта 2-операнда
        AddC  A,R3                     Сложение байтов с учетом флага переноса 
        SetB  0D3h;                      Переключение на банк 1
        Movx  @R0,A;                 Запись байта результата во внешнюю память
        Clr   0D3h;                        Переключение на банк 0
        Inc   R0;               Указатель 1-операнда переводится на следующий байт
        Inc   R1;               Указатель 2-операнда переводится на следующий байт
        Inc   08h;              Указатель результата переводится на следующий байт
        Cpl   0D5h;                  Флаг F0 управляет очисткой флага переноса
        DJNZ  R2,LP1;               зацикливание, если есть еще байты операнды
      SJmp   $
End
;---------------------------------------------------------


Эта программа читает восемь пар двухбайтных операндов из внешней памяти данных, складывает операнды побайтно с учетом флага переноса и посылает результаты также во внешнюю память. В программе, кроме уже встречавшейся нам директивы ORG, использованы директивы EQU, с помощью которых определяются имена констант, встречающихся далее в тексте. Этими константами являются значения старшего и младших байтов адреса областей внешней памяти, где хранятся операнды и результаты, количество циклов сложения. Старший байт адреса равен 0Fh и одинаков для всех областей, младший адрес области первых операндов начинается с 00h, вторых операндов – 10h, результата – 20h. Количество циклов равно 2 байта * 8 операндов = 16.

Для сокращения числа команд внутри цикла предусмотрена одинаковая обработка первых байтов операндов, которые складываются без учета переноса, и вторых байтов, складываемых с учетом значения бита С. Единый цикл использует команду ADDC, но дополнительно привлекается флаг F0 из регистра PSW, изменяющий свое значение при каждом проходе. При F0==0 (обработка первых байтов) бит переноса обнуляется.

Такой алгоритм применим только для 16-разрядных операндов. Для работы программы необходим счетчик, три указателя на области внешней памяти и флаг обнуления бита переноса. В качестве счетчика циклов используется регистр R2. Его содержимое декрементируется и проверяется командой DJNZ, которая организует цикл. В качестве указателей на ячейки-источники операндов используются регистры R0 и R1 банка 0. На текущую ячейку-приемник результата указывает регистр R0 банка 1 (ячейка 08h внутреннего ОЗУ), поэтому перед записью необходимо переключить текущий банк, а перед наращиванием указателей источников сделать это вновь.

© Иркутский государственный университет путей сообщения, отчёт студента


Добавил: mauzer (30.10.2010) | Категория: Не из ВолгГТУ
Просмотров: 3402 | Загрузок: 0 | Рейтинг: 0.0/0 |
Комментарии (0)

Имя *:
Email *:
Код *: