AVR програмирование в кодах

AVR
Известно, что у микроконтроллера AVR, 133 ассемблерных мнемонических команд, которым соответствует 76 машинные команды. Я постарался систематизировать и расписать эти команды.
Статья предлагается для тех, кто хочет написать свой компилятор, дизассемблер, ассемблер, или же просто имеет желание писать программы в машинных кодах :-).
Предполагается что минимальные знания о микроконтроллере AVR у читающих уже имеется.
Команды AVR микроконтроллера могут быть представлены 16 типами.

команды двухбайтовые:


Тип 1:


этим типом представлены 12 команд:
  • ADC (1C00h) сложить с переносом
  • ADD (0C00h) сложить два РОНа
  • AND (2000h) логическое И
  • CP (1400h) сравнить два РОНа
  • CPC (0400h) сравнить с учетом переноса
  • CPSE (1000h) сравнить и пропустить если равно
  • MOV (2C00h) копирование РОН
  • MUL (9C00h) умножение двух РОН (результат в регистровой паре R0:R1)
  • OR (2800h) логическое ИЛИ
  • SBC (1800h) вычитание с переносом
  • SUB (1800h) вычитание двух РОН
  • EOR (2400h) выполнить исключающие или двух РОН
в скобках указан машинный код маска

в качестве операндов выступают два регистра общего назначения (РОН):

рег.  прием.   ис-чн.    рег.  прием.   ис-чн.    рег.   прием.   ис-чн.   рег.  прием.  ис-чн.
r0   (0000h)  (0000h)    r8   (0080h)  (0008h)    r16   (0100h)  (0200h)   r24  (0180h) (0208h)
r1   (0010h)  (0001h)    r9   (0090h)  (0009h)    r17   (0110h)  (0201h)   r25  (0190h) (0209h)
r2   (0020h)  (0002h)    r10  (00A0h)  (000Ah)    r18   (0120h)  (0202h)   r26  (01A0h) (020Ah)
r3   (0030h)  (0003h)    r11  (00B0h)  (000Bh)    r19   (0130h)  (0203h)   r27  (01B0h) (020Bh)
r4   (0040h)  (0004h)    r12  (00C0h)  (000Ch)    r20   (0140h)  (0204h)   r28  (01C0h) (020Ch)
r5   (0050h)  (0005h)    r13  (00D0h)  (000Dh)    r21   (0150h)  (0205h)   r29  (01D0h) (020Dh)
r6   (0060h)  (0006h)    r14  (00E0h)  (000Eh)    r22   (0160h)  (0206h)   r30  (01E0h) (020Eh)
r7   (0070h)  (0007h)    r15  (00F0h)  (000Fh)    r23   (0170h)  (0207h)   r31  (01F0h) (020Fh)

как это все применить,
предположим мы решили написать коротенькую программу из 3 команд:

MOV r10, r11
ADD r10, r15
AND r10, r11

MOV (2C00h) R10 (000Ah) R11 (00B0h); 2C00h OR 000Ah OR 00B0h = 2CBAh
ADD (0C00h) R10 (000Ah) R15 (00F0h); 0C00h OR 000Ah OR 00F0h = 0CFAh
AND (2000h) R10 (000Ah) R11 (00B0h); 2000h OR 000Ah OR 00B0h = 20BAh

Тип 2:


этим типом представлены 2 команды:
  • ADIW (9600h) сложение непосредственного значения со словом
  • SBIW (9700h) вычитание непосредственного значения со словом
в качестве операнда используются регистровые пары

  рег.               
R24:R25     (0000h)  
X R26:R27   (0010h) 
Y R28:R29   (0020h) 
Z R30:R31   (0030h) 

непосредственное значение может быть представлено числом ( 0… 63 ), чтобы получить маску для вычисления машинного кода старшую тетраду надо умножить на 4 и сложить с младшей тетрадой
Пример вычисления машинного кода:
ADIW (9600h) r24 (0000h), 60 (003Ch); 9600h OR 0000h OR ((0030h * 4) OR 000Ch )=96CCh
SBIW (9700h) X (0010h), 17 (0011h); 9700h OR 0010h OR ((0010h * 4) OR 0001h )=9751h

Тип 3:


этим типом представлены 2 команды:
  • RJMP (C000h) относительный безусловный переход
  • RCALL (D000h) относительный вызов подпрограммы
значение операнда представлено в таблице

