Регистры специального и общего назначения

Всегда состоят только из заглавных букв.

BANKSEL EEADR ; выбрать банк для EEADR

.

.

btfss STATUS,Z ; проверить флаг Z на полож. рез.

Добавочные идентификаторы

Добавочные идентификаторы были придуманы человеком по имени Чарльз Симони. Способ именовать члены программы, изобретённый им, получил название «Венгерская нотация», потому что по происхождению он был венгр, а работал в США на корпорацию Microsoft. Чарльз Симони установил определённый стандарт именования, который многие программисты ненавидят, и часто говорят «Что из-за его применения, кажется, что программа написана на чужом языке». Использовать его в полной мере на языках низкого уровня почти невозможно, но все же некоторую часть этого способа автор применил для обозначения свойств, присущей переменной.

Вся суть метода в том, что в начале, перед словом, ставится идентификатор, состоящий из одной строчной буквы. Идентификаторов может быть один либо целое множество. Ниже описаны те, которые можно будет встретить в примерах и программах в дальнейших лабораторных работах.

t ; обозначает «временный» от слова temp.

f ; обозначает что это «флаг» от слова flag – перем. созданная

; для контроля. Также может использоваться в начале имён

; функций, но редко.

m ; обозначает что перем. принадлежит макросу. Также может

; использоваться в начале имён макросов, но редко. В языках

; высокого уровня имеет другое обозначение.

k ; обозначает что это «константа»

Методические указания к выполнению лабораторной работы

Постановка и решение задачи

Разработать программу вычислений по условиям лабораторной работы № 3, оформив расчёты уравнений в виде функций для Y1, Y2, и макроопределений для Y1, Y2. Продемонстрировать работу в интегрированной среде.

Логические функции:

Регистры специального и общего назначения - student2.ru

Регистры специального и общего назначения - student2.ru

Входные данные:

X1 = 06;

X2 = 05;

X3 = 87;

Блок-схема алгоритма

Регистры специального и общего назначения - student2.ru

Алгоритм макросов имеет идентичную структуру, поэтому не приводится.

Код программы

; Lab_4

;-------------------------------

#include<p17С756А.inc> ; подключение заголовочного файла

; для МК 1886ВЕ2У 16F877

;-------------------------------

X1 EQU 0x20 ;

X2 EQU 0x21 ;

X3 EQU 0x22 ;

n_X1 EQU 0x23 ;

n_X2 EQU 0x24 ;

n_X3 EQU 0x25 ;

t_1_1 EQU 0x26 ;

t_1_2 EQU 0x27 ;

t_2_1 EQU 0x28 ;

t_2_2 EQU 0x29 ;

t_val_1 EQU 0x2A ;

t_val_2 EQU 0x2B ;

f_Y1 EQU 0x2C ;

f_Y2 EQU 0x2D ;

m_Y1 EQU 0x2E ;

m_Y2 EQU 0x2F ;

;-------------------------------

org 0x00 ; начало памяти программ (ПП)!

goto main ; произвести переход на метку 'main',

; с которой начнётся выполнение

; основной программы

org 0x05 ; адрес начала размещения кода в ПП

;-------------------------------; фунция расчёта 1-го уравнения

;------ Функции программы ------;

;-------------------------------;

Load_Data:

L2: movlw D'06' ; W = 06

movwf X1 ; X1 = W

L3: movlw D'05' ; W = 05

movwf X2 ; X2 = W

L4: movlw D'87' ; W = 87

movwf X3 ; X3 = W

return ; команда возврата

;-------------------------------;

f_Call_Y1:

;-------------------; расчёт 1-ой части 1-го уравнения

B2: movfw X1 ; W = 06

andwf X2,W ; W = X1 & X2

andwf X3,W ; W = W & X3

movwf t_val_1 ; t_val_1 = W

B3: comf t_val_1,W ; W =~ t_val_1

B4: movwf t_2_1 ; для 1-ой части 2-го уравнения

movwf t_val_1 ; t_val_1 = W

;-------------------;

B5: clrw ; W = 0

;-------------------; расчёт 2-ой части 1-го уравнения

B6: comf X1,W ; W =~ X1

movwf n_X1 ; n_X1 = W

B7: comf X2,W ; W =~ X2

movwf n_X2 ; n_X2 = W

B8: comf X3,W ; W =~ X3

movwf n_X3 ; n_X3 = W

B9: andwf n_X2,W ; W = W & n_X2

andwf n_X1,W ; W = W & n_X1

B10: movwf t_2_2 ; для 2-ой части 2-го уравнения

movwf t_val_2 ; t_val_2 = W

comf t_val_2,f ; t_val_2 =~ t_val_2

;-------------------;

B11: clrw ; W = 0

;-------------------; расчёт общей части уравнения

B12: movfw t_val_1 ; W = t_val_1

iorwf t_val_2,f ; t_val_2 = t_val_1 | t_val_2

comf t_val_2,W ; W =~ t_val_2

movwf f_Y1 ; f_Y1 = W

;-------------------;

return ; команда возврата

;-------------------------------; фунция расчёта 2-го уравнения

f_Call_Y2:

;-------------------; расчёт 2-го уравнения

C2: movfw t_2_1 ; W = t_2_1

