Общий формат расположения информационных полей компилятора MPASM

Компилятор MPASM имеет правила, придерживаясь которых, вы гарантировано получите исполняемый файл для МК. В противном случае, он засыпит вас кучей предупреждений и ругательств, и при этом останется прав.

В предыдущей лабораторной работе, после компиляции, было выдано несколько сообщений типа:

Warning[205] D:\STUDY\1886ВЕ2У MANUAL\LAB_2\LAB_2.ASM 20 : Found directive in column 1. (org)

Warning[203] D:\STUDY\1886ВЕ2У MANUAL\LAB_2\LAB_2.ASM 22 : Found opcode in column 1. (goto)

Warning[205] D:\STUDY\1886ВЕ2У MANUAL\LAB_2\LAB_2.ASM 26 : Found directive in column 1. (org)

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

Каждая строка может содержать до 4-информационных полей:

· метка;

· мнемоника команды;

· операнды команды;

· комментарий;

По возможности необходимо соблюдать порядок расположения информационных полей в строке:

· Метки должны располагаться в 1 колонке;

· Мнемоники команд во 2 колонке;

· Операнды следуют за мнемоникой команды, и обычно расположены в колонке 3;

· Комментарий обычно располагается в конце строки, хотя возможны любые варианты;

Метка должна начинаться с 1-ой колонки. За ней, может, следовать двоеточие (:), или не следовать ничего. Допускаются любые символы латинского алфавита, кроме знаков: ! , < , > , ; , | , \ , / , ~ , ? , а также точки. Длина метки неограниченна, но воспринимаются только 32 символа. Метки являются чувствительными к регистру по умолчанию. Данный параметр, чувствительность к регистру, можно изменить.

Мнемоники команд, макрокоманды, и директивы МК должны начинать во второй колонке. Если в этой же строке имеется метка, то она должна быть отделена пробелом или символом табуляции.

Операнды должны быть отделены от мнемоники одним символом пробела или табуляции. Многократные операнды разделяются запятыми.

Любой текст, после ( ; ) - считается комментарием, и все символы до конца строки игнорируются.

Откройте код программы лабораторной работы № 2, и разместите директиву, org и команду goto, согласно правилам, и тогда сообщения предупреждающего типа исчезнут.

Как видите, можно не придерживаться правил, и компилятор это простит, но бывают случаи, когда необходим чёткий порядок размещения директив, меток, и макрокоманд. Одним из таких является использование директивы выбора Банка памяти – BANKSEL. Если написать что-то вроде следующего:

; 1 2 3 4

label: BANKSEL STATUS ;

Компилятор выдаст ошибку:

Error[121] D:\STUDY\1886ВЕ2У MANUAL\LAB_2\LAB_2.ASM 32 : Illegal label (label)

Заглянув в документацию, получим следующее объяснение:

Метка не может быть указана на этой строке. Разместите метку выше. Также HIGH, LOW, PAGE и BANK недопустимые имена меток.

Этому возможно подобрать логическое объяснение. Когда компилятор начинает обработку строки, то сначала, в колонке 1 попадается слово – label, что он воспринимает как метку. Далее следует директива – BANKSEL, которая является инструкцией, и на это место компилятор должен подставить часть другого кода, который также, скорее всего, имеет метку. По правилам, на одной строке не может располагаться больше 1 метки, поэтому выдаётся ошибка.

Логические команды MPASM, предназначенные для побитовых операций

Байт ориентированные команды:

andwf f,d ; побитное ‘И’ W и f

clrf f ; очистить f

clrw ; очистить W

comf f,d ; нивертировать f

iorwf f,d ; побитное ‘ИЛИ’ W и f

xorwf f,d ; побитное исключающее ‘ИЛИ’ W и f

Констант ориентированные команды:

andlw k ; побитное ‘И’ константы с W

comf f,d ; нивертировать f

iorlw k ; побитное ‘ИЛИ’ константы с W

xorlw k ; побитное исключающее ‘ИЛИ’ константы с W

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

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

