AVR АТMEGA 128

ДОДАТОК 2
ІНСТРУКЦІЇ ПРОЦЕСОРІВ AVR
Таблиця П. 2.1 – Арифметичні й логічні команди.
| Мнемоніка | Операнди | Опис | Операція | Прапори | Цикли |
| ADD | Rd,Rr | Підсумовування без переносу | Rd = Rd + Rr | Z,C,N,V,H,S | |
| ADC | Rd,Rr | Підсумовування з переносом | Rd = Rd + Rr + C | Z,C,N,V,H,S | |
| SUB | Rd,Rr | Вирахування без переносу | Rd = Rd - Rr | Z,C,N,V,H,S | |
| SUBI | Rd,K8 | Вирахування константи | Rd = Rd - K8 | Z,C,N,V,H,S | |
| SBC | Rd,Rr | Вирахування з переносом | Rd = Rd - Rr - C | Z,C,N,V,H,S | |
| SBCI | Rd,K8 | Вирахування константи з переносом | Rd = Rd - K8 - C | Z,C,N,V,H,S | |
| AND | Rd,Rr | Логічне І | Rd = Rd · Rr | Z,N,V,S | |
| ANDI | Rd,K8 | Логічне І с константою | Rd = Rd · K8 | Z,N,V,S | |
| OR | Rd,Rr | Логічне АБО | Rd = Rd V Rr | Z,N,V,S | |
| ORI | Rd,K8 | Логічне АБО з константою | Rd = Rd V K8 | Z,N,V,S | |
| EOR | Rd,Rr | Логічне виключаюче АБО | Rd = Rd EOR Rr | Z,N,V,S | |
| COM | Rd | Побітна Інверсія | Rd = $FF - Rd | Z,C,N,V,S | |
| NEG | Rd | Зміна знака (Доп. код) | Rd = $00 - Rd | Z,C,N,V,H,S | |
| SBR | Rd,K8 | Установити біт (біти) у регістрі | Rd = Rd V K8 | Z,C,N,V,S | |
| CBR | Rd,K8 | Скинути біт (біти) у регістрі | Rd = Rd · ($FF - K8) | Z,C,N,V,S | |
| INC | Rd | Інкрементувати значення регістру | Rd = Rd + 1 | Z,N,V,S | |
| DEC | Rd | Декрементувати значення регістру | Rd = Rd -1 | Z,N,V,S | |
| TST | Rd | Перевірка на нуль або заперечність | Rd = Rd · Rd | Z,C,N,V,S | |
| CLR | Rd | Очистити регістр | Rd = 0 | Z,C,N,V,S | |
| SER | Rd | Установити регістр | Rd = $FF | None | |
| ADIW | Rdl,K6 | Скласти константу й слово | Rdh:Rdl = Rdh:Rdl + K6 | Z,C,N,V,S | |
| SBIW | Rdl,K6 | Відняти константу зі слова | Rdh:Rdl = Rdh:Rdl - K6 | Z,C,N,V,S | |
| MUL | Rd,Rr | Множення чисел без знака | R1:R0 = Rd * Rr | Z,C | |
| MULS | Rd,Rr | Множення чисел зі знаком | R1:R0 = Rd * Rr | Z,C | |
| MULSU | Rd,Rr | Множення числа зі знаком із числом без знака | R1:R0 = Rd * Rr | Z,C | |
| FMUL | Rd,Rr | Множення дробових чисел без знака | R1:R0 = (Rd * Rr) << 1 | Z,C | |
| FMULS | Rd,Rr | Множення дробових чисел зі знаком | R1:R0 = (Rd *Rr) << 1 | Z,C | |
| FMULSU | Rd,Rr | Множення дробового числа зі знаком із числом без знака | R1:R0 = (Rd * Rr) << 1 | Z,C |
Таблиця П. 2.2. – Команди розгалуження
| Мнемоніка | Операнди | Опис | Операція | Прапори | Цикли |
| RJMP | k | Відносний перехід | PC = PC + k +1 | None | |
| IJMP | Немає | Непрямий перехід на (Z) | PC = Z | None | |
| EIJMP | Немає | Розширений непрямий перехід на (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | None | |
| JMP | k | Перехід | PC = k | None | |
| 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 | |
| CPC | Rd,Rr | Зрівняти з переносом | Rd - Rr - C | Z,C,N,V,H,S | |
| CPI | Rd,K8 | Зрівняти з константою | Rd - K | Z,C,N,V,H,S | |
| 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+ 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, додайте п'ять циклів плюс по три циклу на кожне очікування.
Таблиця П. 2.3 – Команди пересилання даних
| Мнемоніка | Операнди | Опис | Операція | Прапори | Цикли |
| MOV | Rd,Rr | Скопіювати регістр | Rd = Rr | – | |
| MOVW | Rd,Rr | Скопіювати пари регістрів | Rd+1:Rd = Rr+1:Rr, r,d even | – | |
| LDI | Rd,K8 | Завантажити константу | Rd = K | – | |
| LDS | Rd,k | Пряме завантаження | Rd = (k) | – | 2* |
| LD | Rd,X | Непряме завантаження | Rd = (X) | – | 2* |
| LD | Rd,X+ | Непряме завантаження з пост-інкрементом | Rd = (X), X=X+1 | – | 2* |
| LD | Rd,-X | Непряме завантаження із пре-декрементом | X=X-1, Rd = (X) | – | 2* |
| LD | Rd,Y | Непряме завантаження | Rd = (Y) | – | 2* |
| LD | Rd,Y+ | Непряме завантаження з пост-інкрементом | Rd = (Y), Y=Y+1 | – | 2* |
| LD | Rd,-Y | Непряме завантаження із пре-декрементом | Y=Y-1, Rd = (Y) | – | 2* |
| LDD | Rd,Y+q | Непряме завантаження із заміщенням | Rd = (Y+q) | – | 2* |
| LD | Rd,Z | Непряме завантаження | Rd = (Z) | – | 2* |
| LD | Rd,Z+ | Непряме завантаження з пост-інкрементом | Rd = (Z), Z=Z+1 | – | 2* |
| LD | Rd,-Z | Непряме завантаження із пре-декрементом | Z=Z-1, Rd = (Z) | – | 2* |
| LDD | Rd,Z+q | Непряме завантаження із заміщенням | Rd = (Z+q) | – | 2* |
| STS | k,Rr | Пряме збереження | (k) = Rr | – | 2* |
| ST | X,Rr | Непряме збереження | (X) = Rr | – | 2* |
| ST | X+,Rr | Непряме збереження з пост-інкрементом | (X) = Rr, X=X+1 | – | 2* |
| ST | -X,Rr | Непряме збереження із пре-декрементом | X=X-1, (X)=Rr | – | 2* |
| ST | Y,Rr | Непряме збереження | (Y) = Rr | – | 2* |
| ST | Y+,Rr | Непряме збереження з пост-інкрементом | (Y) = Rr, Y=Y+1 | – | |
| ST | -Y,Rr | Непряме збереження із пре-декрементом | Y=Y-1, (Y) = Rr | – | |
| ST | Y+q,Rr | Непряме збереження із заміщенням | (Y+q) = Rr | – | |
| ST | Z,Rr | Непряме збереження | (Z) = Rr | – | |
| ST | Z+,Rr | Непряме збереження з пост-інкрементом | (Z) = Rr, Z=Z+1 | – | |
| ST | -Z,Rr | Непряме збереження із пре-декрементом | Z=Z-1, (Z) = Rr | – | |
| ST | Z+q,Rr | Непряме збереження із заміщенням | (Z+q) = Rr | – | |
| LPM | Немає | Завантаження із програмної пам'яті | R0 = (Z) | – | |
| LPM | Rd,Z | Завантаження із програмної пам'яті | Rd = (Z) | – | |
| LPM | Rd,Z+ | Завантаження із програмної пам'яті з пост-інкрементом | Rd = (Z), Z=Z+1 | – | |
| ELPM | Немає | Розширене завантаження з пам'яті програм | R0 = (RAMPZ:Z) | – | |
| ELPM | Rd,Z | Розширене завантаження з пам'яті програм | Rd = (RAMPZ:Z) | – | |
| ELPM | Rd,Z+ | Розширене завантаження із програмної пам'яті з пост-інкрементом | Rd = (RAMPZ:Z), Z = Z+1 | – | |
| SPM | Немає | Збереження в програмній пам'яті | (Z) = R1:R0 | – | - |
| ESPM | Немає | Розширене збереження в пам'яті програм | (RAMPZ:Z) = R1:R0 | – | - |
| IN | Rd,P | Читання порту | Rd = P | – | |
| OUT | P,Rr | Запис у порт | P = Rr | – | |
| PUSH | Rr | Занесення регістра в стек | STACK = Rr | – | |
| POP | Rd | Витяг регістра зі стека | Rd = STACK | – |
* Для операцій доступу до даних кількість циклів зазначена за умови доступу до внутрішньої пам'яті даних, і не коректно при роботі із зовнішнім ОЗУ. Для інструкцій LD, ST, LDD, STD, LDS, STS, PUSH і POP, необхідно додати один цикл.
Таблиця П. 2.4 – Команди для роботи з бітами.
| Мнемоніка | Операнди | Опис | Операція | Прапори | Цикли |
| LSL | Rd | Логічний зсув вліво | Rd(n+1)=Rd(n), Rd(0) =0, C=Rd(7) | Z,C,N,V,H,S | |
| LSR | Rd | Логічний зсув вправо | Rd(n)=Rd(n+1), Rd(7) =0, C=Rd(0) | Z,C,N,V,S | |
| ROL | Rd | Циклічний зсув вліво через C | Rd(0) =C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | |
| ROR | Rd | Циклічний зсув вправо через C | Rd(7) =C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | |
| ASR | Rd | Арифметичний зсув вправо | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | |
| SWAP | Rd | Перестановка тетрад | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | None | |
| BSET | s | Установка прапора | SREG(s) = 1 | SREG(s) | |
| BCLR | s | Очищення прапора | SREG(s) = 0 | SREG(s) | |
| SBI | P,b | Установити біт в порту | I/O(P,b) = 1 | None | |
| CBI | P,b | Очистити біт в порту | I/O(P,b) = 0 | None | |
| BST | Rr,b | Зберегти біт з регістра в T | T = Rr(b) | T | |
| BLD | Rd,b | Завантажити біт з T у регістр | Rd(b) = T | None | |
| SEC | Немає | Установити прапор переносу | C =1 | C | |
| CLC | Немає | Очистити прапор переносу | C = 0 | C | |
| SEN | Немає | Установити прапор негативного числа | N = 1 | N | |
| CLN | Немає | Очистити прапор негативного числа | N = 0 | N | |
| SEZ | Немає | Установити прапор нуля | Z = 1 | Z | |
| CLZ | Немає | Очистити прапор нуля | Z = 0 | Z | |
| SEI | Немає | Установити прапор переривань | I = 1 | I | |
| CLI | Немає | Очистити прапор переривань | I = 0 | I | |
| SES | Немає | Установити прапор числа зі знаком | S = 1 | S | |
| CLN | Немає | Очистити прапор числа зі знаком | S = 0 | S | |
| SEV | Немає | Установити прапор переповнення | V = 1 | V | |
| CLV | Немає | Очистити прапор переповнення | V = 0 | V | |
| SET | Немає | Установити прапор T | T = 1 | T | |
| CLT | Немає | Очистити прапор T | T = 0 | T | |
| SEH | Немає | Установити прапор внутрішнього переносу | H = 1 | H | |
| CLH | Немає | Очистити прапор внутрішнього переносу | H = 0 | H | |
| NOP | Немає | Немає операції | Немає | None | |
| SLEEP | Немає | Спати (зменшити енергоспоживання) | Дивіться опис інструкції | None | |
| WDR | Немає | Скидання сторожового таймера | Дивіться опис інструкції | None |
У мові Assembler немає розходження в регістрі символів.
Операнды можуть бути наступних видів:
§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).
Навчальне видання
МЕТОДИЧНІ ВКАЗІВКИ






