Программа:
.include "C:\VMLAB\include\m128def.inc"
.def temp0 = r16
.def temp2 = r18
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start:
ldi temp0,$13 ;Загрузить в temp0 $13
ldi temp2,$01 ;Загрузить в temp1 $01
SBRC temp0, 7 ;Проверяет состояние разряда
inc temp2 ;Если в разряде 0, след команда пропустится
SBRC temp0, 6 ;Если в разряде 1,
inc temp2 ;посчитается место
SBRC temp0, 5
inc temp2
SBRC temp0, 4
inc temp2
SBRC temp0, 3
inc temp2
SBRC temp0, 2
inc temp2
SBRC temp0, 1
inc temp2
SBRC temp0, 0
inc temp2
.exit
Описание команд:
LDI Rd,K (загрузка константы в РОН) – загружает 8-разрядное число в регистр общего назначения Rd. Данная команда применима только к старшей половине РОН (адреса 16…31).
SBRC Rr,b (пропустить команду, если разряд РОН сброшен) – проверяет состояние разряда b регистра общего назначения Rr. Если разряд сброшен, команда, следующая за SBRC Rr,b, пропускается.
Выполнение программы:
№ вар. 5 |
Задание Выполнить непосредственную загрузку из памяти данных по адресу $60. |
Далее предложен пример программы организации работы команд пересылки и передачи управления. В начале программы регистру присваивается символьное имя, потом регистр загружается числовым значением, инициализируется стек, и пересылается значение регистра в оперативную память МК. Далее, помещаем значение регистра в стек, загружаем данные из оперативной памяти и в конце обнуляем стек.
Начало
Подключение файла m128def.inc
.include "C:\VMLAB\include\m128def.inc"";
Описание символьного имени
.def temp0 = r16
Загрузить temp0, значением
ldi temp0,$11
Инициализация стека (старший байт)
out SPH,temp0
Загрузить temp0 в память
sts $60,temp0
Загрузить temp0 в стек
push temp0
Загрузить данные из памяти
lds temp0,$60
Загрузить temp0 из стека
pop temp0
Конец
Листинг программы
.include "C:\VMLAB\include\m128def.inc"";
;Основная программа
.def temp0 = r16;Описание символьного имени
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start:
ldi temp0,$11 ;Загрузить переменные значениям
out SPH,temp0
sts $60,temp0 ;Записать переменные в память по адресу $60
push temp0 ;Поместить temp0 в стек
lds temp0,$60 ;Загрузить данные из памяти с адресом $60
pop temp0 ;Загрузить temp0 из стека
.exit ; Выход из подпрограммы;