Разработать программу вычисления двух значений Y1 и Y2, по уравнениям, приведённым в таблице 1, в зависимости от номера варианта (согласно списку журнала). Неизвестные уравнений соответствуют трём переменным, где 1 – день рождения, 2 – месяц рождения, 3 – год рождения (сокращённая форма 1988, записывается как 88). Приведённые в таблице 1 логические операции, соответствуют логическим командам МК.

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

Общий формат расположения информационных полей компилятора MPASM - student2.ru

Общий формат расположения информационных полей компилятора MPASM - student2.ru

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

X1 = 06;

X2 = 05;

X3 = 87;

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

При решении сложных задач, очень трудно продумать ход решения сразу, да и не всегда понятно с чего, собственно, следует начинать. Для прояснения ситуации, многие программисты используют старый, но проверенный в «боях» метод. Берут обычный лист бумаги, ручку, либо карандаш, и начинают изображать объекты, которые фигурируют в проблеме, наделяя их определёнными свойствами. Некоторые настолько увлекаются, что потом не стыдно показать коллегам, другие же, используют более простой подход, представляя всё в виде схем. Выберите для себя самый удобный метод, и используйте его, для достижения цели.

Для решения задач, поставленных к лабораторным работам, автор, по правде говоря, не пользовался абсолютно ничем. Программа просто возникала у него у голове, а он воплощал идею в реальность. Вам придётся, как и автору, впоследствии, документировать свой труд, и оформлять схемы алгоритмов надлежащим образом. Можете поискать в интернете бесплатное программное обеспечение векторной графики, способное решить ваши задачи, а можете воспользоваться Microsoft Office Visio 2007, которая поставляется отдельно, либо входит в Premium пакет. Использовать программу бесплатно, можно 60 рабочих дней, без платы за лицензию, после чего потребуется заплатить, или отказаться. Думаю 2-х месяцев должно хватить с лихвой, для выполнения поставленной задачи.

Ниже представлена блок-схема будущей программы для данной лабораторной работы (рис. 46).

Общий формат расположения информационных полей компилятора MPASM - student2.ru
Рис. 46 – блок-схема алгоритма решения 1-го уравнения

 
  Общий формат расположения информационных полей компилятора MPASM - student2.ru

Рис. 47 – блок-схема алгоритма решения 2-го уравнения

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

; Lab_3

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

#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 ;

Y1 EQU 0x2C ;

Y2 EQU 0x2D ;

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

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

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

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

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

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

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

main:

;-------------------; загрузка данных в переменные

A2: movlw D'06' ; W = 06

movwf X1 ; X1 = W

A3: movlw D'05' ; W = 05

movwf X2 ; X2 = W

A4: movlw D'87' ; W = 87

movwf X3 ; X3 = W

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

A5: clrw ; W = 0

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

A6: movfw X1 ; W = 06

andwf X2,W ; W = X1 & X2

andwf X3,W ; W = W & X3

movwf t_val_1 ; t_val_1 = W

A7: comf t_val_1,W ; W =~ t_val_1

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

movwf t_val_1 ; t_val_1 = W

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

A9: clrw ; W = 0

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

A10: comf X1,W ; W =~ X1

movwf n_X1 ; n_X1 = W

A11: comf X2,W ; W =~ X2

movwf n_X2 ; n_X2 = W

A12: comf X3,W ; W =~ X3

movwf n_X3 ; n_X3 = W

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

andwf n_X1,W ; W = W & n_X1

A14: 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

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

A15: clrw ; W = 0

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

A16: 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 Y1 ; Y1 = W

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

A17: clrw ; W = 0

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

B2: movfw t_2_1 ; W = t_2_1

xorwf t_2_2,W ; W = t_2_1 || t_2_2

movwf Y2 ; Y2 = W

goto main

END

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

1. На сколько категорий разделены директивы MPASM?

2. Что делает директива #define?

3. Что делает директива #undefine?

4. Что делает директива constant?

5. Чем constant отличается от #define?

6. С помощью, какой директивы можно ассоциировать ячейку памяти с именем?

7. Что делает директива variable?

8. Какая команда отвечает за установку требуемого бита в 0?

9. Какая команда отвечает за установку требуемого бита в 1?