Пример вычисления машинного кода:

000:  label_1: rjmp label_2
001:           nop
002:           nop
003:           nop
004:  label_2: nop
005:           rjmp label_1
006:           nop


RJMP (C000h) label_2; C000h OR (адресс label_2 004 — текущий адресс 000 -1 = 003 ) = C003h
RJMP (C000h) label_1; C000h OR (адресс label_1 000 — текущий адресс 005 -1 = -6 ( 6 в двоичном коде 0000 0000 0110, для перевода в отрицательное число инвертируем, получаем 1111 1111 1001b и прибавляем 1, получаем 1111 1111 1010b или FFAh) ) = CFFAh

Тип 4:


этим типом представлены 16 команд:
  • ASR (9405h) арифметический сдвиг вправо
  • COM (9400h) дополнение до единицы
  • DEC (940Ah) уменьшение на единицу
  • INC (9403h) увеличить на единицу
  • LSR (9406h) логически сдвинуть вправо
  • NEG (9401h) выполнить дополнение до двух
  • POP (900Fh) загрузит регистр из стека
  • PUSH (920Fh) загрузить регистр в стек
  • ROR (9407h) сдвинуть вправо через перенос
  • SWAP (9402h) обмен тетрад
  • LD Rd,(-XYZ+) (8000h) считать косвенно
  • ST (-XYZ+),Rr (8200h) записать косвенно
  • LPM Rd,Z (9004h) загрузка памяти программ
  • LPM Rd,Z+ (9005h) загрузка памяти программ с постинкрементном
  • ELPM Rd,Z (9006h) расширенная загрузка данных из памяти программ
  • ELPM Rd,Z+ (9007h) расширенная загрузка данных из памяти программ с постинкрементом
в качестве операнда выступает регистр общего назначения (РОН);

рег.           рег.            рег.             рег.         
r0   (0000h)   r8   (0080h)    r16   (0100h)    r24  (0180h) 
r1   (0010h)   r9   (0090h)    r17   (0110h)    r25  (0190h) 
r2   (0020h)   r10  (00A0h)    r18   (0120h)    r26  (01A0h) 
r3   (0030h)   r11  (00B0h)    r19   (0130h)    r27  (01B0h) 
r4   (0040h)   r12  (00C0h)    r20   (0140h)    r28  (01C0h) 
r5   (0050h)   r13  (00D0h)    r21   (0150h)    r29  (01D0h) 
r6   (0060h)   r14  (00E0h)    r22   (0160h)    r30  (01E0h) 
r7   (0070h)   r15  (00F0h)    r23   (0170h)    r31  (01F0h) 

команды LD ST используют второй операнд;

рег.           рег.            рег.          
 X   (100Ch)    Y   (0008h)     Z    (0000h)  
-X   (100Eh)   -Y   (100Ah)    -Z    (1002h)  
 X+  (100Dh)    Y+  (1009h)     Z+   (1001h)  

Пример вычисления машинного кода:

LD r10, Z
LD r2, Z+
INC r10
ST -X, r10

LD (8000h) R10 (00A0h) Z (0000h); 8000h OR 00A0h OR 0000h = 80A0h
LD (8000h) R2 (0020h) Z+ (1001h); 8000h OR 0020h OR 1001h = 9021h
INC (9403h) R10 (00A0h); 9403h OR 00A0h = 94A3h
ST (8200h) R10 (00A0h) -X (100Eh); 8000h OR 00A0h OR 100Eh = 92AEh

Тип 5:

этим типом представлены 2 команды:
  • BCLR (9488h) очистить флаг
  • BSET (9408h) установить флаг

флаг          флаг            флаг             флаг
 I   (0070h)   H    (0050h)    V     (0030h)    Z    (0010h) 
 T   (0060h)   S    (0040h)    N     (0020h)    C    (0000h) 

Пример:
BSET (9408h) S (0040h); 9408h OR 0040h = 9448h
BCLR (9488h) I (0070h); 9488h OR 0070h = 94F8h

Тип 6:

этим типом представлены 4 команды:
  • BLD (F800h) загрузить T флаг в бит регистра
  • BST (FA00h) переписать бит из регистра во флаг T
  • SBRC (FC00h) пропустить команду, если бит в регистре очищен
  • SBRS (FE00h) пропустить команду, если бит в регистре установлен
в качестве операнда выступает регистр общего назначения (РОН);

