Система команд микроконтроллеров AVR.
Микроконтроллер имеет своем составе 32 регистра. Первая их половина (R0-R15) не может быть использована в операциях с непосредственным операндом. Во второй половине есть специфические регистровые пары, которые могут использоваться в операциях пересылки данных между регистрами и памятью и некоторых других действий (X,Y и Z). Заметим к тому же, что «возможности» этих регистровых пар различны!
Кроме регистров, микроконтроллер может иметь память данных (ОЗУ), обращение к которой производится при помощи регистровых пар (индексная адресация) или указанием 16-ти разрядного адреса. Микроконтроллер может только прочесть память данных в регистр или записать туда из регистра, никакие арифметические или логические операции с памятью данных невозможны.
Ну и последнее — периферия, или регистры ввода-вывода (I/O). Можно прочитать данные из I/O в регистр общего назначения и записать из регистра общего назначения в I/O. Кроме этого, у части регистров ввода-вывода, а точнее — у тех, чей адрес не превышает 0x1F, возможна установка отдельных бит в состояние 0 или 1.
Принятые обозначения
| Регистр статуса (SREG) | |
| SREG: | Регистр статуса |
| C: | Флаг переноса |
| Z: | Флаг нулевого значения |
| N: | Флаг отрицательного значения |
| V: | Флаг-указатель переполнения дополнения до двух |
| S: | NЕV, Для проверок со знаком |
| H: | Флаг полупереноса |
| T: | Флаг пересылки, используемый командами BLD и BST |
| I: | Флаг разрешения/запрещения глобального прерывания |
| Регистры и операнды | |
| Rd: | Регистр назначения (и источник) в регистровом файле |
| Rr: | Регистр источник в регистровом файле |
| R: | Результат выполнения команды |
| K: | Литерал или байт данных (8 бит) |
| k: | Данные адреса константы для счетчика программ |
| b: | Бит в регистровом файле или I/O регистр (3 бита) |
| s: | Бит в регистре статуса (3 бита) |
| X, Y, Z: | Регистр косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30) |
| P: | Адрес I/O порта |
| q: | Смещение при прямой адресации (6 бит) |
| I/O регистры | |
| RAMPX, RAMPY, RAMPZ: | Регистры связанные с X, Y и Z регистрами, обеспечивающие косвенную адресацию всей области СОЗУ микроконтроллера с объемом СОЗУ более 64 Кбайт |
| Стек: | |
| STACK: | Стек для адреса возврата и опущенных в стек регистров |
| SP: | Указатель стека |
| Флаги: | |
| Ы | Флаг, на который воздействует команда |
| 0: | Очищенный командой Флаг |
| 1: | Установленный командой флаг |
| —: | Флаг, на который не воздействует команда |
Функции:
| Обозначение | Функция |
| ADC | Сложить с переносом |
| ADD | Сложить без переноса |
| ADIW | Сложить непосредственное значение со словом |
| AND | Выполнить логическое AND |
| ANDI | Выполнить логическое AND c непосредственным значением |
| ASR | Арифметически сдвинуть вправо |
| BCLR | Очистить флаг |
| BLD | Загрузить T флаг в бит регистра |
| BRBC | Перейти если бит в регистре статуса очищен |
| BRBS | Перейти если бит в регистре статуса установлен |
| BRCC | Перейти если флаг переноса очищен |
| BRCS | Перейти если флаг переноса установлен |
| BREQ | Перейти если равно |
| BRGE | Перейти если больше или равно (с учетом знака) |
| BRHC | Перейти если флаг полупереноса очищен |
| BRHS | Перейти если флаг полупереноса установлен |
| BRID | Перейти если глобальное прерывание запрещено |
| BRIE | Перейти если глобальное прерывание разрешено |
| BRLO | Перейти если меньше (без знака) |
| BRLT | Перейти если меньше чем (со знаком) |
| BRMI | Перейти если минус |
| BRNE | Перейти если не равно |
| BRPL | Перейти если плюс |
| BRSH | Перейти если равно или больше (без знака) |
| BRTC | Перейти если флаг T очищен |
| BRTS | Перейти если флаг T установлен |
| BRVC | Перейти если переполнение очищено |
| BRVS | Перейти если переполнение установлено |
| BSET | Установить флаг |
| BST | Переписать бит из регистра во флаг T |
| CALL | Выполнить длинный вызов подпрограммы |
| CBI | — Очистить бит в регистре I/O |
| CBR | Очистить биты в регистре |
| CLC | Очистить флаг переноса |
| CLH | Очистить флаг полупереноса |
| CLI | Очистить флаг глобального прерывания |
| CLN | Очистить флаг отрицательного значения |
| CLR | Очистить регистр |
| CLS | Очистить флаг знака |
| CLT | Очистить флаг T |
| CLV | Очистить флаг переполнения |
| CLZ | Очистить флаг нулевого значения |
| COM | Выполнить дополнение до единицы |
| CP | Сравнить |
| CPC | Сравнить с учетом переноса |
| CPI | Сравнить c константой |
| CPSE | Сравнить и пропустить если равно |
| DEC | Декрементировать |
| EOR | Выполнить исключающее OR |
| ICALL | Вызвать подпрограмму косвенно |
| IJMP | Перейти косвенно |
| IN | Загрузить данные из порта I/O в регистр |
| INC | Инкрементировать |
| FMUL | Дробное незнаковое умножение |
| FMULS | Дробное умножение со знаком |
| FMULSU | Дробное умножение знакового с незнаковым |
| JMP | Перейти |
| LD Rd,X | Загрузить косвенно |
| LD Rd,X+ | Загрузить косвенно инкрементировав впоследствии |
| LD Rd,-X | Загрузить косвенно декрементировав предварительно |
| LDI | Загрузить непосредственное значение |
| LDS | Загрузить непосредственно из СОЗУ |
| LPM | Загрузить байт памяти программ |
| LSL | Логически сдвинуть влево |
| LSR | Логически сдвинуть вправо |
| MOV | Копировать регистр |
| MUL | Перемножить |
| NEG | Выполнить дополнение до двух |
| NOP | Выполнить холостую команду |
| OR | Выполнить логическое OR |
| ORI | Выполнить логическое OR с непосредственным значением |
| OUT | Записать данные из регистра в порт I/O |
| POP | Загрузить регистр из стека |
| PUSH | Поместить регистр в стек |
| RCALL | Вызвать подпрограмму относительно |
| RET | Вернуться из подпрограммы |
| RETI | Вернуться из прерывания |
| RJMP | Перейти относительно |
| ROL | Сдвинуть влево через перенос |
| ROR | Сдвинуть вправо через перенос |
| SBC | Вычесть с переносом |
| SBCI | Вычесть непосредственное значение с переносом |
| SBI | Установить бит в регистр I/O |
| SBIC | Пропустить если бит в регистре I/O очищен |
| SBIS | Пропустить если бит в регистре I/O установлен |
| SBIW | Вычесть непосредственное значение из слова |
| SBR | Установить биты в регистре |
| SBRC | Пропустить если бит в регистре очищен |
| SBRS | Пропустить если бит в регистре установлен |
| SEC | Установить флаг переноса |
| SEH | Установить флаг полупереноса |
| SEI | Установить флаг глобального прерывания |
| SEN | Установить флаг отрицательного значения |
| SER | Установить все биты регистра |
| SES | Установить флаг знака |
| SET | Установить флаг T |
| SEV | Установить флаг переполнения |
| SEZ | Установить флаг нулевого значения |
| SLEEP | Установить режим SLEEP |
| ST X,Rr | Записать косвенно |
| ST Y,Rr | Записать косвенно из регистра в СОЗУ с использованием индекса Y |
| ST Z,Rr | Записать косвенно из регистра в СОЗУ с использованием индекса Z |
| STS | Загрузить непосредственно в СОЗУ |
| SUB | Вычесть без переноса |
| SUBI | Вычесть непосредственное значение |
| SWAP | Поменять нибблы местами |
| TST | Проверить на ноль или минус |
| WDR | Сбросить сторожевой таймер |
Более полное описание на русском можно скачать ниже.
Скачать описание системы команд 8-разрядных RISC микроконтроллеров семейства AVR. Скачали раз