Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы пособие.doc
Скачиваний:
0
Добавлен:
12.02.2026
Размер:
2.53 Mб
Скачать

Приложение 1. Основные команды языка assembler для микроконтроллера attiny104

1. Арифметические операции

Команда

Синтаксис

Цель

Операция

ADD

ADD Rd, Rr

Rd

Rd = Rd + Rr

Описание

Пример

Складывает значения двух регистров БЕЗ учёта флага переноса, результат записывается в регистр Rd

add r17,r19 ; (r17=r17+r19)

add r21,r21 ; (r21=r21+r21)

ADC

ADC Rd, Rr

Rd

Rd = Rd + Rr + C

Складывает значения двух регистров и флага переноса, результат записывается в регистр Rd

; сложение 2-байтных чисел R17:R16 и R19:R18

add r18,r16 ; младший разряд

adc r19,r17 ; старший – с переносом

SUB

SUB Rd, Rr

Rd

Rd = Rd - Rr

Вычитает значение регистра Rr из значения регистра Rd БЕЗ учёта флага переноса, результат записывается в Rd.

sub r20,r23 ; (r20 = r20 - r23)

SUBI

SUBI Rd, K

Rd

Rd = Rd - K

Вычитает число K из значения регистра Rd, результат записывается в регистр Rd.

subi r21, $80 ; (r21 = r21 - 128)

SBC

SBC Rd, Rr

Rd

Rd = Rd - Rr - C

Вычитает значение регистра Rr и флага переноса из значения регистра Rd, результат записывается в Rd.

; вычитание R17:R16 из R19:R18

sub r18,r16 ; младший разряд

sbc r19,r17 ; старший – с переносом

SBCI

SBCI Rd, K

Rd

Rd = Rd - K - C

Вычитает число K и значение флага переноса из значения регистра Rd, результат записывается в регистр Rd.

; вычитание $12FD из R19:R18

subi r18, $FD ; младший разряд

sbci r19,$12 ; старший – с переносом

INC

INC Rd

Rd

Rd = Rd + 1

Увеличивает значение в регистре Rd на 1.

inc r22 ;

DEC

DEC Rd

Rd

Rd = Rd - 1

Уменьшает значение в регистре Rd на 1.

dec r22 ;

2. Логические операции

Команда

Синтаксис

Цель

Операция

AND

AND Rd, Rr

Rd

Rd = Rd ˄ Rr

Описание

Пример

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

and r23,r28 ;

ANDI

ANDI Rd, K

Rd

Rd = Rd ˄ K

Логическое И между значением регистра Rd и числом K, результат записывается в регистр Rd.

and r23,$F0 ; очистка младших разрядов

OR

OR Rd, K

Rd

Rd = Rd ˅ Rr

Логическое ИЛИ между значением регистра Rd и числом K, результат записывается в регистр Rd.

or r23,r28 ;

ORI

ORI Rd, K

Rd

Rd = Rd ˅ K

Логическое ИЛИ между значением регистра Rd и числом K, результат записывается в регистр Rd.

ori r23,$F0 ; заполнение старших разрядов

EOR

EOR Rd, K

Rd

Rd = Rd ⊕ Rr

Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ между значением регистра Rd и числом K, результат записывается в регистр Rd.

eor r23,r23 ; очистка r23

eor r23,r28 ;

COM

COM Rd

Rd

Rd = $FF - Rd

Обратный код значения регистра Rd записывается в регистр Rd.

; предположим r23 = 0b10100011

com r23 ; r23 станет равным 0b01011100

NEG

NEG Rd

Rd

Rd = $00 - Rd

Дополнительный код значения регистра Rd записывается в регистр Rd.

neg r23 ;

TST

TST Rd

Rd

Rd = Rd ˄ Rd

Регистр проверяется на нулевое или отрицательное состояние. Выполняется логическое AND содержимого регистра с самим собой. Применяется с инструкциями ветвления.

tst r23 ; проверка r23

breq zero ; если r23 = $00, метка

….

zero: nop ; метка

3. Установка битов в регистры

Команда

Синтаксис

Цель

Операция

SBR

SBR Rd, K

Rd

Rd = Rd ˅ Rr

Описание

Пример

Устанавливает в 1 указанные биты регистра Rd. Полным аналогом является инструкция ORI Rd, K

sbr r23,$03 ; установка двух младших битов регистра r23

CBR

CBR Rd, K

Rd

Rd = Rd ˄ ($FF - K)

Устанавливает в 0 указанные биты регистра Rd.

cbr r23,$F0 ; очистка старших разрядов

SER

SER Rd

Rd

Rd = $FF

Устанавливает в 1 все биты регистра Rd.

ser r31 ;

CLR

ORI Rd

Rd

Rd = Rd ⊕ Rr

Устанавливает в 0 все биты регистра Rd.

clr r23 ;

MOV

MOV Rd, Rr

Rd

Rd = Rr

Копирует значение регистра Rr в регистр Rd.

mov r23,r19 ; копирование r19 в r23

LDI

LDI Rd, K

Rd

Rd = K

Устанавливает значением регистра Rd 8-битную константу K.

ldi r20, $F0 ; установка $F0 в r20

IN

IN Rd, A

Rd

Rd = I/O(A)

Загружает информацию из регистров ввода/вывода (порты, таймеры, регистры конфигурации) в регистр Rd.

0 ≤ A ≤ 63

in r25, PORTA ; чтение порта A

OUT

OUT A, Rr

I/O(A)

I/O(A) =Rr

Копирует значение регистра Rr в регистры ввода/вывода (порты, таймеры, регистры конфигурации).

0 ≤ A ≤ 63

out PORTA, r25 ; запись значения регистра r25 в порт A.

Команда

Синтаксис