рег.           рег.            рег.             рег.         
r0   (0000h)   r8   (0080h)    r16   (0100h)    r24  (0180h) 
r1   (0010h)   r9   (0090h)    r17   (0110h)    r25  (0190h) 
r2   (0020h)   r10  (00A0h)    r18   (0120h)    r26  (01A0h) 
r3   (0030h)   r11  (00B0h)    r19   (0130h)    r27  (01B0h) 
r4   (0040h)   r12  (00C0h)    r20   (0140h)    r28  (01C0h) 
r5   (0050h)   r13  (00D0h)    r21   (0150h)    r29  (01D0h) 
r6   (0060h)   r14  (00E0h)    r22   (0160h)    r30  (01E0h) 
r7   (0070h)   r15  (00F0h)    r23   (0170h)    r31  (01F0h) 


бит           бит             бит              бит
 0   (0000h)   2    (0002h)    4     (0004h)    6    (0006h) 
 1   (0001h)   3    (0003h)    5     (0005h)    7    (0007h) 

Пример:
BLD (F800h) R17 (0110h), 4 (0004h); F800h OR 0110h OR 0004h = F914h
BST (FA00h) R1 (0010h), 7 (0007h); FA00h OR 0010h OR 0007h = FA17h

Тип 7:

этим типом представлены 2 команды:
  • BRBS (F000h) перейти, если бит регистра SREG установлен
  • BRBC (F400h) перейти, если бит регистра SREG сброшен

флаг          флаг            флаг             флаг
 I   (0007h)   H    (0005h)    V     (0003h)    Z    (0001h) 
 T   (0006h)   S    (0004h)    N     (0002h)    C    (0000h) 


значение операнда представлено в таблице


Тип 8:

этим типом представлены 10 команд;
  • NOP (0000h) холостая команда
  • IJMP (9409h) перейти косвенно
  • RET (9508h) возврат из подпрограммы
  • RETI (9518h) возврат из прерывания
  • SLEEP (9588h) перейти в режим SLEEP
  • WDR (95A8h) сброс сторожевого таймера
  • LPM (95C8h) загрузить байт из памяти программ
  • SPM (95E8h) изменение содержимого памяти программ
  • ICALL (9509h) вызов подпрограммы косвенно
  • ELPM (95D8h) расширенная загрузка данных из памяти программ
Пример:
WDR = 95A8h
SLEEP = 9588h

Тип 9:

этим типом представлены две команды;
  • IN (B000h) загрузить данные из порта в/в в регистр

  • OUT (B800h) загрузить данные из регистра в порт в/в
в качестве операнда выступает регистр общего назначения (РОН);

рег.           рег.            рег.             рег.         
r0   (0000h)   r8   (0080h)    r16   (0100h)    r24  (0180h) 
r1   (0010h)   r9   (0090h)    r17   (0110h)    r25  (0190h) 
r2   (0020h)   r10  (00A0h)    r18   (0120h)    r26  (01A0h) 
r3   (0030h)   r11  (00B0h)    r19   (0130h)    r27  (01B0h) 
r4   (0040h)   r12  (00C0h)    r20   (0140h)    r28  (01C0h) 
r5   (0050h)   r13  (00D0h)    r21   (0150h)    r29  (01D0h) 
r6   (0060h)   r14  (00E0h)    r22   (0160h)    r30  (01E0h) 
r7   (0070h)   r15  (00F0h)    r23   (0170h)    r31  (01F0h) 

в качестве второго операнда выступает порт в/в;

порт           порт            порт             порт         
00   (0000h)   16   (0200h)    32    (0400h)    48   (0600h) 
01   (0001h)   17   (0201h)    33    (0401h)    49   (0601h) 
02   (0002h)   18   (0202h)    34    (0402h)    50   (0602h) 
03   (0003h)   19   (0203h)    35    (0403h)    51   (0603h) 
04   (0004h)   20   (0204h)    36    (0404h)    52   (0604h) 
05   (0005h)   21   (0205h)    37    (0405h)    53   (0605h) 
06   (0006h)   22   (0206h)    38    (0406h)    54   (0606h) 
07   (0007h)   23   (0207h)    39    (0407h)    55   (0607h) 
08   (0008h)   24   (0208h)    40    (0408h)    56   (0608h) 
09   (0009h)   25   (0209h)    41    (0409h)    57   (0609h) 
10   (000Ah)   26   (020Ah)    42    (040Ah)    58   (060Ah) 
11   (000Bh)   27   (020Bh)    43    (040Bh)    59   (060Bh) 
12   (000Ch)   28   (020Ch)    44    (040Ch)    60   (060Ch) 
13   (000Dh)   29   (020Dh)    45    (040Dh)    61   (060Dh) 
14   (000Eh)   30   (020Eh)    46    (040Eh)    62   (060Eh) 
15   (000Fh)   31   (020Fh)    47    (040Fh)    63   (060Fh) 

