Пример задания
.docПример задания
Составить программу, реализующую действие А-В. Если в результате выполнения операции бит заёма установлен, то вызвать подпрограмму START, в которой результат записать в ячейку 160 ОЗУ. Если не установлен, то выполнить действие А+В и результат вывести в порт D (А находится в R2, В находится в R5).
Пример программы и её оформление
.INCLUDE "m8515def.inc" ;Подключить файл описаний имён.
;
;*************** Задание символических имён
;
.def temp=R16 ; Назначить регистру R16 имя temp.
; Регистр R16 будет использоваться для
; временного хранения.
;
;*************** Рабочая программа
;
.CSEG ; Оператор, определяющий начало
; программного сегмента.
.ORG $0 ; Оператор, определяющий физический
; адрес расположения команд в памяти
; программ, следующих за ним.
rjmp reset ; Переход в программу после сброса.
.ORG $20
start: ; Метка подпрограммы с именем "start"
sub R4, R7 ; Выполнить действие R4← R4-R7.
sts $a0, R4 ; Запись результата вычитания R4-R7 в
; ячейку 160 СОЗУ.
Ret ; Возврат из подпрограммы.
;*************** Начало основной программы
;*********** Инициализация
reset:
ldi temp, low(RAMEND) ; Инициализация стека.
out SPL, temp ;
ldi temp, high(RAMEND) ;
out SPH, temp ;
ser temp ; temp = 0xFF.
out DDRD, temp ; Настроить порт D как вывод.
;
;*********** Программа
;
m1:
mov R7, R5 ; Из R5 значение "B" переписать в R7.
mov R4, R2 ; Из R2 значение "A" переписать в R4.
cp R4, R7 ; Сравнить А и В (R4-R7)
brcs m2 ; Если флаг переноса (заёма) С=1
; (А<В), то переход на метку m2
add R4, R7 ; Если А>В выполнить R4←R4+R7
out PORTD, R4 ; Вывод результата операции R4+R7 в PD
rjmp m1 ; Переход на метку m1.
m2:
rcall start ; Вызов ПП start
rjmp m1 ; Переход на метку m1.