Главная  Микроконтроллеры 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [ 28 ] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

ток, мнемоник команд микроконтроллера и директив ассемблера подробнее будет рассмотрено чуть позднее.

Примеры записи строк:

labell:.ЕОи var1=100 ; Директива определения символьного

; имени varl, эквивалентного записи "100" .ECU var2=200 ; Определение имени var2, соответствующего "200"

test: rjmp test ; Бесконечный цикл (мнемоника команды микроконтроллера)

; Пустая строка

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

Команды микроконтроллера

Транслятор ассемблера позволяет использовать в тексте программы мнемоники (обозначения команд микроконтроллера), полностью совпадающие с их названием в системе команд микроконтроллера.

Команды микроконтроллеров семейства AVR делятся на несколько групп:

• арифметические и логические;

• команды условных и безусловных переходов; !. • команды передачи данных;

4 • команды для работы с битами.

Краткое описание команд микроконтроллера можно найти в главе 2.

Для транслятора ассемблера нет разницы, какими буквами написаны слова, т. е. rjmp и RJMP совершенно равнозначны. Однако для удобства понимания программы рекомендуется все мнемоники и метки записывать строчными (маленькими) буквами, а директивы прописными (большими).

Директивы транслятора ассемблера

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



о расположении программы в памяти микроконтроллера, определения макросов и т. д.

Ниже приведен перечень директив транслятора ассемблера:

BYTE - резервирует 1 байт для использования в качестве переменной;

CSEG - сегмент программ;

DB - определяет байт-константу;

DEF - определяет символическое имя для регистра;

DEVICE - задает тип целевого микроконтроллера;

DSEG - сегмент данных;

DW - определяет слово-константу;

ENDMACRO - конец определения макроса;

EQU - сопоставляет символьному имени арифметическое выражение;

ESEG - сегмент EEPROM;

EXIT - выйти из файла (конец текста программы); INCLUDE - загрузить исходный текст из другого файла; LIST - включить генерацию листинга;

LISTMAC - включить печать содержимого макросов в листинге;

MACRO - начать определение макроса; NOLIST - выключить генерацию листинга; ORG - установить расположение; SET - сопоставить символу выражение.

Обратите внимание, что все директивы должны начинаться с точки.

.BYTE - резервирует место (или несколько мест) размером 1 байт для переменной.

Директива BYTE резервирует один байт в памяти SRAM для реализации переменной. Для того чтобы иметь возможность обращаться к этой переменной, перед директивой BYTE должна стоять метка. Директива имеет один параметр - количество байтов для резервирования. Директива может использоваться только для резервирования места в памяти данных (смотри директивы CSEG, DSEG и ESEG).



Синтаксис:

Метка:.BYTE числовое выражение

Примеры:

.DSEG

varl: BYTE 1

table:.BYTE tab size

.CSEG

Idi r30,low(var1) Idi r31,high(var1) Id r1,Z

Резервируем 1 байт для переменной varl Резервируем tab size байт

Загружаем младший байт Z-регистра Загружаем старший байт Z-регистра Загрузить содержимое переменной van в П

.CSEG - сегмент кода.

Директива CSEG определяет начало сегмента кода (программ). В исходном тексте программы может быть несколько сегментов кода. Транслятор ассемблера в процессе компиляции программы объединяет все сегменты кода в один. Директива BYTE не может быть использована в сегменте кода. Если в программе нет явного указания названия сегмента, по умолчанию считается, что это сегмент кода. Директива CSEG не имеет никаких параметров. Сегмент кода имеет свой счетчик слов. Директива.ОКС может быть использована для размещения кода или констант в определенном программистом месте памяти программ.

Синтаксис:

.CSEG

Пример:

.DSEG

vartab: BYTE 4

.CSEG

const:.DW 2 nov r1,rO

Начало сегмента данных Резервируем 4 байта в SRAM

Начало сегмента кода

Запишем число 0x0002 в память программ

Что-нибудь сделаем

.DB - определить байты-константы в памяти программ или EEPROM.

Директива DB резервирует место в памяти программ или EEPROM. Для того чтобы иметь возможность обращаться к зарезервированному пространству, перед этой директивой следует ставить метку. Директива DB может быть расположена только в сегменте ко-



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [ 28 ] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

0.0009