10. Как ещё можно установить требуемый бит не используя команды в вопросах 8 и 9?

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

12. Сколько информационных полей может иметь код программы для МК? Для чего это делается?

13. Что общего во всех логических командах?

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

Тема:Функции (подпрограммы) и макроопределения.

Цель:Изучить написание и работу подпрограмм и макроопределений для МК. Закрепить полученные знания на практике.

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

Время:Два занятия.

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

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

· Расчётные значения для Y1, Y2 (взять результаты вычислений из лабораторной работы № 3);

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

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

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

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

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

· Вывод;

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

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

· Что такое функция (подпрограмма)? Как она работает?

· Что такое макрос? Как он работает?

· Что такое стек и как он работает?

· Соглашения об именовании;

4.1.1 Что такое функция (подпрограмма)? Как она работает?

Функция – это отдельный, самостоятельный, изолированный участок кода, на который возложено выполнение определённой задачи. Также функцией можно считать всю программу, а если она является частью другой, тогда подпрограммой.

До сих пор, выполняя лабораторные работы, вы сосредотачивали решение всей задачи в одном адресном и смысловом пространстве, которое начиналось с метки ‘main’ и оканчивалось директивой END. В целом это удобно, пока задача не становится слишком большой, а разбухшая программа практически не управляемой.

Чтобы максимально быстро ввести вас в курс дела – представьте большой конвейер, на котором производят самые лучшие в мире автомобили. Сборкой занимаются только люди, а не роботы. Это конечно медленнее, но зато у автомобиля появляется душа. Каждый рабочий выполняет возложенную на него задачу: первый производит установку двигателя, второй фары, третий ставит двери, четвёртый прикручивает колёса, а пятый продаёт. Задачи чётко распределены, что очень хорошо отражается на качестве изделия. Удобно, не так ли?

Подобный подход, возможно, применить и при написании программы, разбив её на небольшие части кода, которыми будет легко управлять. Это открывает новые возможности перед программистом, как проектировщиком своей системы. Код начинает становиться логически понятным, и приобретает структурную окраску.

Подпрограмма на языке программирования MPASM состоит из заголовка, тела, и команды возврата из функции.

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

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

Команда возврата (return), производит выход из функции и передачу управления основной программе.

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

Общий формат расположения информационных полей компилятора MPASM - student2.ru

Рис.4.1 – Пример объявления функции

Чтобы воспользоваться подпрограммой, нужно её вызвать. Процесс запуска функции, называется вызовом, и осуществляется с помощью команды call, которая в качестве параметра принимает метку с именем подпрограммы.

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

main:

. ; код программы

.

call Load_Data ; вызов функции

.

.

call Load_Data ; вызов функции

.

.

END ; конец основной программы

В качестве примера, создайте новый проект и наберите код программы, которая вычисляет периметр прямоугольника. Они состоит из 2 функций, где первая – производит загрузку значения, а вторая – рассчитывает периметр.

; Программа демонстрирует работу функции

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

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

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

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

Height EQU 0x20 ; Высота

Weight EQU 0x21 ; Ширина

Perim EQU 0x22 ; Периметр

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

org 0x00

goto main

org 0x05

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

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

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

Load_Data: ; функция загрузки значений

movlw D‘10’ ; W = 10

movwf Height ; Heigth = 10

movlw D‘20’ ; W = 20

movwf Weight ; Weight = 20

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

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

Calc_Perim: ; Функция вычисления Периметра

movfw Height ; W = Height = 10;

addwf Weight,W ; W = Height + Weight

movwf Perim ; Perim = W

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

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

main:

call Load_Data ; вызов функции загрузки значений

call Calc_Perim ; вызов функции расчёта периметра

END ; конец основной программы

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

Когда вы начнете программировать на языке высокого уровня С, то познакомитесь со структурами. Это более сложные конструкции, которые внутри себя могут содержать функции и переменные. По сути – это попытка наделить код программы естественностью, и придать ему свойства «объектности», чтобы тем самым упорядочить всё в определённой иерархии, как и в реальном мире.

Внутреннюю работу команд call и return, мы рассмотрим в разделе 3, когда познакомимся со стеком.

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