Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MPSS Lab.rab.(ru) 2011-07-16 EP.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.79 Mб
Скачать

Программирование на Ассемблере

Программа на языке Ассемблер представляет собой текстовый файл, аналогичный программам на языках высокого уровня (BASIC, C++, PASCAL…). Программы состоят из последовательности строк с командами используемого процессора, их аргументов, комментариев и т.д.

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

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

Синтаксис числовых значений в различных системах счисления

Система счисления

Синтаксис

Примеры

16 - ричная

H´число´

0xчисло

H´9f´

0x9f

10 - тичная

D´число´

.число

D´100´

.100

8 - ричная

O´число´

O´777´

2 - ичная

B´число´

B´00001111´

Символьный формат

(ASCII)

´символ´

A´символ´

´C´

A´C´

Комментарии в программе начинаются символом «;». Запись в строке после точки с запятой игнорируется компилятором.

При разработке программ на языке Ассемблер кроме команд процессора (табл.2,3) используются также вспомогательные команды, позволяющие упростить подготовку основной части программы. Эти команды называют директивами или объявлениями. Компилятор обрабатывает директивы и вставляет данные из них в основную часть программы, что позволяет, в частности, вместо двоичных кодов адресов регистров и данных использовать более привычные из языков высокого уровня имена переменных и констант, метки переходов и т.д.

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

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

1. LIST arg – формирование различных сообщений (arg) для компилятора.

Пример:

LIST p=16f77 ; указание компилятору об использовании в программе

; команд процессора PIC16F77.

2. INCLUDE file_name – включение в программу текста из внешнего дополнительного файла file_name.

Пример:

INCLUDE p16f77.inc ; включение в программу файла p16f77.inc с

; описанием областей памяти и служебных

; регистров процессора PIC16F77.

3. END – обязательная директива, завершающая текст программы. Все записи после этой директивы компилятор игнорирует.

4. name EQU arg – установление соответствия между именем name и численным аргументом arg (arg может являться результатом вычисления арифметического выражения с использованием объявленных ранее имен).

Пример:

c_x EQU 0x20 ; имени c_x соответствует константа 0x20

c_y EQU c_x+1 ; имени c_y соответствует константа 0x21.

5. CBLOCK arg

name1[: size1]

name2[: size2]

name3[: size3]

ENDC

Автоматическое назначение адресов переменных name1, name2, name3, начиная с адреса arg с учетом размера size (в байтах) каждой переменной. По умолчанию (без указания size) выделяется 1 байт.

Пример:

CBLOCK 0x20

name1: 2 ; name1 EQU 0x20

name2: 3 ; name2 EQU 0x22

name3, name4 ; name3 EQU 0x25, name4 EQU 0x26

ENDC

6. ORG arg – указание компилятору о размещении следующих далее команд процессора начиная с адреса arg.

Пример:

ORG 0x015f

label MOVLW 0x25 ; код команды MOVLW 0x25 будет размещен в

; области памяти программ процессора по адресу

; 0x015f.

Этот же адрес будет поставлен в соответствие метке label для использования в командах безусловных переходов, например, GOTO label.

7. name MACRO [arg1, arg2, …]

[local label1, …]

COM1 arg1

label1 COM2 arg2

COM3 arg3

ENDM

Объявление макроса name с передаваемыми внешними аргументами arg1, arg2…, внутренними метками переходов label1…, состоящего из команд COM1, COM2…

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

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

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

SET_VAR MACRO var, data

MOVLW data

MOVWF var

ENDM

После объявления такого макроса последовательность команд

MOVLW 0x3E

MOVWF c_x

MOVLW 0xA9

MOVWF c_y

может быть заменена двумя строками:

SET_VAR c_x, 0x3E

SET_VAR c_y, 0xA9

8. #DEFINE name [string] – объявление имени name, которому может быть поставлена в соответствие строка string.

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

В приведенном ниже примере длинные команды условных переходов по сброшенным/установленным признакам переполнения C и нуля Z заменяются короткими аббревиатурами JNC (Jump if No Carry), JC (Jump if Carry), JNZ (Jump if No Zero), JZ (Jump if Zero):

#define JNC BTFSC STATUS, C

#define JC BTFSS STATUS, C

#define JNZ BTFSC STATUS, Z

#define JZ BTFSS STATUS, C

При отсутствии аргумента string существование объявления имени name может быть проверено директивами:

#ifdef name ; если name объявлено, то компилировать следующий код

… 

endif

#ifndef name  ; если name не объявлено, то компилировать следующий код

… 

endif

Это позволяет создавать универсальные программы для различных вариантов исполнения устройства.

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