Пример:
IN (B000h) R10 (00A0h), DDRB(0207h); B000h OR 00A0h OR 0207h = B2A7h
OUT (B800h) DDRB (0207h), R2 (0020h); B800h OR 0207h OR 0020h= BA27h

Тип 10:

этим типом представлены две команды:
  • MULSU (0300h) умножение знакового с незнаковым
  • FMUL (0308h) дробное незнаковое умножение
  • FMULS (0380h) дробное умножение со знаком
  • FMULSU (0388h) дробное умножение знакового с незнаковым
в качестве операндов выступают два регистра общего назначения r16-r23 (РОН) результат заносится в регистровую пару r0:r1:

рег. операнд1 операнд2   рег. операнд1 операнд2
r16  (0000h)  (0000h)    r20  (0004h)  (0040h) 
r17  (0001h)  (0010h)    r21  (0005h)  (0050h) 
r18  (0002h)  (0020h)    r22  (0006h)  (0060h)
r19  (0003h)  (0030h)    r23  (0007h)  (0070h)

Пример вычисления машинного кода:
FMUL (0308h) R16 (0000h) R20 (0040h); 0308h OR 0000h OR 0040h = 0348h
MULSU (0388h) R20 (0004h) R16 (0000h); 0388h OR 0004h OR 0000h = 038Ch

Тип 12a:

этим типом представлена 1 команда:
  • MOVW (0100h) пересылка регистровой пары
в качестве операндов выступают два регистра общего назначения (РОН):

рег.    прием.   ис-чн.   рег.      прием.   ис-чн. 
r00:r01 (0000h)  (0000h)  r16:r17  (0080h)  (0008h) 
r02:r03 (0010h)  (0001h)  r18:r19  (0090h)  (0009h)
r04:r05 (0020h)  (0002h)  r20:r21  (00A0h)  (000Ah)
r06:r07 (0030h)  (0003h)  r22:r23  (00B0h)  (000Bh)
r08:r09 (0040h)  (0004h)  r24:r25  (00C0h)  (000Ch)
r10:r11 (0050h)  (0005h)  X r26:r27  (00D0h)  (000Dh)
r12:r13 (0060h)  (0006h)  Y r28:r29  (00E0h)  (000Eh)
r14:r15 (0070h)  (0007h)  Z r30:r31  (00F0h)  (000Fh)

Пример вычисления машинного кода:
MOVW (0100h) R02 (0010h) R04 (0002h); 0100h OR 0010h OR 0002h = 0112h
MOVW (0100h) R10 (0050h) Z (000Fh); 0100h OR 0050h OR 000Fh = 015Fh

Тип 12b:
этим типом представлена 1 команда:
  • MULS (0200h) знаковое умножение
в качестве операндов выступают два регистра общего назначения (РОН):

рег.  ис-чн.1    ис-чн.2   рег.   ис-чн.1   ис-чн.2
r16   (0000h)   (0000h)    r24    (0080h)  (0008h) 
r17   (0010h)   (0001h)    r25    (0090h)  (0009h)
r18   (0020h)   (0002h)    r26    (00A0h)  (000Ah)
r19   (0030h)   (0003h)    r27    (00B0h)  (000Bh)
r20   (0040h)   (0004h)    r28    (00C0h)  (000Ch)
r21   (0050h)   (0005h)    r29    (00D0h)  (000Dh)
r22   (0060h)   (0006h)    r30    (00E0h)  (000Eh)
r23   (0070h)   (0007h)    r31    (00F0h)  (000Fh)

Пример вычисления машинного кода:
MULS (0200h) R16 (0000h) R24 (0080h); 0200h OR 0000h OR 0080h = 0280h

Тип 13:

этим типом представлены 6 команд:
  • CPI (3000h) сравнить с конгстантой
  • SBCI (4000h) вычесть непосредственное значение с переносом
  • SUBI (5000h) вычесть непосредственное значение
  • ORI (6000h) выполнить логическое OR с непосредственным значением
  • ANDI (7000h) выполнить логическое AND с непосредственным значением
  • LDI (E000h) загрузить непосредственное значение
один из операндов РОН (r16..r31);

рег.            рег.           рег.             рег.         
r16   (0000h)   r20  (0040h)   r24   (0080h)    r28  (00C0h) 
r17   (0010h)   r21  (0050h)   r25   (0090h)    r29  (00D0h) 
r18   (0020h)   r22  (0060h)   r26   (00A0h)    r30  (00E0h) 
r19   (0030h)   r23  (0070h)   r27   (00B0h)    r31  (00F0h) 

второй операнд непосредственное значение, для получения маски надо старшую тетраду шестнадцатеричного числа умножить на 16 (10h) и сложить с младшей тетрадой;

Пример вычисления машинного кода:

LDI r20, #34h
SUBI r20, #12h
CPI r22, #10h

LDI (E000h) R20 (0040h) #34h (0034h); E000h OR 0040h OR (0030h*10h+0004h) = E344h
SUBI (5000h) R20 (0040h) #12h (0012h); 5000h OR 0040h OR (0010h*10h+0002h) = 5142h
CPI (3000h) R22 (0060h) #10h (0010h); 3000h OR 0060h OR (0010h*10h+0000h) = 3160h

Тип 15:

этим типом представлены 4 команды:
  • CBI (9800h) сбросит разряд в регистре в/в
  • SBIC (9900h) пропустить команду, если бит порта в/в очищен
  • SBI (9A00h) установить разряд в регистре в/в
  • SBIS (9B00h)пропустить команду, если бит порта в/в установлен
один из операндов порт в/в 0-31 второй номер бита 0-7;

порт          порт            порт           порт         
00   (0000h)   16   (0040h)    08   (0080h)   24   (00C0h) 
01   (0008h)   17   (0048h)    09   (0088h)   25   (00C8h)
02   (0010h)   18   (0050h)    10   (0090h)   26   (00D0h)
03   (0018h)   19   (0058h)    11   (0098h)   27   (00D8h)
04   (0020h)   20   (0060h)    12   (00A0h)   28   (00E0h)
05   (0028h)   21   (0068h)    13   (00A8h)   29   (00E8h)
06   (0030h)   22   (0070h)    14   (00B0h)   30   (00F0h)
07   (0038h)   23   (0078h)    15   (00B8h)   31   (00F8h)



бит           бит             бит              бит
 0   (0000h)   2    (0002h)    4     (0004h)    6    (0006h) 
 1   (0001h)   3    (0003h)    5     (0005h)    7    (0007h) 


Пример вычисления машинного кода:
SBIC (9900h) 16 (0040h), 4 (0004h); 9900h OR 0040h OR 0004h = 9944h
SBI (9A00h) 16 (0040h) 4 (0004h); 9A00h OR 0040h OR 0004h = 9A44h

Тип 16:

этим типом представлены 4 команды:
  • LDD Rd,Z+q (8000h) косвенное относительное чтение памяти
  • LDD Rd,Y+q (8008h) косвенное относительное чтение памяти
  • STD Rd,Z+q (8200h) косвенное относительное запись памяти
  • STD Rd,Y+q (8208h) косвенное относительное запись памяти
в качестве операнда выступает регистр общего назначения (РОН);

рег.           рег.            рег.             рег.           
r0   (0000h)   r8   (0080h)    r16   (0100h)    r24  (0180h) 
r1   (0010h)   r9   (0090h)    r17   (0110h)    r25  (0190h) 
r2   (0020h)   r10  (00A0h)    r18   (0120h)    r26  (01A0h) 
r3   (0030h)   r11  (00B0h)    r19   (0130h)    r27  (01B0h) 
r4   (0040h)   r12  (00C0h)    r20   (0140h)    r28  (01C0h) 
r5   (0050h)   r13  (00D0h)    r21   (0150h)    r29  (01D0h) 
r6   (0060h)   r14  (00E0h)    r22   (0160h)    r30  (01E0h) 
r7   (0070h)   r15  (00F0h)    r23   (0170h)    r31  (01F0h) 

смещение 0-63;

