Главная страница
Навигация по странице:

  • [метка:] директива [операнды] [Комментарий] [метка:] инструкция [операнды] [Комментарий] Комментарий Пустая строка

  • Мнемоника Операнды Описание Операция

  • Справка по Ассемблеру для AVR. Справка по Ассемблеру для avr


    Скачать 0.53 Mb.
    НазваниеСправка по Ассемблеру для avr
    Дата20.01.2023
    Размер0.53 Mb.
    Формат файлаdoc
    Имя файлаСправка по Ассемблеру для AVR.doc
    ТипДокументы
    #896092
    страница1 из 3
      1   2   3

    Справка по Ассемблеру для AVR®


    Добро пожаловать в ATMEL® AVR® Assembler.

    Пожалуйста выберите интересующий Вас пункт:

    • Общая информация

    • Исходные коды

    • Инструкции процессоров AVR

      • Арифметические и логические инструкции

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

      • Инструкции передачи данных

      • Инструкции работы с битами

    • Директивы ассемблера

    • Выражения

      • Операнды

      • Операторы

      • Функции

    • Использование программы

    Ассемблер поставляется также в консольной версии, её использование описано в этом файле.

    Общая информация


    Компилятор транслирует исходные коды с языка ассемблера в объектный код. Полученный объектный код можно использовать в симуляторе ATMEL AVR Studio, либо в эмуляторе ATMEL AVR In-Circuit Emulator. Компилятор также генерирует код, который может быть непосредственно запрограммирован в микроконтроллеры AVR.

    Компилятор генерирует код, который не требует линковки.

    Компилятор работает под Microsoft Windows 3.11, Microsoft Windows95 и Microsoft Windows NT. Кроме этого есть консольная версия для MS-DOS.

    Набор инструкций семейства микроконтроллеров AVR описан в данном документе кратко, для более полной информации по инструкциям обращайтесь к полному описанию инструкций и документации по конкретному микроконтроллеру.

    Исходные коды


    Компилятор работает с исходными файлами, содержащими инструкции, метки и директивы. Инструкции и директивы, как правило, имеют один или несколько операндов.

    Строка кода не должна быть длиннее 120 символов.

    Любая строка может начинаться с метки, которая является набором символов заканчивающимся двоеточием. Метки используются для указания места, в которое передаётся управление при переходах, а также для задания имён переменных.

    Входная строка может иметь одну из четырёх форм:

    [метка:] директива [операнды] [Комментарий]
    [метка:] инструкция [операнды] [Комментарий]
    Комментарий
    Пустая строка

    Комментарий имеет следующую форму:

    ; [Текст]

    Позиции в квадратных скобках необязательны. Текст после точки с запятой (;) и до конца строки игнорируется компилятором. Метки, инструкции и директивы более детально описываются ниже.

    Примеры:


    label:     .EQU var1=100 ; Устанавливает var1 равным 100 (Это директива)
               .EQU var2=200 ; Устанавливает var2 равным 200

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

                             ; Ещё одна строка с комментарием

    Компилятор не требует чтобы метки, директивы, комментарии или инструкции находились в определённой колонке строки.

     Инструкции процессоров AVR


    Ниже приведен набор команд процессоров AVR, более детальное описание их можно найти в AVR Data Book.
     

    Арифметические и логические инструкции


    Мнемоника

    Операнды

    Описание

    Операция

    Флаги

    Циклы

    ADD 

    Rd,Rr 

    Суммирование без переноса

    Rd = Rd + Rr 

    Z,C,N,V,H,S 

    1

    ADC

    Rd,Rr

    Суммирование с переносом

    Rd = Rd + Rr + C

    Z,C,N,V,H,S

    1

    SUB

    Rd,Rr

    Вычитание без переноса

    Rd = Rd - Rr

    Z,C,N,V,H,S

    1

    SUBI

    Rd,K8

    Вычитание константы

    Rd = Rd - K8

    Z,C,N,V,H,S

    1

    SBC

    Rd,Rr

    Вычитание с переносом

    Rd = Rd - Rr - C

    Z,C,N,V,H,S

    1

    SBCI

    Rd,K8

    Вычитание константы с переносом

    Rd = Rd - K8 - C

    Z,C,N,V,H,S

    1

    AND

    Rd,Rr

    Логическое И

    Rd = Rd · Rr

    Z,N,V,S 

    1

    ANDI

    Rd,K8

    Логическое И с константой

    Rd = Rd · K8

    Z,N,V,S

    1

    OR

    Rd,Rr

    Логическое ИЛИ

    Rd = Rd V Rr

    Z,N,V,S

    1

    ORI

    Rd,K8

    Логическое ИЛИ с константой

    Rd = Rd V K8

    Z,N,V,S

    1

    EOR

    Rd,Rr

    Логическое исключающее ИЛИ

    Rd = Rd EOR Rr

    Z,N,V,S

    1

    COM

    Rd

    Побитная Инверсия

    Rd = $FF - Rd

    Z,C,N,V,S

    1

    NEG

    Rd

    Изменение знака (Доп. код)

    Rd = $00 - Rd

    Z,C,N,V,H,S

    1

    SBR

    Rd,K8

    Установить бит (биты) в регистре

    Rd = Rd V K8

    Z,C,N,V,S

    1

    CBR

    Rd,K8

    Сбросить бит (биты) в регистре

    Rd = Rd · ($FF - K8)

    Z,C,N,V,S

    1

    INC

    Rd

    Инкрементировать значение регистра

    Rd = Rd + 1

    Z,N,V,S

    1

    DEC

    Rd

    Декрементировать значение регистра

    Rd = Rd -1

    Z,N,V,S

    1

    TST

    Rd

    Проверка на ноль либо отрицательность

    Rd = Rd · Rd

    Z,C,N,V,S

    1

    CLR

    Rd

    Очистить регистр

    Rd = 0

    Z,C,N,V,S

    1

    SER

    Rd

    Установить регистр

    Rd = $FF

    None

    1

    ADIW

    Rdl,K6

    Сложить константу и слово

    Rdh:Rdl = Rdh:Rdl + K6 

    Z,C,N,V,S

    2

    SBIW

    Rdl,K6

    Вычесть константу из слова

    Rdh:Rdl = Rdh:Rdl - K 6

    Z,C,N,V,S

    2

    MUL

    Rd,Rr

    Умножение чисел без знака

    R1:R0 = Rd * Rr

    Z,C

    2

    MULS

    Rd,Rr

    Умножение чисел со знаком

    R1:R0 = Rd * Rr

    Z,C

    2

    MULSU

    Rd,Rr

    Умножение числа со знаком с числом без знака

    R1:R0 = Rd * Rr

    Z,C

    2

    FMUL

    Rd,Rr

    Умножение дробных чисел без знака

    R1:R0 = (Rd * Rr) << 1

    Z,C

    2

    FMULS

    Rd,Rr

    Умножение дробных чисел со знаком

    R1:R0 = (Rd *Rr) << 1

    Z,C

    2

    FMULSU

    Rd,Rr

    Умножение дробного числа со знаком с числом без знака

    R1:R0 = (Rd * Rr) << 1

    Z,C

    2

     

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


    Мнемоника

    Операнды

    Описание

    Операция

    Флаги

    Циклы

    RJMP

    k

    Относительный переход

    PC = PC + k +1

    None

    2

    IJMP

    Нет

    Косвенный переход на (Z)

    PC = Z

    None

    2

    EIJMP

    Нет

    Расширенный косвенный переход на (Z)

    STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND

    None

    2

    JMP

    k

    Переход

    PC = k

    None

    3

    RCALL

    k

    Относительный вызов подпрограммы

    STACK = PC+1, PC = PC + k + 1

    None

    3/4*

    ICALL

    Нет

    Косвенный вызов (Z)

    STACK = PC+1, PC = Z 

    None

    3/4*

    EICALL

    Нет

    Расширенный косвенный вызов (Z)

    STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND

    None

    4*

    CALL

    k

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

    STACK = PC+2, PC = k

    None

    4/5*

    RET

    Нет

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

    PC = STACK

    None

    4/5*

    RETI

    Нет

    Возврат из прерывания

    PC = STACK

    I

    4/5*

    CPSE

    Rd,Rr

    Сравнить, пропустить если равны 

    if (Rd ==Rr) PC = PC 2 or 3

    None

    1/2/3

    CP

    Rd,Rr

    Сравнить

    Rd -Rr

    Z,C,N,V,H,S

    1

    CPC

    Rd,Rr

    Сравнить с переносом

    Rd - Rr - C

    Z,C,N,V,H,S

    1

    CPI

    Rd,K8

    Сравнить с константой

    Rd - K

    Z,C,N,V,H,S

    1

    SBRC

    Rr,b

    Пропустить если бит в регистре очищен

    if(Rr(b)==0) PC = PC + 2 or 3

    None

    1/2/3

    SBRS

    Rr,b

    Пропустить если бит в регистре установлен

    if(Rr(b)==1) PC = PC + 2 or 3

    None

    1/2/3

    SBIC

    P,b

    Пропустить если бит в порту очищен

    if(I/O(P,b)==0) PC = PC + 2 or 3

    None

    1/2/3

    SBIS

    P,b

    Пропустить если бит в порту установлен

    if(I/O(P,b)==1) PC = PC + 2 or 3

    None

    1/2/3

    BRBC

    s,k

    Перейти если флаг в SREG очищен

    if(SREG(s)==0) PC = PC + k + 1

    None

    1/2

    BRBS

    s,k

    Перейти если флаг в SREG установлен

    if(SREG(s)==1) PC = PC + k + 1

    None

    1/2

    BREQ

    k

    Перейти если равно

    if(Z==1) PC = PC + k + 1

    None

    1/2

    BRNE

    k

    Перейти если не равно

    if(Z==0) PC = PC + k + 1

    None

    1/2

    BRCS

    k

    Перейти если перенос установлен

    if(C==1) PC = PC + k + 1

    None

    1/2

    BRCC

    k

    Перейти если перенос очищен

    if(C==0) PC = PC + k + 1

    None

    1/2

    BRSH

    k

    Перейти если равно или больше

    if(C==0) PC = PC + k + 1

    None

    1/2

    BRLO

    k

    Перейти если меньше

    if(C==1) PC = PC + k + 1

    None

    1/2

    BRMI

    k

    Перейти если минус

    if(N==1) PC = PC + k + 1

    None

    1/2

    BRPL

    k

    Перейти если плюс

    if(N==0) PC = PC + k + 1

    None

    1/2

    BRGE

    k

    Перейти если больше или равно (со знаком)

    if(S==0) PC = PC + k + 1

    None

    1/2

    BRLT

    k

    Перейти если меньше (со знаком)

    if(S==1) PC = PC + k + 1

    None

    1/2

    BRHS

    k

    Перейти если флаг внутреннего переноса установлен

    if(H==1) PC = PC + k + 1

    None

    1/2

    BRHC

    k

    Перейти если флаг внутреннего переноса очищен

    if(H==0) PC = PC + k + 1

    None

    1/2

    BRTS

    k

    Перейти если флаг T установлен

    if(T==1) PC = PC + k + 1

    None

    1/2

    BRTC

    k

    Перейти если флаг T очищен

    if(T==0) PC = PC + k + 1

    None

    1/2

    BRVS

    k

    Перейти если флаг переполнения установлен

    if(V==1) PC = PC + k + 1

    None

    1/2

    BRVC

    k

    Перейти если флаг переполнения очищен

    if(V==0) PC = PC + k + 1

    None

    1/2

    BRIE

    k

    Перейти если прерывания разрешены

    if(I==1) PC = PC + k + 1

    None

    1/2

    BRID

    k

    Перейти если прерывания запрещены

    if(I==0) PC = PC + k + 1

    None

    1/2

    * Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI, необходимо добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с PC меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ свыше 128KB , добавьте пять циклов плюс по три цикла на каждое ожидание.

    Инструкции передачи данных


    Мнемоника

    Операнды

    Описание

    Операция

    Флаги

    Циклы

    MOV

    Rd,Rr

    Скопировать регистр

    Rd = Rr

    None

    1

    MOVW

    Rd,Rr

    Скопировать пару регистров

    Rd+1:Rd = Rr+1:Rr, r,d even

    None

    1

    LDI

    Rd,K8

    Загрузить константу

    Rd = K

    None

    1

    LDS

    Rd,k

    Прямая загрузка

    Rd = (k)

    None

    2*

    LD

    Rd,X

    Косвенная загрузка

    Rd = (X)

    None

    2*

    LD

    Rd,X+

    Косвенная загрузка с пост-инкрементом

    Rd = (X), X=X+1

    None

    2*

    LD

    Rd,-X

    Косвенная загрузка с пре-декрементом

    X=X-1, Rd = (X)

    None

    2*

    LD

    Rd,Y

    Косвенная загрузка

    Rd = (Y)

    None

    2*

    LD

    Rd,Y+

    Косвенная загрузка с пост-инкрементом

    Rd = (Y), Y=Y+1

    None

    2*

    LD

    Rd,-Y

    Косвенная загрузка с пре-декрементом

    Y=Y-1, Rd = (Y)

    None

    2*

    LDD

    Rd,Y+q

    Косвенная загрузка с замещением

    Rd = (Y+q)

    None

    2*

    LD

    Rd,Z

    Косвенная загрузка

    Rd = (Z)

    None

    2*

    LD

    Rd,Z+

    Косвенная загрузка с пост-инкрементом

    Rd = (Z), Z=Z+1

    None

    2*

    LD

    Rd,-Z

    Косвенная загрузка с пре-декрементом

    Z=Z-1, Rd = (Z)

    None

    2*

    LDD

    Rd,Z+q

    Косвенная загрузка с замещением

    Rd = (Z+q)

    None

    2*

    STS

    k,Rr

    Прямое сохранение

    (k) = Rr

    None

    2*

    ST

    X,Rr

    Косвенное сохранение

    (X) = Rr

    None

    2*

    ST

    X+,Rr

    Косвенное сохранение с пост-инкрементом

    (X) = Rr, X=X+1

    None

    2*

    ST

    -X,Rr

    Косвенное сохранение с пре-декрементом

    X=X-1, (X)=Rr

    None

    2*

    ST

    Y,Rr

    Косвенное сохранение

    (Y) = Rr

    None

    2*

    ST

    Y+,Rr

    Косвенное сохранение с пост-инкрементом

    (Y) = Rr, Y=Y+1

    None

    2

    ST

    -Y,Rr

    Косвенное сохранение с пре-декрементом

    Y=Y-1, (Y) = Rr

    None

    2

    ST

    Y+q,Rr

    Косвенное сохранение с замещением

    (Y+q) = Rr

    None

    2

    ST

    Z,Rr

    Косвенное сохранение

    (Z) = Rr

    None

    2

    ST

    Z+,Rr

    Косвенное сохранение с пост-инкрементом

    (Z) = Rr, Z=Z+1

    None

    2

    ST

    -Z,Rr

    Косвенное сохранение с пре-декрементом

    Z=Z-1, (Z) = Rr

    None

    2

    ST

    Z+q,Rr

    Косвенное сохранение с замещением

    (Z+q) = Rr

    None

    2

    LPM

    Нет

    Загрузка из программной памяти

    R0 = (Z)

    None

    3

    LPM

    Rd,Z

    Загрузка из программной памяти

    Rd = (Z)

    None

    3

    LPM

    Rd,Z+

    Загрузка из программной памяти с пост-инкрементом

    Rd = (Z), Z=Z+1

    None

    3

    ELPM

    Нет

    Расширенная загрузка из программной памяти

    R0 = (RAMPZ:Z)

    None

    3

    ELPM

    Rd,Z

    Расширенная загрузка из программной памяти

    Rd = (RAMPZ:Z)

    None

    3

    ELPM

    Rd,Z+

    Расширенная загрузка из программной памяти с пост-инкрементом

    Rd = (RAMPZ:Z), Z = Z+1

    None

    3

    SPM

    Нет

    Сохранение в программной памяти

    (Z) = R1:R0

    None

    -

    ESPM

    Нет

    Расширенное сохранение в программной памяти

    (RAMPZ:Z) = R1:R0

    None

    -

    IN

    Rd,P

    Чтение порта

    Rd = P

    None

    1

    OUT

    P,Rr

    Запись в порт

    P = Rr

    None

    1

    PUSH

    Rr

    Занесение регистра в стек

    STACK = Rr

    None

    2

    POP

    Rd

    Извлечение регистра из стека

    Rd = STACK

    None

    2

    * Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо добавить один цикл плюс по одному циклу для каждого ожидания.

    Инструкции работы с битами


    Мнемоника

    Операнды

    Описание

    Операция

    Флаги

    Циклы

    LSL

    Rd

    Логический сдвиг влево

    Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7)

    Z,C,N,V,H,S

    1

    LSR

    Rd

    Логический сдвиг вправо

    Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0)

    Z,C,N,V,S

    1

    ROL

    Rd

    Циклический сдвиг влево через C

    Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7)

    Z,C,N,V,H,S

    1

    ROR

    Rd

    Циклический сдвиг вправо через C

    Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)

    Z,C,N,V,S

    1

    ASR

    Rd

    Арифметический сдвиг вправо

    Rd(n)=Rd(n+1), n=0,...,6

    Z,C,N,V,S

    1

    SWAP

    Rd

    Перестановка тетрад

    Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0)

    None

    1

    BSET 

    s

    Установка флага

    SREG(s) = 1

    SREG(s)

    1

    BCLR

    s

    Очистка флага

    SREG(s) = 0

    SREG(s)

    1

    SBI

    P,b

    Установить бит в порту

    I/O(P,b) = 1

    None

    2

    CBI

    P,b

    Очистить бит в порту

    I/O(P,b) = 0

    None

    2

    BST

    Rr,b

    Сохранить бит из регистра в T

    T = Rr(b)

    T

    1

    BLD

    Rd,b

    Загрузить бит из T в регистр

    Rd(b) = T

    None

    1

    SEC

    Нет

    Установить флаг переноса

    C =1

    C

    1

    CLC

    Нет

    Очистить флаг переноса

    C = 0

    C

    1

    SEN

    Нет

    Установить флаг отрицательного числа

    N = 1

    N

    1

    CLN

    Нет

    Очистить флаг отрицательного числа

    N = 0

    N

    1

    SEZ

    Нет

    Установить флаг нуля

    Z = 1

    Z

    1

    CLZ

    Нет

    Очистить флаг нуля

    Z = 0

    Z

    1

    SEI

    Нет

    Установить флаг прерываний

    I = 1

    I

    1

    CLI

    Нет

    Очистить флаг прерываний

    I = 0

    I

    1

    SES

    Нет

    Установить флаг числа со знаком

    S = 1

    S

    1

    CLN

    Нет

    Очистить флаг числа со знаком

    S = 0

    S

    1

    SEV

    Нет

    Установить флаг переполнения

    V = 1

    V

    1

    CLV

    Нет

    Очистить флаг переполнения

    V = 0

    V

    1

    SET

    Нет

    Установить флаг T

    T = 1

    T

    1

    CLT

    Нет

    Очистить флаг T

    T = 0

    T

    1

    SEH

    Нет

    Установить флаг внутреннего переноса

    H = 1

    H

    1

    CLH

    Нет

    Очистить флаг внутреннего переноса

    H = 0

    H

    1

    NOP

    Нет

    Нет операции

    Нет

    None

    1

    SLEEP

    Нет

    Спать (уменьшить энергопотребление)

    Смотрите описание инструкции

    None

    1

    WDR

    Нет

    Сброс сторожевого таймера

    Смотрите описание инструкции

    None

    1

     
    Ассемблер не различает регистр символов.

    Операнды могут быть таких видов:

    Rd: Результирующий (и исходный) регистр в регистровом файле
    Rr: Исходный регистр в регистровом файле
    b: Константа (3 бита), может быть константное выражение
    s: Константа (3 бита), может быть константное выражение
    P: Константа (5-6 бит), может быть константное выражение
    K6; Константа (6 бит), может быть константное выражение
    K8: Константа (8 бит), может быть константное выражение
    k: Константа (размер зависит от инструкции), может быть константное выражение
    q: Константа (6 бит), может быть константное выражение
    Rdl:  R24, R26, R28, R30. Для инструкций ADIW и SBIW
    X,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30)
      1   2   3


    написать администратору сайта