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).
Навчальне видання
МЕТОДИЧНІ ВКАЗІВКИ