Atmel AVR 명령 세트
Atmel AVR instruction setAtmel AVR 명령어세트는 1996년에 Atmel에 의해 개발된 하버드 아키텍처의 8비트 RISC 싱글칩 마이크로컨트롤러인 Atmel AVR의 기계어입니다.AVR은 프로그램 스토리지에 온칩 플래시 메모리를 사용한 최초의 마이크로 컨트롤러 제품군 중 하나입니다.
프로세서 레지스터
범용 8비트 레지스터 R0~R31은 32개입니다.모든 산술 및 논리 연산은 이러한 레지스터에서 작동하며, 로드 및 저장 명령만 RAM에 액세스합니다.
16비트 레지스터 쌍에서는 제한된 수의 명령이 작동합니다.쌍의 하위 번호 레지스터는 최하위 비트를 보유하며 짝수 번호여야 합니다.마지막 3개의 레지스터 쌍은 메모리 어드레싱을 위한 포인터 레지스터로 사용됩니다.X(R27:R26), Y(R29:R28) 및 Z(R31:R30)로 알려져 있습니다.포스트 인크리먼트 및 프리 인크리먼트어드레싱 모드는 3가지 모두에서 지원됩니다.Y 및 Z는 6비트 양의 변위도 지원합니다.
즉시 값을 허용하는 명령은 레지스터 R16~R31(8비트 연산) 또는 페어 R25:R24~R31:R30(16비트 연산 ADIW 및 SBIW)으로 제한됩니다.MUL 연산의 일부 변형은 R16에서 R23까지 8개의 레지스터로 제한됩니다.
특수 용도 레지스터
CPU에는, 다음의 32개의 범용 레지스터에 가세해 몇개의 특수 목적 레지스터는 다음과 같습니다.
- PC: 16비트 또는 22비트 프로그램 카운터
- SP: 8비트 또는 16비트 스택 포인터
- SREG: 8비트 상태 레지스터
- RAMPX, RAMPY, RAMPD 및 EIND: 24비트 주소를 형성하기 위해 16비트 주소 앞에 추가되는 8비트 세그먼트 레지스터.주소 공간이 큰 부분에서만 사용할 수 있습니다.
상태 비트
상태 레지스터 비트는 다음과 같습니다.
- C Carry 플래그이것은 뺄셈에 대한 차용 플래그입니다.그
INC그리고.DEC명령은 반송 플래그를 수정하지 않으므로 멀티바이트 산술 [1]연산을 루프하는 데 사용할 수 있습니다. - Z Zero 플래그산술 결과가 0인 경우 1로 설정합니다.
- N 네거티브플래그산술 결과의 최상위 비트의 복사본으로 설정합니다.
- V 오버플로 플래그입니다.2의 보완 오버플로우 시 설정됩니다.
- S사인 플래그이것은 AVR에 고유한 것으로, 항상 N'V이며, 진정한 비교 신호를 나타냅니다.
- H 하프캐리 플래그이것은 덧셈에서 가져온 내부 자리올림수이며 BCD 산술 지원을 위해 사용됩니다.
- T비트 복사특수 비트 로드 및 비트 저장 명령에서는 이 비트를 사용합니다.
- I Interrupt 플래그.인터럽트가 유효하게 되어 있는 경우에 설정합니다.
주소 지정
다음의 주소 공간을 사용할 수 있습니다.
- 범용 레지스터는 번호(0~31)로 처리되지만, 풀 5비트 번호는 이들 레지스터의 서브셋에서만 동작할 수 있는 명령어에는 저장되지 않습니다.
- I/O 레지스터에는 전용 6비트 주소 공간이 있으며, 그 아래쪽 절반은 비트 주소 지정이 가능합니다. 일부 부품에는 이 주소 공간 외부에 I/O 레지스터가 있습니다. I/O 레지스터는 "확장 I/O"라고 불리며 데이터 주소 공간 내에서 메모리 매핑 I/O로만 액세스할 수 있습니다.
- 데이터 주소 공간은 32개의 범용 레지스터, 모든 I/O 레지스터(I/O 주소 공간을 통해 액세스 가능한 레지스터 포함) 및 RAM을 매핑합니다. 필요에 따라 각각 RAMPX, RAMPY 및 RAMPZ에 의해 추가되는 X, Y 및 Z 포인터 레지스터를 통해 직접 또는 간접적으로 주소를 지정할 수 있습니다.
- 프로그램 메모리(플래시)에는 별도의 주소 공간이 있으며 명령을 가져오기 위해 16비트 단어로 주소 지정됩니다.
- 상수 데이터를 가져오기 위해 프로그램 메모리는 Z 포인터 레지스터를 통해 바이트 단위로 주소 지정되며, 필요하면 RAMPZ에 의해 추가됩니다.
- EEPROM은 메모리에 매핑되어 있는 디바이스도 있고 직접 주소를 지정할 수 없는 디바이스도 있습니다.대신 주소, 데이터 및 제어 I/O 레지스터를 통해 액세스 할 수 있습니다.
- 범용 레지스터, 상태 레지스터 및 일부 I/O 레지스터는 비트 주소 지정이 가능하며 비트 0은 최하위, 비트 7은 최하위입니다.
처음 64개의 I/O 레지스터는 I/O 및 데이터 주소 공간을 통해 액세스할 수 있습니다.그 때문에, 2개의 주소가 다릅니다.이들은 보통 "로 표기됩니다.0x00 (0x20)" ~ "0x3F (0x5F)" 입니다.첫 번째 항목은 I/O 주소이고 두 번째 항목은 괄호 안의 데이터 주소입니다.
PC를 제외한 특수 목적의 CPU 레지스터는 I/O 레지스터로 액세스할 수 있습니다.일부 레지스터(RAMPX, RAMPY)는 주소 지정 가능한 메모리가 64KiB 미만인 머신에 존재하지 않을 수 있습니다.
| 등록하세요 | I/O 주소 | 데이터 주소 |
|---|---|---|
| SREG | 0x3F | 0x5F |
| SP | 0x3E: 0x3D | 0x5E: 0x5D |
| EIND | 0x3C | 0x5C |
| 램프 | 0x3B | 0x5B |
| 램프 | 0x3A | 0x5A |
| 램프 | 0x39 | 0x59 |
| 램프 | 0x38 | 0x58 |
일반적인 AT메가 메모리 맵은 다음과 같습니다.
| 데이터 주소 | I/O 주소 | 내용물 |
|---|---|---|
| 0x0000 – 0x001에프 | 레지스터 R0 – R31 | |
| 0x0020 – 0x003에프 | 0x00 ~ 0x1F | I/O 레지스터(비트 주소 지정 가능) |
| 0x0040 – 0x005에프 | 0x20 ~ 0x3F | I/O 레지스터(비트 주소 지정 불가) |
| 0x0060 – 0x00FF | 확장 I/O 레지스터(메모리 매핑 I/O만 해당) | |
| 0x0100 – RAMEND | 내장 SRAM |
여기서 RAMEND는 마지막 RAM 주소입니다.확장 I/O가 부족한 부품에서는 RAM은 0x0060부터 시작됩니다.
지시 타이밍
산술 연산은 레지스터 R0~R31에서 동작하지만 RAM에서는 직접 동작하지 않으며 곱셈 및 워드 폭 덧셈(ADIW 및 SB)을 제외하고 클럭 사이클을 1회 실시합니다.IW)는 2 사이클이 소요됩니다.
RAM 및 I/O 공간은 레지스터에 복사하거나 레지스터에서 복사하는 것만으로 액세스할 수 있습니다.레지스터 X, Y 및 Z를 통해 간접 액세스(옵션의 증가 후, 사전 설정 또는 고정 변위 포함)가 가능합니다.RAM 에의 모든 액세스에는, 2 개의 클럭 사이클이 걸립니다.레지스터와 I/O 사이를 이동하는 것은 한 사이클입니다.레지스터 간에 8비트 또는 16비트 데이터를 이동하거나 레지스터를 위해 상수 이동하는 것도 하나의 주기입니다.LPM(Reading Program Memory)은 3 사이클이 소요됩니다.
명령 리스트
명령어는 16비트 길이의 1개의 워드로, 16비트 또는 22비트 주소를 포함한 2개의 워드가 필요합니다.
조건부 브랜치에는 주소로의 점프와 건너뛰기의 두 가지 유형이 있습니다.조건부 브랜치(BRxx)는 ALU 플래그를 테스트하여 지정된 주소로 점프할 수 있습니다.Skips(SBxx)는 레지스터 또는 I/O에서 임의 비트를 테스트하고 테스트가 참일 경우 다음 명령을 건너뜁니다.
다음 내용:
- Rd 및 Rr은 R0 ~ R31 범위의 레지스터입니다.
- Rdh 및 Rrh는 R16 ~ R31(하이 하프) 범위의 레지스터입니다.
- Rdq 및 Rrq는 R16 ~ R23 범위의 레지스터입니다(레지스터 파일의 1/4).
- Rp는 레지스터 페어 R25:R24, R27:R26(X), R29:R28(Y) 또는 R31:R30(Z)입니다.
- XYZ는 포인터 레지스터로 X, Y 또는 Z 중 하나입니다.
- YZ는 Y 또는 Z 중 하나의 포인터 레지스터입니다.
- s는 상태 레지스터의 비트 번호입니다(0 = C, 1 = Z 등, 위 목록 참조).
- b는 범용 또는 I/O 레지스터의 비트 번호입니다(0 = 최하위, 7 = 최상위).
- K6는 6비트의 즉시 부호 없는 상수입니다(범위는 0 ~63)
- K8은 8비트의 즉시 상수입니다.K8은 8비트 동작에서만 사용되므로 서명성은 무관합니다.
- IO5는 I/O 주소 공간의 비트 주소 지정 가능 부분을 포함하는 5비트 I/O 주소입니다(예: 0 ~31)
- IO6은 I/O 주소 공간 전체를 커버하는 6비트 I/O 주소입니다(범위: 0 ~63)
- D16은 64KiB를 커버하는 16비트 데이터 주소입니다.데이터 공간이 64KiB 이상인 부분에서는 RAMPD 세그먼트 레지스터의 내용이 추가됩니다.
- P22는 2개의 16비트 워드(8MiB)를 포함하는22 22비트 프로그램 주소입니다.
- S7과 S12는 프로그램 카운터에 저장된 프로그램 주소에 대해 워드 단위로 7비트(응답 12비트) 부호 변위입니다.
| 산술 | 비트 및 기타 | 갈아타다 | 점프 | 분점 | 불러 |
|---|---|---|---|---|---|
더하다 Rd, Rr ADC Rd, Rr ADIW Rp+1:Rp, K6 후보선수 Rd, Rr 서브이 Rdh, K8 SBC Rd, Rr SBCI Rdh, K8 SBIW Rp+1:Rp, K6 주식회사 Rd DEC Rd 그리고. Rd, Rr 그리고 나는. Rdh, K8 또는 Rd, Rr 오리 Rdh, K8 COM Rd 하지 않다 Rd CP Rd, Rr CPC Rd, Rr CPI Rdh, K8 바꾸다 Rd LSR Rd ROR Rd ASR Rd 멀티 Rd, Rr 멀티 Rdh, Rrh 멀티 Rdq, Rrq FMUL Rdq, Rrq 에뮬스 Rdq, Rrq FMULSU Rdq, Rrq | BSET s BCLR s SBI IO5, b CBI IO5, b BST Rd, b 블록 Rd, b NOP 브레이크. 수면. WDR | 무브 Rd, Rr 무브 Rd+1:Rd, Rr+1:Rr 입력 Rd, IO6 나가. IO6, Rr 밀어넣다 Rr 팝 Rr LDI Rdh, K8 LDS Rd, D16 LD Rd, X LDD Rd, YZ+K6 LD Rd, -XYZ LD Rd, XYZ+ STS D16, Rr 세인트 X, Rr 표준 YZ+K6, Rr 세인트 -XYZ, Rr 세인트 XYZ+, Rr LPM LPM Rd, Z LPM Rd, Z+ ELPM ELPM Rd, Z ELPM Rd, Z+ SPM | RJMP S12 IJMP EIJMP JMP P22 | CPSE Rd, Rr SBRC Rr, b SBRS Rr, b 작은 IO5, b 스바시 IO5, b BRBC s, S7 BRBS s, S7 | 호출 S12 ICALL EICALL 불러 P22 리트 재시도 |
명령 집합 상속
모든 명령이 모든 Atmel AVR 컨트롤러에 구현되는 것은 아닙니다.이는 곱셈, 확장 부하/점프/콜, 멀리뛰기 및 전원 제어를 수행하는 명령의 경우입니다.
옵션의 순서는, 다음의 3개의 카테고리로 분류할 수 있습니다.
- 코어 CPU(컴퓨팅) 기능, 보다 고성능 CPU 코어에 추가
- 메모리 어드레싱 기능(메모리 어드레싱 기능이 필요할 정도로 큰 메모리를 탑재한 모든 모델에 추가)
- 옵션 기능, 특정 모델에는 탑재되어 있지 않을 수도 있는 몇 가지 주변기기.
하이엔드 프로세서는 더 많은 코어와 더 많은 메모리를 탑재하는 경향이 있지만, 한쪽이 존재한다고 해서 다른 한쪽이 존재한다고 보증되는 것은 아닙니다.
핵심 CPU 명령
최초의 「클래식」코어를 시작으로, 다음과 같은 레벨로 확장 기능이 구성되어 있습니다.각 레벨에는 앞서 말한 모든 것이 포함됩니다.
- "Classic" 코어는 0 연산자 형식만 가지고 있습니다.
LPM명령, 즉LPM r0,Z. - "클래식 플러스"는
MOVW레지스터 쌍을 이동하기 위한 명령 및 보다 일반적인 형태의 LPM 명령(LPM Rd,Z그리고.LPM Rd,Z+임의의 행선지 레지스터와 Z 포인터의 자동 증분을 가능하게 합니다. - "확장" 코어는 다중 명령을 추가합니다.
- XMEGA 코어는 새로운 명령어를 추가하지 않지만 다음과 같은 중요한 변경을 가합니다.
- 메모리 맵이 재구성되어 프로세서 레지스터 파일의 메모리 매핑이 없어지고(따라서 I/O 포트는 RAM 주소 0에서 시작), I/O 포트 범위가 확장됩니다.첫 번째 4K는 특수 기능 레지스터, 두 번째 4K는 데이터 플래시, 일반 RAM은 8K부터 시작합니다.
- 스택 포인터 레지스터(SPL 및 SPH)를 조정하기 전에 인터럽트를 명시적으로 비활성화할 필요는 없습니다.SPL에 쓸 경우 SPH를 업데이트할 시간을 주기 위해 4 클럭 사이클 동안 인터럽트가 자동으로 비활성화됩니다.
- 다른 멀티바이트 레지스터는 아토믹 읽기 및 쓰기를 가능하게 하는 섀도 레지스터와 함께 제공됩니다.최하위 바이트를 읽으면 상위 바이트가 섀도 레지스터에 복사되므로 나중에 읽으면 처음 읽을 때 레지스터의 스냅샷이 생성됩니다.하위 바이트에 대한 쓰기는 상위 바이트가 기록될 때까지 버퍼링되며, 이 바이트에 대해 멀티 바이트 레지스터 전체가 원자적으로 업데이트됩니다.
- 이후의 XMEGA 코어(특히 ATxmega16A4U와 같은 B, C 및 AU 모델, ATxmega16D4와 같은 이전 A, D 및E 모델은 제외)에는 4개의 읽기-수정-쓰기 명령이 추가됩니다(교환).
XCH로드 앤 세트, 로드 앤 클리어, 로드 앤 클리어, 로드 앤 슬립이 있습니다.이것들은, 특히 USB 컨트롤러와 같은 다이렉트 메모리 액세스 주변기기와 연동하는 데 도움이 됩니다.
「클래식」CPU 코어보다 성능이 낮은 것은, 「AVR1」코어와 「AVR 타이니」의 2개의 서브 세트입니다.「ATTiny」브랜드 프로세서는, AVR1(ATTiny11, ATTiny28), 클래식(ATTiny22, ATTiny26), 클래식+(ATTiny24), 및 AVRtiny(ATTiny20, ATTiny40)를 포함한 다양한 코어를 탑재하고 있습니다.
AVR1 서브셋은 인기가 없었고 2000년 이후 새로운 모델이 출시되지 않았습니다.주소 0~31에 매핑된 32개의 레지스터와 주소 32~95에 매핑된 I/O 포트를 제외한 모든 RAM은 제외됩니다.스택은 3레벨 하드웨어 스택으로 대체되며PUSH그리고.POP명령이 삭제됩니다.16비트 조작이 모두 삭제됩니다.IJMP,ICALL및 모든 로드 및 저장 주소 지정 모드(Z를 통한 간접 제외)
AVR 명령어세트의 서브셋에 대한 두 번째 성공적 시도는 "AVR tiny" 코어입니다.
가장 큰 변화는 AVRtiny 코어가 레지스터 R0~R15를 생략한다는 것입니다.레지스터도 메모리 매핑되지 않고 0 ~63의 I/O 포트와 주소 64에서 시작하는 범용 RAM이 있습니다.16비트 연산(ADIW,SBIW)는 생략되며, 치환 어드레싱 모드를 사용하는 로드/스토어도 생략됩니다(Y+d,Z+d단, 사전 설정 및 증가 후의 어드레싱 모드는 유지됩니다.그LPM명령은 생략됩니다. 대신 프로그램 ROM은 데이터 주소 공간에 매핑되며 일반 로드 명령을 사용하여 액세스할 수 있습니다.
마지막으로 AVRtiny 코어는 2개의 단어를 삭제합니다.LDS그리고.STS직접 RAM 주소 지정을 위한 지침 대신 로드/스토어에 이전에 할당된 opcode 공간을 새 1-word에 대한 변위 지침과 함께 사용합니다.LDS그리고.STS어드레스 0x40 ~0xBF 의 범용 RAM 의 최초의 128 위치에 액세스 할 수 있는 명령입니다.(the.IN그리고.OUT명령은 0 ~ 0x3F의 I/O 공간에 직접 액세스할 수 있도록 합니다.)
메모리 주소 지정 지침
최소 코어에는 256바이트 이상의 데이터 주소 공간(I/O 포트 및 기타 예약된 주소가 삭제된 후 128바이트 이상의 RAM)과 8192바이트(8KiB) 이하의 프로그램 ROM이 있습니다.SPL에는 8비트스택 포인터만 있으며 12비트의 상대적인 점프/콜 명령만 지원합니다.RJMP/RCALL(AVR 프로그램카운터는 바이트가 아닌 16비트 워드를 카운트하기 때문에 12비트오프셋은 2바이트의 ROM에 대응하기에13 충분합니다).
사용 가능한 리소스에 액세스하기 위해 필요에 따라 추가 메모리 주소 지정 기능이 있습니다.
- 256바이트 이상의 데이터 주소 공간(RAM 256바이트 이상)을 가진 모델에는 16비트스택 포인터가 있으며 SPH 레지스터에는 상위 절반이 포함되어 있습니다.
- 8KiB 이상의 ROM을 탑재한 모델에서는 2워드(22비트) 추가
JUMP그리고.CALL(일부 초기 모델에서는 건너뛰기 명령 뒤에 2단어 명령이 이어지는 경우 에라타(erratum)가 발생합니다.) - 64KiB 이상의 ROM을 탑재한 모델에서는
ELPM명령 및 해당 RAMPZ 레지스터.LPM지시: Z 단위의 ROM 주소를 제로 확장합니다.ELPM순서에서는, 높은 비트의 RAMPZ 레지스터를 부가합니다.이것은 일반적인 것과는 다릅니다.LPM명령; 0 연산자 형식만을 가진 "정확한" 모델이 존재합니다.ELPM(ATMega103 및 at43usb320).자동 증가를 사용할 수 있는 경우(대부분 모델), RAMPZ를 포함한 24비트 주소 전체를 업데이트합니다. - (희귀) ROM이 128KiB를 넘는 모델에는 3바이트의 프로그램카운터가 있어요서브루틴 콜 및 리턴은 스택스페이스의 추가 바이트를 사용합니다.간접적인 점프 및 콜에 추가 하이비트를 제공하기 위한 새로운 EIND 레지스터와 새로운 확장 명령도 있습니다.
EIJMP그리고.EICALLEIND:Z 를 행선지 주소로 사용합니다.(전편)IJMP그리고.ICALL명령에서는 제로 확장 Z를 사용합니다.) - (희귀한) RAM 주소 공간이 64KiB 이상인 모델은 RAMPX, RAMPY, RAMPZ 및 RAMPD 레지스터를 사용하여 16비트 RAM 주소 제한을 확장합니다.각각 X, Y 또는 Z 레지스터 쌍 또는 직접 어드레싱 명령을 사용하는 어드레싱 모드에 대한 추가 높은 비트를 제공합니다.
LDS/STSROM 액세스와는 달리, 명확한 「확장」지시는 없습니다.대신, 램프 레지스터는 무조건 사용됩니다.
옵션 기능 설명
3가지 지침은 대응하는 하드웨어 설비가 있는 모델에만 있습니다.
SPM플래시 ROM에 저장하기 위해 플래시 ROM을 탑재한 프로세서(대부분)에만 존재합니다.BREAK온칩 디버거를 호출하기 위해 온칩 디버거가 지원되지 않는 일부 소형 모델에서는 생략됩니다.DESDES 액셀러레이터를 지원하는 XMEGA 모델에 탑재된 Data Encryption Standard 라운드 실행용
AVR1 이외의 아키텍처는 avr-libc [2]규칙에 따라 명명됩니다.
| 가족 | 회원들 | 산술 | 나뭇가지 | 전송 | 비트 와이즈 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 최소 AVR1 코어 |
|
|
|
|
| ||||||||||||
| Classic Core 최대 8,000 프로그램 공간 ('AVR2') |
| 새로운 순서:
| 새로운 순서:
| 새로운 순서:
| (새로운 것은 없습니다) | ||||||||||||
| AVR2, MOVW 및 LPM 명령어('AVR2.5') |
| (새로운 것은 없습니다) | (새로운 것은 없습니다) | 새로운 순서:
| (새로운 것은 없습니다) | ||||||||||||
| Classic Core (최대 128K) ('AVR3') |
| (새로운 것은 없습니다) | 새로운 순서:
| 새로운 순서:
| (새로운 것은 없습니다) | ||||||||||||
| 최대 8K의 확장 코어 ('AVR4') |
| 새로운 순서:
| (새로운 것은 없습니다) | 새로운 순서:
| (새로운 것은 없습니다) | ||||||||||||
| 최대 128K의 Enhanced Core ('AVR5', 'AVR5.1') |
| (새로운 것은 없습니다) | 새로운 명령:
| (새로운 것은 없습니다) | 새로운 순서:
| ||||||||||||
| 최대 4M의 확장 코어 ('AVR5' 및 'AVR6') |
| (새로운 것은 없습니다) | 새로운 순서:
| (새로운 것은 없습니다) | (새로운 것은 없습니다) | ||||||||||||
| XMEGA 코어('avrxmega' 2-6) | ATx메가 시리즈 | 새로운 순서:
| (새로운 것은 없습니다) | 새 지침(제2 리비전 실리콘 - AU, B, C 부품)
| (새로운 것은 없습니다) | ||||||||||||
| 축소 AVRtiny 코어('avrtiny10') |
| (CPU 레지스터 세트의 감소를 제외하고 최소 코어와 동일)a ) 。 | (CPU 레지스터a 세트의 감소를 제외하고 최대 8K의 기존 코어와 동일) | 최대 8K의 Classic Core와 동일하지만 다음과 같은 예외가 있습니다.
| (CPU 레지스터a 세트의 감소를 제외하고 최대 128K의 확장 코어와 동일) |
a 축소 레지스터 세트는 R16~R31로 [1]제한된다.
명령 부호화
비트 할당:
- rrr = 소스 레지스터
- rrr = 소스 레지스터(R16–R31)
- rr = 소스 레지스터(R16–R23)
- RRR = 소스 레지스터 쌍(R1:R0–R31:R30)
- dddd = 수신처 레지스터
- ddd = 수신처 레지스터 (R16–R31)
- ddd = 수신처 레지스터 (R16–R23)
- DDDD = 수신처 레지스터 쌍(R1:R0–R31:R30)
- pp = W, X, Y 또는 Z 쌍 등록
- y = Y/Z 레지스터 쌍 비트(0=Z, 1=Y)
- u = 0=서명 또는 1=서명된 FMUL(S(U)) 서명
- s = 저장/로드 비트(0=로드, 1=저장)
- c = 콜/점프(0=점프, 1=콜)
- cy=캐리 포함(0=캐리 없음, 1=캐리 포함)
- e = EIND를 사용하여 간접 점프/콜 주소 확장(0=0:Z, 1=EIND:Z)
- = RAMPZ를 사용하여 프로그램 메모리 주소 확장(0=0:Z, 1=RAMPZ:Z)
- aaaaa = I/O 공간 주소
- aaaa = I/O 공간 주소(처음 32에만 해당)
- bbb = 비트 번호(0 ~7)
- B = 비트 값(0 또는 1)
- kkkk = 4비트 부호 없는 상수(DES opcode)
- kkkkk = 6비트 부호 없는 상수
- KKKKK = 8비트 상수
Atmel AVR은 명령어 내에서 비트가 연속되지 않는 다수의 분할 필드를 사용합니다.오프셋 명령이 있는 로드/스토어는 6비트 오프셋이 세 조각으로 분할된 가장 극단적인 예입니다.
| 1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 설명 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D D D D | R R R R | MOVW Rd,Rr 레지스터 쌍 이동 | ||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | d d d d d | r r r r r | MULS Rd,Rr | ||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | Ddd. | 0 | r r r | MULSU Rd,Rr | ||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | Ddd. | 1 | r r r | FMUL Rd,Rr | ||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | Ddd. | u | r r r | FMULS(U) Rd,Rr | ||||
| 0 | 0 | 동작 코드 | r | Ddddd. | r r r r r | 2-operand 명령 | ||||||||||
| 0 | 0 | 0 | ccy | 0 | 1 | r | Ddddd. | r r r r r | CPC/CP Rd,Rr | |||||||
| 0 | 0 | 0 | ccy | 1 | 0 | r | Ddddd. | r r r r r | SBC/SUB Rd,Rr | |||||||
| 0 | 0 | 0 | 사이 | 1 | 1 | r | Ddddd. | r r r r r | ADD/ADC Rd,Rr(LSL/ROL Rd(Rd=Rr일 경우)) | |||||||
| 0 | 0 | 0 | 1 | 0 | 0 | r | Ddddd. | r r r r r | CPSE Rd,Rr | |||||||
| 0 | 0 | 1 | 0 | 0 | 0 | r | Ddddd. | r r r r r | AND Rd,Rr | |||||||
| 0 | 0 | 1 | 0 | 0 | 1 | r | Ddddd. | r r r r r | EOR Rd,Rr | |||||||
| 0 | 0 | 1 | 0 | 1 | 0 | r | Ddddd. | r r r r r | OR Rd,Rr | |||||||
| 0 | 0 | 1 | 0 | 1 | 1 | r | Ddddd. | r r r r r | MOV Rd,Rr | |||||||
| 0 | 0 | 1 | 1 | 케이케이케이 | d d d d d | 케이케이케이 | CPI Rd,K | |||||||||
| 0 | 1 | 동작 | 케이케이케이 | d d d d d | 케이케이케이 | 즉시 작업 등록 | ||||||||||
| 0 | 1 | 0 | ccy | 케이케이케이 | d d d d d | 케이케이케이 | SBCI/SUBI Rd, K | |||||||||
| 0 | 1 | 1 | 0 | 케이케이케이 | d d d d d | 케이케이케이 | 오리 Rd, K SBR Rd, K | |||||||||
| 0 | 1 | 1 | 1 | 케이케이케이 | d d d d d | 케이케이케이 | ANDI Rd, K CBR Rd, K | |||||||||
| 1 | 0 | k | 0 | ㅋㅋ | s | Ddddd. | y | ㅋㅋㅋ | LDD/STD Rd ~Z+k 또는 Y+k | |||||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | 동작 코드 | 로드/스토어 조작 | |||||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | 0 | 0 | 0 | 0 | LDS rd,i/STS i,rd | ||||
| 16비트 즉시 SRAM 주소 i | ||||||||||||||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | y | 0 | 0 | 1 | LD/ST Rd ~Z+/Y+ | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | y | 0 | 1 | 0 | LD/ST Rd ~ -Z/-Y | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | Ddddd. | 0 | 1 | q | 0 | LPM/ELPM Rd, Z | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | Ddddd. | 0 | 1 | q | 1 | LPM/ELPM Rd, Z+ | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | Ddddd. | 0 | 1 | 0 | 0 | XCH Z, Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | Ddddd. | 0 | 1 | 0 | 1 | LAS Z, Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | Ddddd. | 0 | 1 | 1 | 0 | LAC Z, Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | Ddddd. | 0 | 1 | 1 | 1 | LAT Z, Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | 1 | 1 | 0 | 0 | LD/ST Rd ~ X | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | 1 | 1 | 0 | 1 | LD/ST Rd ~ X+ | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | 1 | 1 | 1 | 0 | LD/ST Rd ~ -X | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | Ddddd. | 1 | 1 | 1 | 1 | POP/PUSH Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 동작 코드 | 원 오퍼랜드 명령: | ||||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 0 | 0 | 0 | COM Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 0 | 0 | 1 | NEG Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 0 | 1 | 0 | SWAP Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 0 | 1 | 1 | INC Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 1 | 0 | 0 | (표준) | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 1 | 0 | 1 | ASR Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 1 | 1 | 0 | LSR Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 0 | 1 | 1 | 1 | ROR Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | B★ | b b b b | 1 | 0 | 0 | 0 | SEx/CLX 상태 레지스터 클리어/설정 비트 | ||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 동작 코드 | 1 | 0 | 0 | 0 | 제로 오퍼랜드 명령 | |||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 리트 |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 재시도 |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | x | 1 | 0 | 0 | 0 | (표준) |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | x | x | 1 | 0 | 0 | 0 | (표준) |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 수면. |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 브레이크. |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | WDR |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | (표준) |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | q | 1 | 0 | 0 | 0 | LPM/ELPM |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | SPM |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | SPM Z+ |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | c | 0 | 0 | 0 | e | 1 | 0 | 0 | 1 | Z 또는 EIND:Z에 대한 간접 점프/콜 |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | Ddddd. | 1 | 0 | 1 | 0 | DEC Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | kkkkk | 1 | 0 | 1 | 1 | DES 라운드 k | |||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | kkkkkk | 1 | 1 | c | k | JMP/CALL abs22 | ||||
| k k k k k k k k k k k k k k | ||||||||||||||||
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | ㅋㅋ | ppp | kkkkk | ADIW Rp,uimm6 | |||||
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | ㅋㅋ | ppp | kkkkk | SBIW Rp,uimm6 | |||||
| 1 | 0 | 0 | 1 | 1 | 0 | B | 0 | 아 | b b b b | CBI/SBI a, b(I/O비트 클리어/설정) | ||||||
| 1 | 0 | 0 | 1 | 1 | 0 | B | 1 | 아 | b b b b | SBIC/SBIS a, b(I/O비트 테스트) | ||||||
| 1 | 0 | 0 | 1 | 1 | 1 | r | Ddddd. | r r r r r | MUL, 부호 없음: R1:R0 = Rr × Rd | |||||||
| 1 | 0 | 1 | 1 | s | a. | Ddddd. | 아아아. | 입출력에서 I/O 공간으로 | ||||||||
| 1 | 1 | 0 | c | 12비트 부호 오프셋 | PC로의 RJMP/RCALL + simm12 | |||||||||||
| 1 | 1 | 1 | 0 | 케이케이케이 | d d d d d | 케이케이케이 | LDI Rd, K | |||||||||
| 1 | 1 | 1 | 1 | 0 | B★ | 7비트 서명 오프셋 | b b b b | 상태 레지스터 비트의 조건부 분기 | ||||||||
| 1 | 1 | 1 | 1 | 1 | 0 | s | Ddddd. | 0 | b b b b | BLD/BST 레지스터 비트를 STATUS로 설정합니다.t | ||||||
| 1 | 1 | 1 | 1 | 1 | 1 | B | Ddddd. | 0 | b b b b | 레지스터 비트가 B와 동일한 경우 SBRC/SBRS 건너뛰기 | ||||||
| 1 | 1 | 1 | 1 | 1 | x | x | Ddddd. | 1 | b b b b | (표준) | ||||||
레퍼런스
- ^ a b "AVR Instruction Set Manual" (PDF). Atmel. November 2016. Atmel-0856L.
- ^ "Using the GNU tools". AVR Libc Manual. Retrieved 6 May 2018.
- ^ ATMel. 어플리케이션 노트 "AVR201: AVR 하드웨어 멀티플라이어 사용".2002.견적: "대규모 기업AVR은 AVR RISC Microcontroller 패밀리의 새로운 디바이스 시리즈로 하드웨어 멀티플라이어가 새롭게 강화되었습니다.
외부 링크
- GNU 개발 환경:
- Guido Socher에 의한 GCC를 사용한AVR 마이크로컨트롤러
- Rich Neswold의 AVR 마이크로컨트롤러용 GNU 개발 환경
- GCC-AVR의 AVR 옵션
- AVR 명령 세트 시뮬레이터 (GCC Intel Hex 파일용 ATmega32u4)
- AVR 명령 세트 상속(LLVM 노트), 이 페이지와 GCC 및 Binutils 코드를 기반으로 합니다.