xorwf t_2_2,W ; W = t_2_1 || t_2_2

movwf f_Y2 ; Y2 = W

return ; команда возврата

;-------------------------------;

;------ Макросы программы ------;

;-------------------------------;

m_Call_Y1 MACRO m_X1,m_X2,m_X3

D2: movfw m_X1 ; W = 06

andwf m_X2,W ; W = m_X1 & m_X2

andwf m_X3,W ; W = W & m_X3

movwf t_val_1 ; t_val_1 = W

D3: comf t_val_1,W ; W =~ t_val_1

D4: movwf t_2_1 ; для 1-ой части 2-го уравнения

movwf t_val_1 ; t_val_1 = W

;-------------------;

D5: clrw ; W = 0

;-------------------; расчёт 2-ой части 1-го уравнения

D6: comf m_X1,W ; W =~ m_X1

movwf n_X1 ; n_X1 = W

D7: comf m_X2,W ; W =~ m_X2

movwf n_X2 ; n_X2 = W

D8: comf m_X3,W ; W =~ m_X3

movwf n_X3 ; n_X3 = W

D9: andwf n_X2,W ; W = W & n_X2

andwf n_X1,W ; W = W & n_X1

D10: movwf t_2_2 ; для 2-ой части 2-го уравнения

movwf t_val_2 ; t_val_2 = W

comf t_val_2,f ; t_val_2 =~ t_val_2

;-------------------;

D11: clrw ; W = 0

;-------------------; расчёт общей части уравнения

D12: movfw t_val_1 ; W = m_t_val_1

iorwf t_val_2,f ; m_t_val_2 = m_t_val_1 | m_t_val_2

comf t_val_2,W ; W =~ m_t_val_2

movwf m_Y1 ; m_Y1 = W

;-------------------;

ENDM ; директива окончания

;-------------------------------;

m_Call_Y2 MACRO m_t_2_1,m_t_2_2

;-------------------; расчёт 2-го уравнения

E2: movfw m_t_2_1 ; W = m_t_2_1

xorwf m_t_2_2,W ; W = m_t_2_1 || m_t_2_2

movwf m_Y2 ; Y2 = W

ENDM ; директива окончания

;-------------------------------;

main:

;------- вызовы функций --------;

A2: call Load_Data ; загрузка данных

A3: clrw ; W = 0

A4: call f_Call_Y1 ; расчёт 1-го уравнения с помощью функции

A5: clrw ; W = 0

A6: call f_Call_Y2 ; расчёт 2-го уравнения с помощью функции

A7: clrw

;-------------------------------;

;------- работа макросов -------;

A8: m_Call_Y1 X1,X2,X3 ;

A9: clrw ; W = 0

A10: m_Call_Y2 t_2_1,t_2_2 ;

A11: clrw ; W = 0

;-------------------------------;

goto main

END

Контрольные вопросы!

1. Что такое функция? Из каких частей она состоит?

2. *Что такое подпрограмма? Из каких частей она состоит?

3. Что такое заголовок?

4. Что может находиться в теле функции?

5. Что такое макрос? Из каких частей он состоит?

6. Чем макрос отличается от функции? Приведите несколько примеров?

7. Чем особенны метки для макроса?

8. Для чего используют директиву LOCAL? Можно ли обойтись без её использования? Как?

9. Что такое стек? Из чего состоит? Как работает?

10. Что происходит при использовании команды call?

11. Что происходит при использовании команды return?

12. Можно ли вызвать функцию не используя команду call, а потом благополучно вернуться в программу?

13. Что лучше макрос или функция?

Лабораторная работа № 5

Тема:Принятие решений программой. Команды переходов и циклов.

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

Задание: Спроектировать и написать программу заполнения двухмерного массива, размерность которого – M x N. Массив должен располагаться в ОЗУ МК, начиная с адреса Adr. Данные, размерностью 1 байт, должны быть заполнены согласно следующего алгоритма: первый элемент – день рождения, второй – 1 элемент + месяц рождения, третий – второй + месяц рождения и т.д. Начальные данные представлены в таблице 1. Демонстрационную программу разместить в памяти, начиная с адреса 30h + № Варианта * 5.

Время: Одно занятие.

№ вар. Таблица 5.1
Группа № 1 Группа № 1
Ard(H) M(D) N(D) Ard(H) M(D) N(D)
3F
3E
3D
3C
3B
3A
3A
3B
3C
3D
3E
3F

Содержание отчёта:

· Тема, цель, задание;

· Расчётные значения (в 16-тиричном виде) содержимого массива и конечного адреса массива;

· Описание команд МК, необходимых для написания программы;

· Алгоритм (нумерованный);

· Описание к алгоритму, с подробным пояснением работы регистров INDF и FSR;

· Программ с метками соответствующими номерам блоков алгоритма;

· Код программы;

· Описание особенностей программы;

· «Копии экранов» симулятора, с расположением массива в памяти;

· Вывод;

Теоретические сведения

Выполнив данную лабораторную работу – вы узнаете:

· Как «научить» программу принимать решения;

· Какая адресация называется косвенной, и для чего нужны регистры

FSR и INDF;

· Что такое циклы, и какого вида они бывают;

Наши рекомендации