Цель

Операция

RJMP

RJMP k

PC

PC = PC + k + 1

Описание

Пример

Переход к адресу на k позиций отстающий от текущего. Чаще всего используется с метками.

rjmp ok ; переход на метку

ok: nop ; метка для rjmp

RCALL

RCALL k

PC

PC = PC + k + 1

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

rcall routine ; переход к подпрограмме

...

routine: nop ; (группа инструкций)

ret ; возвращение в код, вызвавший переход

RET

RET

PC

PC = STACK

Возврат из подпрограммы

rcall routine ; переход к подпрограмме

...

routine: nop ; (группа инструкций)

ret ; возвращение в код, вызвавший переход

RETI

RETI

PC

PC = STACK

Возврат из обработчика прерывания. Устанавливает флаг глобальных прерываний.

… ; инструкции обработки прерывания

reti ; возвращение к основной программе

CP

CP Rd, Rr

SREG

Rd - Rr

Выполняет сравнение значений регистров Rd и Rr. Результаты записываются в SREG. После данной инструкции возможно использование всех инструкций ветвления (п. 4.1).

cp r29, r22 ; сравнение регистров r29 и r22

breq ok ; если равны, переход к метке

ok: nop ; метка

CPI

CPI Rd, K

SREG

Rd - K

Выполняет сравнение значения регистра Rd и константы. Результаты записываются в SREG. После данной инструкции возможно использование всех инструкций ветвления (п. 4.1).

cpi r29, $F5 ; сравнение регистра r29 и $F5

breq ok ; если равны, переход к метке

ok: nop ; метка

4.1. Инструкции ветвления.

Группа инструкций для проверки результата инструкций CP, CPI, SUB, SUBI:

Команда

Синтаксис

Цель

Операция

BREQ

BREQ k

PC

PC = PC + k + 1

Описание

Пример

Если величины, сравниваемые предыдущей инструкцией, равны, переход к адресу на k позиций отстающий от текущего. Чаще всего используется с метками.

cpi r29, $EE ; сравнение регистра r29 и $EE

breq ok ; переход на метку, если r29 == $EE

ok: nop ; метка для breq

Подобные инструкции:

BRNE - величины НЕ равны

BRSH - первая величина больше или равна второй (без учета знака)

BRLO - первая величина меньше второй (без учета знака)

BRMI - результат вычитания второй величины из первой отрицателен

BRPL - результат вычитания второй величины из первой положителен

BRGE - первая величина больше или равна второй (с учётом знака)

BRLT - первая величина меньше второй (с учётом знака)

Команда

Синтаксис

Цель

Операция

LSL

LSL Rd

Rd

Rd = Rd << 1

Описание

Пример

Сдвигает биты в регистре Rd на 1 влево. Младший бит устанавливается в 0.

Результат записывается в регистр Rd.

ldi r20, 0b01001101 ; запись в r20

lsl r20 ; в результате r20 == 0b10011010

LSR

LSR Rd

Rd

Rd = Rd >> 1

Сдвигает биты в регистре Rd на 1 вправо. Старший бит устанавливается в 0. Результат записывается в регистр Rd.

ldi r20, 0b01001101 ; запись в r20

lsr r20 ; в результате r20 == 0b00100110

ROL

ROL Rd

Rd

Rd = (Rd << 1) + C

Сдвигает биты в регистре Rd на 1 влево. Младший бит устанавливается в соответствии с флагом переноса C. Старший бит определяет новое C.

;умножение на 2 2-байтного числа R19:R18

lsl r18 ; умножение на 2 младшей части

rol r19 ; умножение на 2 старшей части с переносом младшего бита.

ROR

ROR Rd

Rd

Rd = (Rd >> 1) + (C << 7)

Сдвигает биты в регистре Rd на 1 вправо. Старший бит устанавливается в соответствии с флагом переноса C. Младший бит определяет новое C.

;деление на 2 2-байтного числа R19:R18

lsl r19 ; деление на 2 старшей части

rol r18 ; деление на 2 младшей части с переносом младшего бита.

5. Побитовые операции

Команда

Синтаксис

Цель

Операция

ASR

ASR Rd

Rd

Rd = Rd >> 1 + (Rd(7) << 7)

Описание

Пример

Сдвигает биты 0:6 в регистре Rd на 1 вправо. Старший бит не изменяется.

Результат записывается в регистр Rd.

ldi r20, 0b11001101 ; запись в r20

asr r20 ; в результате r20 == 0b101001101

SWAP

SWAP Rd

Rd

Rd(0:3) <--> Rd(4:7)

Меняет местами младшие 0:3 и старшие 4:7 биты в регистре Rd.

ldi r20, 0b01001101 ; запись в r20

swap r20 ; в результате r20 == 0b11010100

SBI

SBI A, b

I/O(A)

I/O(A, b) = 1

Устанавливает в 1 значение бита b в регистре ввода/вывода A.

sbi PORTA,4 ; четвёртый бит регистра порта A в 1.

CBI

CBI A, b

I/O(A)

I/O(A, b) = 0

Устанавливает в 0 значение бита b в регистре ввода/вывода A.

cbi PORTA,4 ; четвёртый бит регистра порта A в 0.

6. Управление ядром

Команда

Синтаксис

Описание

BREAK

BREAK

Переводит ядро контроллера в режим STOPPED и предоставляет доступ к ресурсам ядра отладчику. В коде обычно не применяется.

NOP

NOP

Один пустой аппаратный цикл. Может применяться для создания задержек.

SLEEP

SLEEP

Переводит микроконтроллер в режим SLEEP с параметрами, предварительно указанными в регистре MCUCR.

WDR

WDR

Сбрасывает таймер «сторожевой собаки» (watchdog).