Программа, написанная на ассемблере, должна иметь определенную структуру. Ниже приводится рекомендованный для AT90S8535 шаблон. Курсив для выделения комментариев используется в этом примере для наглядности. В реальной программе ассемблер не поддерживает различное форматирование шрифтов.
.org xxxx ; адрес первого зарезервированного байта
label1: .BYTE 1 ; резервировать 1 байт под переменную label1
label2: .BYTE m ; резервировать m байт под переменную label2
;****** сегмент EEPROM (ЭСППЗУ) ***********
.eseg
.org xxxx ; адрес первого зарезервированного байта
.db выражение1,выражение2,… ; записать список байтов в EEPROM.
.dw выражение1,выражение2,… ; записать список слов в EEPROM.
;******сегмент кодов**********
.cseg
.org $0000 ; адрес начала программы в программной памяти
;****** вектора прерываний (если они используются) ***********
rjmp reset ;прерывание по сбросу
.org $0002
rjmp INT0 ;обработчик прерывания IRQ0
.org $0004
rjmp INT1 ;обработчик прерывания IRQ1
.org adrINTx ;адрес следующего обработчика прерываний
rjmp INTx ;обработчик прерывания x
;далее по порядку располагать обработчики остальных ;прерываний
;*******начало основной программы**********
main: <команда> xxxx
… …
;******* подпрограммы *********
;*******подпрограмма 1**********
subr1: <команда> xxxx
…… ………. ……
ret
;*******подпрограмма 2**********
subr2: <команда> xxxx
…… ………. ……
ret
…………….
;******* программы обработчиков прерываний**********
INT0: <команда> xxxx
…… ………. ……
reti
INT1: <команда> xxxx
…… ………. ……
reti
INTx: <команда> xxxx
…… ………. ……
reti
…… ……… ……
; конец программы никак не обозначается.
Алгоритм решения задачи и структура данных
Алгоритм программы состоит из двух частей – последовательности операторов, формирующих структуру данных и набора операторов, реализующих метод решения задачи. Составление алгоритма решения задачи и проектирование структуры данных рассматривается на простейшем примере.
Пример 5.1. Вычесть из числа 5 число 3. Если на блоке управления включен тумблер SA1, то на индикацию выдать результат вычитания. Если тумблер SA1отключен – на индикацию вывести цифру ноль.
Алгоритм решения задачи может быть следующим:
проверяется состояние ключа SA1;
если ключ SA1 включен, то необходимо произвести вычитание и запомнить результат и перейти к индикации;
если ключ SA1 выключен, то необходимо просто запомнить ноль и перейти к индикации;
задать или сформировать адрес ячейки, в которой хранится код для индикации результата;
выдать результат на индикацию;
вернуться к проверке состояния ключа SA1 (если предполагается бесконечное выполнение программы).
Параллельно с алгоритмом решения задачи необходимо проектировать и структуру данных – порядок настройки портов, перечень входных и выходных переменных и их адреса, вершину стека. Структуру данных можно представить в виде совокупности нескольких таблиц (таблицы 5.1–5.4).
Таблица 5.1. Порядок настройки портов
ПОРТЫ
Выводы на вход
Выводы на выход
Порт А
0 – 7
–
Порт В
0, 1, 4 – 7
2, 3
Порт С
–
0 – 7
Порт D
0 – 3
4 – 7
Таблица 5.2. Размещение структурных элементов программы
ЭЛЕМЕНТ СТРУКТУРЫ ДАННЫХ
Имя
Адрес
Память
Вершина стека
SP
$025f
Регистры I/O
Начало программы
–
$0030
FLASH
Таблица 5.3. Перечень констант
КОНСТАНТЫ
Имя
Значение
Адрес
Память
Адрес кода 0
cod0
$3f
$64
SRAM
Адрес кода 1
cod1
$06
$65
SRAM
Адрес кода 2
cod2
$5b
$66
SRAM
Адрес кода 3
Cod3
$4f
$67
SRAM
Адрес кода 4
Cod4
$66
$68
SRAM
Адрес кода 5
Cod5
$6d
$69
SRAM
Адрес кода 6
Cod6
$7d
$6a
SRAM
Адрес кода 7
Cod7
$07
$6b
SRAM
Адрес кода 8
Cod8
$7f
$6c
SRAM
Адрес кода 9
Cod9
$6f
$6d
SRAM
Таблица 5.4. Перечень переменных
ПЕРЕМЕННЫЕ
Имя
Значение
Адрес
Память
Уменьшаемое
–
r17
РОН
Вычитаемое
–
r19
РОН
Результат (разность)
–
–
r20
РОН
Адрес ячейки кода индикации разности
–
–
r0
РОН
Адрес первого из кодов индикации
–
$64
Z (zh, zl) (r31, r30)
РОН
Вспомогательные регистры для промежуточных значений