概要
インタープリタを作ってみた。
avrインタープリター書いてみた。
avrの命令調べてみた。
命令セット
Command | Operands | Operation | Description | Flags | Cycles | Opcode |
---|---|---|---|---|---|---|
ADC | Rd, Rr | Rd←Rd + Rr + C | Add two registers with carry | --HSVNZC | 1 | 0001 11rd dddd rrrr |
ADD | Rd,Rr | Rd←Rd + Rr | Add two registers | --HSVNZC | 1 | 0000 11rd dddd rrrr |
ADIW | Rh:Rl, K | Rh:Rl←Rh:Rl + K | Add immediate to Word (0 ≤ K ≤ 63) | ---SVNZC | 2 | 1001 0110 KKdd KKKK |
AND | Rd,Rr | Rd←Rd • Rr | Logical AND two registers | ---SVNZ-, V cleared | 1 | 0010 00rd dddd rrrr |
ANDI | Rd, K | Rd←Rd • K | Logical AND with immediate (16 ≤ d ≤ 31) | ---SVNZ-, V cleared | 1 | 0111 KKKK dddd KKKK |
ASR | Rd | C←Rd(0), Rd(6…0) ←Rd(7…1), Rd(7) ←Rd(7) | Arithmetic shift right | ---SVNZC | 1 | 1001 010d dddd 0101 |
BCLR | s | SREG(s) ←0 | Clear bit in status register | SREG(s) | 1 | 1001 0100 1sss 1000 |
BLD | Rd,b | Rd(b) ←T | Load bit in register from T | -T------ | 1 | 1111 100d dddd 0bbb |
BRBC | s,k | if(SREG(s) = 0) PC←PC + k + 1 | Branch if status register flag cleared | -------- | 1,2* | 1111 01kk kkkk ksss |
BRBS | s,k | if(SREG(s) = 1) PC←PC + k + 1 | Branch if status register flag set | -------- | 1,2* | 1111 00kk kkkk ksss |
BRCC | k | if(C=0) then PC←PC + k + 1 | Branch if carry cleared, Same as brbc 0,k and brsh | -------- | 1,2* | 1111 01kk kkkk k000 |
BRCS | k | if(C=1) then PC←PC + k + 1 | Branch if carry set, Same as brbs 0,k and brlo | -------- | 1,2* | 1111 00kk kkkk k000 |
BREAK | For on-chip debug only | -------- | 1 | 1001 0101 1001 1000 | ||
BREQ | k | if(Z=1) then PC←PC + k + 1 | Branch if equal, Same as brbs 1,k | -------- | 1,2* | 1111 00kk kkkk k001 |
BRGE | k | if(S=0) then PC←PC + k + 1 | Branch if greater or equal (signed), Same as brbc 4,k | -------- | 1,2* | 1111 01kk kkkk k100 |
BRHC | k | if(H=0) then PC←PC + k + 1 | Branch if half-carry flag cleared, Same as brbc 5,k | -------- | 1,2* | 1111 01kk kkkk k101 |
BRHS | k | if(H=1) then PC←PC + k + 1 | Branch if half-carry flag set, Same as brbs 5,k | -------- | 1,2* | 1111 00kk kkkk k101 |
BRID | k | if(I=0) then PC←PC + k + 1 | Branch if interrupt disabled, Same as brbc 7,k | -------- | 1,2* | 1111 01kk kkkk k111 |
BRIE | k | if(I=1) then PC←PC + k + 1 | Branch if interrupts enabled, Same as brbs 7,k | -------- | 1,2* | 1111 00kk kkkk k111 |
BRLO | k | if(C=1) then PC←PC + k + 1 | Branch if lower, unsigned, Same as brbs 0,k and brcs | -------- | 1,2* | 1111 00kk kkkk k000 |
BRLT | k | if(S=1) then PC←PC + k + 1 | Branch if less than (signed), Same as brbs 4,k | -------- | 1,2* | 1111 00kk kkkk k100 |
BRMI | k | if(N=1) then PC←PC + k + 1 | Branch if minus, Same as brbs 2,k | -------- | 1,2* | 1111 00kk kkkk k010 |
BRNE | k | if(Z=0) then PC←PC + k + 1 | Branch if not equal, Same as brbc 1,k | -------- | 1,2* | 1111 01kk kkkk k001 |
BRPL | k | if(N=0) then PC←PC + k + 1 | Branch if plus, Same as brbc 2,k | -------- | 1,2* | 1111 01kk kkkk k010 |
BRSH | k | if(C=0) then PC←PC + k + 1 | Branch if same or higher, unsigned, Same as brbc 0,k and brcc | -------- | 1,2* | 1111 01kk kkkk k000 |
BRTC | k | if(T=0) then PC←PC + k + 1 | Branch if T flag cleared, Same as brbc 6,k | -------- | 1,2* | 1111 01kk kkkk k110 |
BRTS | k | if(T=1) then PC←PC + k + 1 | Branch if T flag set, Same as brbs 6,k | -------- | 1,2* | 1111 00kk kkkk k110 |
BRVC | k | if(V=0) then PC←PC + k + 1 | Branch if overflow flag is cleared, Same as brbc 3,k | -------- | 1,2* | 1111 01kk kkkk k011 |
BRVS | k | if(V=1) then PC←PC + k + 1 | Branch if overflow flag is set, Same as brbs 3,k | -------- | 1,2* | 1111 00kk kkkk k011 |
BSET | s | SREG(s) ←1 | Set bit in status register | SREG(s) | 1 | 1001 0100 0sss 1000 |
BST | Rr,b | T←Rr(b) | Bit store from register to T | -T------ | 1 | 1111 101d dddd 0bbb |
CALL | k | PC←k; Stack←PC + 2; SP←SP–2 | Direct subroutine call. 0≤k≤64K | -------- | 4 | 1001 010k kkkk 111k kkkk kkkk kkkk kkkk |
CBI | P, b | IOP ←0 | Clear bit in I/O register, only for 0≤P≤31 | -------- | 2 | 1001 1000 PPPP Pbbb |
CBR | Rd, K | Rd←Rd•K | Clear bit(s) in register, only for 16≤d≤31 | ---SVNZ-, V cleared | 1 | As per ANDi with K Complemented |
CLC | C←0 | Clear carry flag, Same as bclr 0 | -------C | 1 | 1001 0100 1000 1000 | |
CLH | H←0 | Clear half-carry flag, Same as bclr 5 | --H----- | 1 | 1001 0100 1101 1000 | |
CLI | I←0 | Clear global interrupt flag (disable interrupts), Same as bclr 7 | I------- | 1 | 1001 0100 1111 1000 | |
CLN | N←0 | Clear negative flag, Same as bclr 2 | -----N-- | 1 | 1001 0100 1010 1000 | |
CLR | Rd | Rd←Rd ⊕ Rd | Clear register, Same as eor Rd, Rd | ---SVNZ-, Z set; S,V,N cleared | 1 | 0010 01Dd dddd DDDD (DDDDD=ddddd) |
CLS | S←0 | Clear signed flag, Same as bclr 4 | ---S---- | 1 | 1001 0100 1100 1000 | |
CLT | T←0 | Clear T flag, Same as bclr 6 | -T------ | 1 | 1001 0100 1110 1000 | |
CLV | V←0 | Clear overflow flag, Same as bclr 3 | ----V--- | 1 | 1001 0100 1011 1000 | |
CLZ | Z←0 | Clear zero flag, Same as bclr 1 | ------Z- | 1 | 1001 0100 1001 1000 | |
COM | Rd | Rd←Rd or Rd←$FF – Rd | One’s complement (inversion) | ---SVNZC, V cleared, C set | 1 | 1001 010d dddd 0000 |
CP | Rd, Rr | Rd – Rr | Compare | --HSVNZC | 1 | 0001 01rd dddd rrrr |
CPC | Rd,Rr | Rd – Rr – C | Compare with Carry | --HSVNZC | 1 | 0000 01rd dddd rrrr |
CPI | Rd, K | Rd – K | Compare with immediate, 16≤ d ≤ 31 | --HSVNZC | 1 | 0011 KKKK dddd KKKK |
CPSE | Rd,Rr | if(Rd=Rr) PC←PC + 2 (or 3) | Compare, skip if equal. | -------- | 1,2, 3† | 0001 00rd dddd rrrr |
DEC | Rd | Rd←Rd – 1 | Decrement register | ---SVNZ- | 1 | 1001 010d dddd 1010 |
EOR | Rd,Rr | Rd←Rd ⊕ Rr | Exclusive OR two registers | ---SVNZ-, V cleared | 1 | 0010 01rd dddd rrrr |
FMUL | Rd, Rr | R1:R0 ← Rd * Rr | Multiply unsigned 1.7 fractional number by another. 16 ≤ d ≤ 23, 16 ≤ r ≤ 23 | ------ZC | 2 | 0000 0011 0ddd 1rrr |
FMULS | Rd, Rr | R1:R0 ← Rd * Rr | Multiply signed 1.7 fractional number by another. 16 ≤ d ≤ 23, 16 ≤ r ≤ 23 | ------ZC | 2 | 0000 0011 1ddd 0rrr |
FMULSU | Rd, Rr | R1:R0 ← Rd * Rr | Multiply 1.7 fractional signed number (Rd) by 1.7 fractional unsigned number (Rr). 16 ≤ d ≤ 23, 16 ≤ r ≤ 23 | ------ZC | 2 | 0000 0011 1ddd 1rrr |
ICALL | PC←Z; Stack←PC + 1; SP←SP–2 | Indirect call to Z | -------- | 3 | 1001 0101 0000 1001 | |
IJMP | PC←Z | Indirect Jump to Z | -------- | 2 | 1001 0100 0000 1001 | |
IN | Rd, P | Rd←IO[P] | Load an I/O Location to Register | -------- | 1 | 1011 0PPd dddd PPPP |
INC | Rd | Rd←Rd + 1 | Increment register | ---SVNZ- | 1 | 1001 010d dddd 0011 |
JMP | k | PC ← k | Jump to address anywhere in program memory. (0 ≤ k ≤ 4M) | -------- | 3 | 1001 010k kkkk 110k kkkk kkkk kkkk kkkk |
LD | Rd, W | Rd←M[W] | Load Indirect (Y or Z case) | -------- | 2 | 1000 000d dddd W000 |
LD | Rd, X | Rd←M[X] | Load Indirect (X case) | -------- | 2 | 1001 000d dddd 1100 |
LDD | Rd,W+ q | Rd←M[W+q] | Load Indirect with Displacement (Y or Z only) | -------- | 2 | 10q0 qq0d dddd Wqqq |
LD | Rd, W+ | Rd←M[W]; W←W+1 | Load Indirect with Postincrement (Y or Z) | -------- | 2 | 1001 000d dddd W001 |
LD | Rd, X+ | Rd←M[X]; X←X+1 | Load Indirect with Postincrement (X) | -------- | 2 | 1001 000d dddd 1101 |
LD | Rd, -W | W←W-1; Rd←M[W] | Load Indirect with Pre-decrement (Y or Z) | -------- | 2 | 1001 000d dddd W010 |
LD | Rd, -X | X←X-1; Rd←M[X] | Load Indirect with Pre-decrement (X) | -------- | 2 | 1001 000d dddd 1110 |
LDI | Rd, K | Rd←K | Load Immediate, 16 ≤ d ≤ 31 | -------- | 1 | 1110 KKKK dddd KKKK |
LDS | Rd, k | Rd←M[k] | Load Direct from SRAM, 0≤k≤65535 | -------- | 2 | 1001 000d dddd 0000 kkkk kkkk kkkk kkkk |
LPM | R0←PM[Z] | Load program memory, Z contains a byte address. Least significant bit of Z selects low byte of the program word (if 0) or high byte (if 1) | -------- | 3 | 1001 0101 1100 1000 | |
LPM | Rd, Z | Rd←PM[Z] | As above, destination is Rd | -------- | 3 | 1001 000d dddd 0100 |
LPM | Rd, Z+ | R0←PM[Z] Z←Z+1 | As above, destination is Rd. Z is incremented | -------- | 3 | 1001 000d dddd 0100 |
LSL | Rd | C←Rd(7); Rd(7…1) ←Rd(6…0); Rd(0) ←0 | Logical Shift Left, Same as add Rd,Rd | --HSVNZC | 1 | 0000 11Dd dddd DDDD (DDDDD=ddddd) |
LSR | Rd | C←Rd(0); Rd(6…0) ←Rd(7…1); Rd(7) ←0 | Logical Shift Right | ---SVNZC, N←0 | 1 | 1001 010d dddd 0110 |
MOV | Rd, Rr | Rd←Rr | Move between registers | -------- | 1 | 0010 11rd dddd rrrr |
MOVW | Rd, Rr | Rd+1:Rd← Rr+1:Rr | Copy one register pair to another. d=0,2,4…30; r=0,2,4…30 | -------- | 1 | 0000 0001 dddd rrrr |
MUL | Rd, Rr | R1:R0 ← Rd * Rr | Multiply two 8-bit unsigned numbers. (Unsigned result) | ------ZC | 2 | 1001 11rd dddd rrrr |
MULS | Rd, Rr | R1:R0 ← Rd * Rr | Multiply two 8-bit signed numbers. 16 ≤ d ≤ 31, 16 ≤ r ≤ 31 | ------ZC | 2 | 0000 0010 dddd rrrr |
MULSU | Rd, Rr | R1:R0 ← Rd * Rr | Multiply 8-bit signed number (Rd) by 8-bit unsigned number (Rr). 16 ≤ d ≤ 23, 16 ≤ r ≤ 23 | ------ZC | 2 | 0000 0011 0ddd 0rrr |
NEG | Rd | Rd←$00 – Rd | Two’s complement (negation) | --HSVNZC | 1 | 1001 010d dddd 0001 |
NOP | No operation | -------- | 1 | 0000 0000 0000 0000 | ||
OR | Rd,Rr | Rd←Rd or Rr | Logical OR two registers | ---SVNZ-, V cleared | 1 | 0010 10rd dddd rrrr |
ORI | Rd, K | Rd←Rd or K | Logical OR with immediate, 16 ≤ d ≤ 31 | ---SVNZ-, V cleared | 1 | 0110 KKKK dddd KKKK |
OUT | P, Rr | IO[P] ←Rr | Store Register to I/O Location | -------- | 1 | 1011 1PPr rrrr PPPP |
POP | Rd | SP←SP+1; Rd←STACK | Pop register from stack | -------- | 2 | 1001 000d dddd 1111 |
PUSH | Rr | STACK←Rr; SP←SP–1 | Push register on Stack | -------- | 2 | 1001 001r rrrr 1111 |
RCALL | k | PC←PC + k + 1; Stack←PC + 1; SP←SP–2 | Relative Subroutine Call, -2048 ≤ k ≤ 2047 | -------- | 3 | 1101 kkkk kkkk kkkk |
RET | SP←SP+2; PC←Stack | Subroutine return | -------- | 4 | 1001 0101 0000 1000 | |
RETI | SP←SP+2; PC←Stack | Return from interrupt (and enable interrupts) | I-------, I is set | 4 | 1001 0101 0001 1000 | |
RJMP | k | PC←PC + k + 1; | Relative Jump, -2048 <= k <= 2047 | -------- | 2 | 1100 kkkk kkkk kkkk |
ROL | Rd | C←Rd(7); Rd(7…1) ←Rd(6…0); Rd(0) ←C | Rotate left through carry, Same as adc Rd,Rd | --HSVNZC | 1 | 0001 11Dd dddd DDDD (DDDDD=ddddd) |
ROR | Rd | C←Rd(0); Rd(6…0) ←Rd(7…1); Rd(7) ←C | Rotate right through carry | ---SVNZC | 1 | 1001 010d dddd 0111 |
SBC | Rd, Rr | Rd←Rd – Rr – C | Subtract two registers with carry | --HSVNZC | 1 | 0000 10rd dddd rrrr |
SBCI | Rd, K | Rd←Rd – K – C | Subtract immediate with carry, 16 ≤ d ≤ 31 | --HSVNZC | 1 | 0100 KKKK dddd KKKK |
SBI | P, b | IOP ←1 | Set bit in I/O register, 0<=P<=31 | -------- | 2 | 1001 1010 PPPP Pbbb |
SBIC | P, b | if(IOP = 0) PC←PC + 2 (or 3) | Skip if bit in I/O register is cleared, 0<=P<=31 | -------- | 1,2, 3† | 1001 1001 PPPP Pbbb |
SBIS | P, b | if(IOP = 1) PC←PC + 2 (or 3) | Skip if bit in I/O register is set, 0<=P<=31 | -------- | 1,2, 3† | 1001 1011 PPPP Pbbb |
SBIW | Rh:Rl, K | Rh:Rl←Rh:Rl–K | Subtract immediate from word, 0 ≤ K ≤ 63 | ---SVNZC | 2 | 1001 0111 KKdd KKKK |
SBR | Rd, K | Rd←Rd or K | Set bit(s) in register, 16 ≤ d ≤ 31, same as ori | ---SVNZ-, V cleared | 1 | 0110 KKKK dddd KKKK |
SBRC | Rr, b | if(Rr(b) = 0) PC←PC + 2 (or 3) | Skip if bit in register is cleared | -------- | 1,2, 3† | 1111 110r rrrr 0bbb |
SBRS | Rr, b | if(Rr(b) = 1) PC←PC + 2 (or 3) | Skip if bit in register is set | -------- | 1,2, 3† | 1111 111r rrrr 0bbb |
SEC | C←1 | Set carry flag, Same as bset 0 | -------C | 1 | 1001 0100 0000 1000 | |
SEH | H←1 | Set half-carry flag, Same as bset 5 | --H----- | 1 | 1001 0100 0101 1000 | |
SEI | I←1 | Set global interrupt flag (enable interrupts). Instruction following sei will always be executed before any pending interrupts are handled. Same as bset 7 | I------- | 1 | 1001 0100 0111 1000 | |
SEN | N←1 | Set negative flag, Same as bset 2 | -----N-- | 1 | 1001 0100 0010 1000 | |
SER | Rd | Rd←$FF | Set register, 16 ≤ d ≤ 31, Same as LDI Rd, $FF | -------- | 1 | 1110 1111 dddd 1111 |
SES | S←1 | Set signed flag, Same as bset 4 | ---S---- | 1 | 1001 0100 0100 1000 | |
SET | T←1 | Set T flag, Same as bset 6 | -T------ | 1 | 1001 0100 0110 1000 | |
SEV | V←1 | Set overflow flag, Same as bset 3 | ----V--- | 1 | 1001 0100 0011 1000 | |
SEZ | Z←1 | Set zero flag, Same as bset 1 | ------Z- | 1 | 1001 0100 0001 1000 | |
SLEEP | Sleep. Sets CPU in sleep mode defined by the MCU control register | -------- | 1 | 1001 0101 1000 1000 | ||
SPM | PM[Z] ←R1:R0 | Store program memory – see instruction reference manual for details. | -------- | Varies | 1001 0101 1110 1000 | |
ST | W, Rr | M[W] ←Rr | Store Indirect (Y or Z cases) | -------- | 2 | 1000 001r rrrr W000 |
ST | X, Rr | M[X] ←Rr | Store Indirect (X case) | -------- | 2 | 1001 001r rrrr 1100 |
ST | W+, Rr | M[W] ←Rr; W←W+1 | Store Indirect with Postincrement (Y or Z) | -------- | 2 | 1001 001r rrrr W001 |
ST | X+, Rr | M[X] ←Rr; X←X+1 | Store Indirect with Postincrement (X) | -------- | 2 | 1001 001r rrrr 1101 |
ST | -W, Rr | W←W-1; M[W] ←Rr | Store Indirect with Pre-decrement (Y or Z) | -------- | 2 | 1001 001r rrrr W010 |
ST | -X, Rr | X←X-1; M[X] ←Rr | Store Indirect with Pre-decrement (X) | -------- | 2 | 1001 001r rrrr 1110 |
STD | W+q,Rr | M[W+q] ←Rr | Store Indirect with Displacement (Y or Z only) | -------- | 2 | 10q0 qq1r rrrr Wqqq |
STS | k, Rr | M[k] ←Rr | Store Direct To SRAM | -------- | 2 | 1001 001r rrrr 0000 kkkk kkkk kkkk kkkk |
SUB | Rd, Rr | Rd←Rd - Rr | Subtract two registers | --HSVNZC | 1 | 0001 10rd dddd rrrr |
SUBI | Rd, K | Rd←Rd – K | Subtract immediate, 16 ≤ d ≤ 31 | --HSVNZC | 1 | 0101 KKKK dddd KKKK |
SWAP | Rd | Rd(7…4) ←Rd(3…0); Rd(3…0) ←Rd(7…4) | Swap nibbles (i.e. high 4 bits is exchanged with low 4 bits) | -------- | 1 | 1001 010d dddd 0010 |
TST | Rd | Rd←Rd • Rd | Test for zero or minus, same as And Rd, Rd | ---SVNZ-, V cleared | 1 | 0010 00Dd dddd DDDD (DDDDD=ddddd) |
WDR | Watchdog reset | -------- | 1 | 1001 0101 1010 1000 |