смещ.         смещ.         смещ.          смещ.   
 00  (0000h)   10  (0800h)   20   (2000h)   30  (2800h) 
 01  (0001h)   11  (0801h)   21   (2001h)   31  (2801h) 
 02  (0002h)   12  (0802h)   22   (2002h)   32  (2802h) 
 03  (0003h)   13  (0803h)   23   (2003h)   33  (2803h) 
 04  (0004h)   14  (0804h)   24   (2004h)   34  (2804h) 
 05  (0005h)   15  (0805h)   25   (2005h)   35  (2805h) 
 06  (0006h)   16  (0806h)   26   (2006h)   36  (2806h) 
 07  (0007h)   17  (0807h)   27   (2007h)   37  (2807h) 
 08  (0400h)   18  (0C00h)   28   (2400h)   38  (2C00h) 
 09  (0401h)   19  (0C01h)   29   (2401h)   39  (2C01h) 
 0A  (0402h)   1A  (0C02h)   2A   (2402h)   3A  (2C02h) 
 0B  (0403h)   1B  (0C03h)   2B   (2403h)   3B  (2C03h) 
 0C  (0404h)   1C  (0C04h)   2C   (2404h)   3C  (2C04h) 
 0D  (0405h)   1D  (0C05h)   2D   (2405h)   3D  (2C05h) 
 0E  (0406h)   1E  (0C06h)   2E   (2406h)   3E  (2C06h) 
 0F  (0407h)   1F  (0C07h)   2F   (2407h)   3F  (2C07h) 
 

Пример вычисления машинного кода:
LDD(Z+q) (8000h) R16 (0100h), Z + 25h (2005h); 8000h OR 0100h OR 2005h = A105h
STD(Y+q) (8208h) R20 (0140h), Z + 02h (0002h); 8208h OR 0140h OR 0002h = 834Ah

четырехбайтные :


Тип 11:

сюда входит 2 команды:
  • JMP (940C 0000h) абсолютный переход
  • CALL (940E 0000h) абсолютный вызов подпрограммы
в качестве операнда выступает адрес который загружается в регистр PC значение может быть от 0 до 3FFFFFh, используется до 1FFFFh;
Пример вычисления машинного кода:
JMP (940C 0000h) 1234h; 940C0000h OR 00001234h = 940C1234h

Тип 14:

этим типом представлены 2 команды:
  • STS (9200 0000h) загрузить непосредственно в память
  • LDS (9000 0000h) считать непосредственно из памяти
один из операндов РОН, второй непосредственное значение ( 0..FFFFh ):

рег.              рег.              рег.              рег.         
r0 (0000 0000h)   r8  (0080 0000h)  r16 (0100 0000h)  r24 (0180 0000h) 
r1 (0010 0000h)   r9  (0090 0000h)  r17 (0110 0000h)  r25 (0190 0000h) 
r2 (0020 0000h)   r10 (00A0 0000h)  r18 (0120 0000h)  r26 (01A0 0000h) 
r3 (0030 0000h)   r11 (00B0 0000h)  r19 (0130 0000h)  r27 (01B0 0000h) 
r4 (0040 0000h)   r12 (00C0 0000h)  r20 (0140 0000h)  r28 (01C0 0000h) 
r5 (0050 0000h)   r13 (00D0 0000h)  r21 (0150 0000h)  r29 (01D0 0000h) 
r6 (0060 0000h)   r14 (00E0 0000h)  r22 (0160 0000h)  r30 (01E0 0000h) 
r7 (0070 0000h)   r15 (00F0 0000h)  r23 (0170 0000h)  r31 (01F0 0000h) 

Пример вычисления машинного кода:
LDS (9000 0000h) R19 (0130 0000h), 3Fh (0000 003Fh); 90000000h OR 01300000h OR 0000003Fh = 9130003Fh
STS (9200 0000h) R31 (01F0 0000h), 2FFh (0000 02FFh); 92000000h OR 01F00000h OR 000002FFh = 93F002FFh

Команды не вошедшие:

Для удобства пользования один и тот же код команды может быть представлен разными мнемоническими значениями, например команда SER r16 установить все биты регистра, эквивалентна команде LDI r16, 255 загрузить непосредственное значение в регистр. Ниже представлены эти команды:

мнемонические варианты команды BRBC условный переход:
BRCC перейти, если флаг переноса C сброшен sss=0 (BRBC C, label)
BRSH перейти, если больше или равно, флаг C сброшен sss=0 (BRBC C, label)
BRNE перейти, если не равно, Z сброшен sss=1
(BRBC Z, label)
BRPL перейти, если результат положительный, N сброшен sss=2 (BRBC N, label)
BRVC перейти, если флаг переполнения V сброшен sss=3 (BRBC V, label)
BRGE перейти, если больше или равно с учетом знака, S сброшен sss=4 (BRBC S, label)
BRHC перейти, если флаг полу переноса H сброшен sss=5 (BRBC H, label)
BRTC перейти, если флаг T сброшен sss=6 (BRBC T, label)
BRID перейти, если прерывания запрещены, I сброшен sss=7 (BRBC I, label)

мнемонические варианты команды BRBS условный переход:
BRCS перейти, если флаг переноса C установлен sss=0 (BRBS C, label)
BRLO перейти, если меньше (без знака), флаг C установлен sss=0 (BRBS C, label)
BRNE перейти, если не равно, Z установлен sss=1 (BRBS Z, label)
BRMI перейти, если результат отрицательный, N установлен sss=2 (BRBS N, label)
BRVS перейти, если флаг переполнения V установлен sss=3 (BRBS V, label)
BRLT перейти, если меньше чем (со знаком )флаг S установлен sss=4 (BRBS S, label)
BRHS перейти, если флаг полу переноса H установлен sss=5 (BRBS H, label)
BRTS перейти, если флаг T установлен sss=6 (BRBS T, label)
BRIE перейти, если прерывания разрешены, I установлен sss=7 (BRBS I, label)

мнемонические варианты команды BCLR:
CLC очистить флаг С sss=0 (BCLR C)
CLZ очистить флаг Z sss=1 (BCLR Z)
CLN очистить флаг N sss=2 (BCLR N)
CLV очистить флаг V sss=3 (BCLR V)
CLS очистить флаг S sss=4 (BCLR S)
CLH очистить флаг H sss=5 (BCLR H)
CLT очистить флаг T sss=6 (BCLR T)
CLI очистить флаг I sss=7 (BCLR I)

мнемонические варианты команды BSET:
SEC установить флаг С sss=0 (BSET C)
SEZ установить флаг Z sss=1 (BSET Z)
SEN установить флаг N sss=2 (BSET N)
SEV установить флаг V sss=3 (BSET V)
SES установить флаг S sss=4 (BSET S)
SEH установить флаг H sss=5 (BSET H)
SET установить флаг T sss=6 (BSET T)
SEI установить флаг I sss=7 (BSET I)

мнемонический вариант команды AND:
TST проверка РОН
пример: команда TST r10, аналог AND r10, r10

мнемонический вариант команды ANDI:
CBR сбросить разряд в регистре
пример: команда CBR r20, 80h, обнулить старший бит в регистре r20 аналог ANDI r20, 7Fh

мнемонический вариант команды ORI:
CBR установить разряд в регистре
пример: команда SBR r20, 80h, установить старший бит в регистре r20 аналог ORI r20, 80h

мнемонический вариант команды EOR:
CLR очистить регистр в качестве обоих операндов приемник и источник выступает один и тот же РОН
пример: команда CLR r0 аналог EOR r0,r0

мнемонический вариант команды ADD:
LSL логически сдвинуть влево, в качестве обоих операндов приемник и источник выступает один и тот же РОН
пример: команда LSL r0 аналог ADD r0,r0

мнемонический вариант команды ADC:
ROL сдвинуть влево через перенос, в качестве обоих операндов приемник и источник выступает один и тот же РОН
пример: команда ROL r10 аналог ADC r10,r10

список сокращений:
  • КОП — код операции
  • РОН — регистр общего назначения
  • RRRRR — регистр источник РОН r0..r31
  • DDDDD — регистр приемник (источник приемник) РОН r0..r31
  • KKKKKK — непосредственное значение
  • SSS — SREG номер бита в регистре 0..7
  • BBB — номер бита 0..7
  • AAAAAA — порт ввода вывода
  • qqqqq — смещение
  • прием. — регистр приемник (источник)
  • ис-чн. — регистр источник
  • рег. — регистр РОН

Если будут замечены ошибки, напишите, исправлю.
  • +12
  • 24 ноября 2011, 22:59
  • BOBBY
  • 1
Файлы в топике: avr_система команд.zip

Комментарии (30)

RSS свернуть / развернуть
( * не вошли три команды ELPM, используемые только в ATMega128 )
Неужели так сложно описать всего 3 команды и получить в результате действительно полное описание?

Алсо список эмелируемых команд неплохо бы пополнить мнемониками, в которые они транслируются, типа:
CLZ: очистить флаг Z (BCLR Z)

в качестве операнда выступает адрес который загружается в регистр PC значение может быть от 0 до 3FFFFFh, используется до FFFFh;
Скорее до 1FFFFh — есть же еще мега256.
0
  • avatar
  • Vga
  • 25 ноября 2011, 02:20
О, сенкс. Единственное, что в
SEC установить флаг С sss=0 (BSET 0)
Все же нагляднее «BSET C», ИМХО. О том, что C кодируется как ноль сказано как в описании BSET, так и непосредственно в этой строке («sss=0»). Алсо, там же в командах переходов ИМХО «met» лучше заменить на «label».
0
согласен (BSET C) нагляднее.
На счет met или label спорный вопрос например у Юрова в «практикум ASSEMBLER» метки стоят либо осмысленные вроде — cicl2: или безликие — m1:, m2:
Хотя метка label:, в данном контексте, более правильно.
0
Алсо, верни в бложек AVR, там этому топику самое место.
0
Зачем эта статья?..
0
хотел написать компактный ассемблер кило на 4 и запихать его в кристалл, что то вроде AVR пишет программы для AVR.
Как результат пока статья, а там посмотрим…
0
Теперь можно написать свой бэк-энд для какого-то компилятора :)
0
Да, для LLVM AVR бэкенд вполне актуален.
0
STS (9200 0000h) косвенная относительная запись в память
LDS (9000 0000h) косвенное относительное чтение памяти

Copy&paste detected.

STS — Store direct to SRAM
LDS — Load direct from SRAM

Это-таки прямая запись и чтение, поправьте.
0
спасибо, исправил.
0
Сории за тупость, а как расшифровывается «коп» в описании команды (да и другие R, K,S )?
0
в конце статьи есть расшифровка… коп — код операции
0
Спасибо, не заметил.
0
SBIW (9700h) X (0010h), 17 (0011h); 9700h AND 0010h AND ((0010h * 4) AND 0001h )=9751h
кажется что тут должно быть 9741 вместо 9751
или чтото не досказано?
0
нет все правильно
sbiw X, 11h (X:=X-11h)

  9700h   код операции
& 0010h   операнд X
& 0040h   старшая тетрада  умноженная на 4 
& 0001h   младшая тетрада
--------
  9751h
0
кажется что тут должно быть 9741 вместо 9751

Кажется, тут должен быть не AND (&), а OR (|). :) А так — +1.
0
OR, ага, тогда все ясно ;)
BOBBY, исправь :)
0
да, затупил… щас
0
Исправил :)
0
Кстати, отличная статья ))
Автору +1 )
0
О госпаде! Зачем тут эта картинка?!111 Внезапно же. Йа испугался
+2
Рисунки на полях, бывает в тему бывает просто так…
0
Спасибо, статья в тему, как раз недавно занимался изобретением своего велоситранслятора для avr =)
0
… или же имеет желание писать программы в машинных кодах
BOBBY, тем кто имеет такое желание — нужно к доктору и как можно скорее ;)… назвал-бы тему «по-людски» — например: «пишем компилятор для AVR»… а так, по смыслу, вполне съедобно
0
Ви никогда не вбивали программу тумблерами? Многое потеряли :)
+2
1K для звонка… после чего был сделан программатор на LPT и написана программа для загрузки bin файла в РФ
0
Тумблеры? Клавиатуры? Вам повезло… Видел станочек, которой вообще ферритами программируется. Вставил брусочек — единичка, вытащил — нолик. И так вся программа.
0
тумблерами славу богу не довелось, а вот программировать на смеси <BASIC-машинный код> для ZX-Spectrum приходилось. Когда нашел ассемблер (GENS кажется) «ночные кошмары» закончились :)
0
Ну вот для начинающих сея стать тоже полезна, хоть увидят как работает ассемблер, а то я часто вижу потуги применять команды не по назначению. Словно это си операторы, а потом ходят ко мне в комменты и жалуются, чего это у них в регистр строка не копируется, или команда ldi не хочет из регистра в регистр перебросить данные.
0
ПЛИСоводам может быть интересно ))) Написать AVR-ядро для ПЛИС. Марсоходовцы нечто подобное делали.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.