STM8
STM8STM8은 STMicroelectronics의 8비트 마이크로컨트롤러 패밀리입니다.STM8 마이크로컨트롤러는 ST7 마이크로컨트롤러 아키텍처의 확장 버전을 사용합니다.STM8 마이크로컨트롤러는 풀기능을 갖춘8비트 [1]마이크로컨트롤러로서는 특히 저비용입니다.
아키텍처
STM8은 이전 ST7과 매우 유사하지만 16비트인덱스 레지스터와 스택포인터 상대 어드레싱 모드가 있기 때문에 C의 타깃으로 적합합니다.내부적으로는 Harvard 아키텍처이지만 통합 24비트 주소 공간을 갖추고 있어 코드를 RAM에서 실행하고(플래시 ROM의 시스템 내 프로그래밍에 유용), 데이터(룩업 테이블 등)를 ROM에서 액세스할 수 있습니다.64K 이상의 데이터에 대한 액세스는 특별한 "로드 원거리" 명령으로 제한됩니다.대부분의 업무용 메모리 오퍼랜드는 최대 128K(16비트 기본 주소와 16비트 오프셋)에 액세스 할 수 있습니다.
64K 이상의 데이터 메모리를 갖춘 STM8 마이크로 컨트롤러는 거의 없습니다.
ST7과 동일한 6개의 레지스터(A, X, Y, SP, PC, CC)를 가지고 있지만, 인덱스 레지스터 X, Y는 16비트로, 프로그램 카운터는 24비트로 확장되었습니다.어큐뮬레이터 A와 스택포인터는 [2]각각8비트와 16비트를 유지합니다.
상황 코드 레지스터에는 두 개의 정의된 비트가 더 있으며, 총 7개입니다.오버플로 플래그와 두 번째 인터럽트 활성화 비트가 있어 4개의 인터럽트 우선순위 레벨을 사용할 수 있습니다.
아과
- STM8AF 자동차
- STM8AL 자동차 저출력
- STM8L 저전력
- STM8S 저비용
- STM8T 터치센싱
- STLUX 조명 컨트롤
- STNRG 펄스 폭 변조 컨트롤러
컴파일러 지원
STM8은 무료 Small Device C 컴파일러, 무료 클로즈드 소스 Cosmic C [3]컴파일러 및 비프리 IAR C 및 Raisonance 컴파일러에서 지원됩니다.C 외에 Fourth 프로그래밍 언어의 오픈소스 포트인 STM8 eForth가 있습니다.
ST7과의 비교
STM8 명령 집합은 대부분 ST7의 슈퍼셋이지만 바이너리 호환성이 완전히 있는 것은 아닙니다.
X 및 Y 레지스터의 동작은 16비트로 확장됩니다.따라서 로드 및 저장소는 1바이트가 아닌 2바이트의 메모리에 액세스합니다.(또한 하프캐리 플래그는 비트3에서 4로의 반송이 아니라 16비트 결과의 비트7에서 비트8로의 반송을 반영하도록 변경되었습니다.)
인터럽트는 ST7에서와 같이 5바이트가 아닌 9바이트의 상태를 푸시합니다.
곱셈 명령은 16비트 제품을 X와 A로 나누는 대신 지정된 인덱스 레지스터(예: X)에 저장합니다.
메모리에서 8비트 주소를 가져오는 간접 주소 지정 모드(opcode)92 2x
,92 3x
,92 Bx
,92 6x
,92 Ex
,91 6x
,그리고.91 Ex
)가 삭제되었습니다.모든 간접 주소 지정 모드는 16비트주소를 가져옵니다.새로운 프리픽스바이트72
가 추가되어 16비트주소로 시작하는 간접 부호화에 사용되고 있습니다.
비트 조작 명령어는 16비트주소를 취득해, 그 주소를 요구하도록 변경되었습니다.72
프리픽스 바이트수정되지 않은 opcode0x
그리고.1x
대신 스택에서 사용되는 상대 주소 지정에 사용됩니다.
거의 사용되지 않는 브랜치명령어 중 일부에서는 opcode가 다음과 같이 변경되어 있습니다.90
접두사 및 수정되지 않은 opcode가 V 플래그에 종속된 서명된 분기에 재할당됩니다.
X 레지스터를 대상으로 한 로드 및 비교 명령은 X 레지스터에 의해 인덱싱된 주소 지정 모드를 사용하는 ST7에서는 거의 쓸모가 없습니다.STM8에서는 이러한 조작이 X 레지스터에 의해 인덱스된 메모리 오퍼랜드를 지정하면 레지스터 오퍼랜드는 Y로 변경된다.를 사용하여90
프레픽스: 레지스터가 반전되어 인덱스 레지스터는 Y, 오퍼랜드 레지스터는 X가 됩니다.
퍼포먼스의 큰 차이는 STM8이 사이클마다 ROM에서32비트를 취득하는 것입니다.일반적인 명령어는 1사이클에 RAM 액세스마다 1사이클이 소요됩니다.반면 ST7은 사이클당 8비트를 가져오고 명령 바이트당 1사이클을 취합니다.
명령 집합
STM8 명령어는 옵션의 프리픽스바이트(7216
,9016
,9116
, 또는9216
opcode 바이트 및 소수의 오퍼랜드(최대 4바이트, 단, 드물게는2바이트를 넘습니다).프리픽스 바이트는 대부분 메모리 오퍼랜드를 지정하기 위해 사용되는 주소 지정 모드를 변경하지만 경우에 따라 프리픽스가 변경될 수 있습니다.72
그리고.90
완전히 다른 작업을 수행합니다.
프리픽스90
는 다음 순서로 X와 Y를 교환합니다.다음 표에서는 X 또는 Y 중 하나를 의미하는 "X/Y"를 한 줄로 조합합니다. 접두사90
는 BCPL 및 BCCM 명령과 일부 브랜치 조건의 두 곳에서 새로운 opcode를 도입하기 위해 사용됩니다.
프리픽스92
는 오프셋 피연산자(addr16,X)가 있는 명령을 간접 주소 지정([addr8],X)으로 변환합니다.오프셋은 메모리의 16비트 오프셋 값의 8비트 주소로 대체됩니다.이 기능에만 사용됩니다.
프리픽스91
에는, 상기의 양쪽 모두의 효과가 있어, (addr16,X) 어드레싱 모드를 ([addr8],
프리픽스72
훨씬 덜 규칙적인 패턴으로 많은 장소에서 사용됩니다.경우에 따라서는 새로운 어드레싱 모드(특히 ([addr16], X) 16비트간접 모드)를 도입하고 있습니다만, 완전히 새로운 조작도 다수 도입하고 있습니다.
프리픽스 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 오퍼랜드 | 니모닉 | 묘사 |
---|---|---|---|---|---|---|---|---|---|---|---|
— | 0 | 0 | 0 | 0 | 동작 코드 | 주소 8 | OP(주소 8,SP) | 원 오퍼랜드 명령(아래 참조) | |||
— | 0 | 0 | 0 | 1 | 동작 코드 | 주소 8 | OP A, (addr8),SP) | 스택 오퍼랜드를 사용한2개의 오퍼랜드 명령 | |||
— | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 주소 8 | SUB A, (주소 8),SP) | A : = A - 오퍼랜드 |
— | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 주소 8 | CP A,(addr8),SP) | A - 피연산자 비교 |
— | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 주소 8 | SBC A, (addr8),SP) | A : = A - 피연산자 - C를 차용하여 빼다 |
—/90 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 주소 8 | CPW X/Y, (주소 8,SP) | X/Y 비교 - 오퍼랜드(16비트) |
— | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 주소 8 | 그리고 A, (주소8)SP) | A : = A & 오퍼랜드, 비트 단위 및 |
— | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 주소 8 | BCP A,(addr8),SP) | 비트 테스트 A & 오퍼랜드 |
— | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 주소 8 | LDW Y, (주소 8),SP) | Y : = 오퍼랜드 ( |
— | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 주소 8 | LDW(주소 8,SP), Y | 오퍼랜드 : = Y( |
— | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 주소 8 | XOR A, (주소 8),SP) | A : = A ^ 오퍼랜드, 배타적 또는 |
— | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 주소 8 | ADC A, (주소 8),SP) | A : = A + 피연산자 + C, 캐리 추가 |
— | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 주소 8 | 또는 A, (주소8)SP) | A : = 오퍼랜드(포함) 또는 |
— | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 주소 8 | ADD, (addr8),SP) | A : = A + 오퍼랜드 |
— | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | imm16 | ADDW X, #imm16 | X : = X + immediate ( = |
— | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | imm16 | 서브W X, #imm16 | X : = X - immediate ( = |
— | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 주소 8 | LDW X,(주소 8),SP) | X : = 오퍼랜드 |
— | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 주소 8 | LDW(주소 8,SP), X | 오퍼랜드 : = X |
72/90 | 0 | 0 | 0 | c | 조금 | v | 오퍼랜드 | 비트 조작 | |||
72 | 0 | 0 | 0 | 0 | 조금 | 0 | 주소 16 soff8 | BTJT 주소 16, #bit, 라벨 | 소스 비트가 True인 경우 PC + soff8로 점프합니다(설정). | ||
72 | 0 | 0 | 0 | 0 | 조금 | 1 | 주소 16 soff8 | BTJF 주소 16, #bit, 라벨 | 소스 비트가 false인 경우 PC + soff8로 점프합니다(클리어). | ||
72 | 0 | 0 | 0 | 1 | 조금 | 0 | 주소 16 | BSET 주소 16, #bit | 지정된 비트를 1로 설정 | ||
72 | 0 | 0 | 0 | 1 | 조금 | 1 | 주소 16 | BREES 주소 16, #비트 | 지정된 비트를 0으로 재설정(지우기) | ||
90 | 0 | 0 | 0 | 1 | 조금 | 0 | 주소 16 | BCPL 주소 16,#비트 | 선택한 비트를 보완(토글) | ||
90 | 0 | 0 | 0 | 1 | 조금 | 1 | 주소 16 | BCCM 주소 16, #bit | 메모리 비트에 반송 플래그를 씁니다. | ||
—/90 | 0 | 0 | 1 | 0 | 조건. | 흐느껴 울다 | 조건부 브랜치(8비트 서명 오프셋) | ||||
— | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 흐느껴 울다 | JRA 라벨 | 브랜치 상시(참) |
— | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 흐느껴 울다 | JRF 라벨 | 브랜치 없음(false) |
— | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 흐느껴 울다 | JRUGT 라벨 | 부호 없는 경우 분기(C=0 및 Z=0)보다 큼 |
— | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 흐느껴 울다 | JRULE 라벨 | 부호 없는 경우 분기(C=1 또는 Z=1)보다 작거나 같을 경우 분기 |
— | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 흐느껴 울다 | JRNC 라벨 | 캐리 없는 경우 분기(C=0) |
— | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 흐느껴 울다 | JRC 라벨 | 분기(C=1) |
— | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 흐느껴 울다 | JRNE 라벨 | 동일하지 않은 경우 분기(Z=0) |
— | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 흐느껴 울다 | JREQ 라벨 | 분기(같으면) (Z=1) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 흐느껴 울다 | JRNV 라벨 | 오버플로가 아닌 경우 분기(V=0) |
90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 흐느껴 울다 | JRNH 라벨 | 하프 캐리가 아닌 경우 분기(H=0) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 흐느껴 울다 | JRV 라벨 | 오버플로우인 경우 분기(V=1) |
90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 흐느껴 울다 | JRH 라벨 | 하프캐리일 경우 분기(half-carry) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 흐느껴 울다 | JRPL 라벨 | 분기 if 플러스(N=0) |
— | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 흐느껴 울다 | JRMI 라벨 | 마이너스인 경우 분기(N=1) |
— | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 흐느껴 울다 | JRSGT 라벨 | 서명된 값이 (S=0 및 N=V)보다 큰 경우 분기 |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 흐느껴 울다 | JRNM 라벨 | 인터럽트 마스크가 아닌 경우 분기(I=0) |
— | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 흐느껴 울다 | JRSLE 라벨 | 하위 또는 동등하게 서명된 경우 분기(S=1 또는 NΩV) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 흐느껴 울다 | JRM 라벨 | 인터럽트가 마스크된 경우 분기(I=1) |
— | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 흐느껴 울다 | JRSGE 라벨 | 더 크거나 같은 경우 분기(N=V) |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 흐느껴 울다 | JRIL 라벨 | 인터럽트 회선이 낮은 경우 분기 |
— | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 흐느껴 울다 | JRSLT 라벨 | 서명 수가 (N)V) 미만인 경우 지점 |
90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 흐느껴 울다 | JRIH 라벨 | 인터럽트 회선이 높은 경우 분기 |
접두사 | 0 | 모드 | 동작 코드 | 오퍼랜드 | 원오퍼랜드 명령 | ||||||
— | 0 | 0 | 0 | 0 | 동작 코드 | 주소 8 | OP(주소 8,SP) | 스택 포인터 상대 | |||
— | 0 | 0 | 1 | 1 | 동작 코드 | 주소 8 | OP 주소 8 | 8비트 절대주소 | |||
72 | 0 | 0 | 1 | 1 | 동작 코드 | 주소 16 | OP [주소 16] | 16비트 간접 주소 | |||
92 | 0 | 0 | 1 | 1 | 동작 코드 | 주소 8 | OP [주소 8] | 16비트 주소의 8비트 간접 주소 | |||
— | 0 | 1 | 0 | 0 | 동작 코드 | — | 오퍼 A | 어큐뮬레이터 | |||
72/90 | 0 | 1 | 0 | 0 | 동작 코드 | 주소 16 | OP(주소 16, X/Y) | 16비트 오프셋으로 색인화 | |||
—/90 | 0 | 1 | 0 | 1 | 동작 코드 | — | OPW X/Y | X/Y 레지스터(16비트 동작) | |||
72 | 0 | 1 | 0 | 1 | 동작 코드 | 주소 16 | OP 주소 16 | 16비트 주소 | |||
—/90 | 0 | 1 | 1 | 0 | 동작 코드 | 주소 8 | OP(주소 8, X/Y) | 8비트 주소와 X/Y | |||
72 | 0 | 1 | 1 | 0 | 동작 코드 | 주소 16 | OP([addr16],X) | 16비트 간접 주소 + X | |||
92/91 | 0 | 1 | 1 | 0 | 동작 코드 | 주소 8 | OP([addr8], X/Y) | 8비트 간접 주소 + X/Y | |||
—/90 | 0 | 1 | 1 | 1 | 동작 코드 | — | OP(X/Y) | 오프셋 없이 인덱싱됨 | |||
접두사 | 0 | 모드 | 0 | 0 | 0 | 0 | 오퍼랜드 | NEG 오퍼랜드 | 2의 만족도가 부정이다. | ||
0 | 모드 | 0 | 0 | 0 | 1 | (교환 조작을 하도록 설계되어 있습니다.다음 항을 참조해 주세요. | |||||
0 | 모드 | 0 | 0 | 1 | 0 | (다른 조작으로 재배치.다음 항 참조) | |||||
접두사 | 0 | 모드 | 0 | 0 | 1 | 1 | 오퍼랜드 | CPL 오퍼랜드 | 자신의 보완물, 논리적이지 않음 | ||
접두사 | 0 | 모드 | 0 | 1 | 0 | 0 | 오퍼랜드 | SRL 오퍼랜드 | 오른쪽 이동 논리, msbit 클리어, 전송할 lsbit: (연산자:C) : = (0: 오퍼랜드) | ||
0 | 모드 | 0 | 1 | 0 | 1 | (다른 조작으로 재배치.다음 항 참조) | |||||
접두사 | 0 | 모드 | 0 | 1 | 1 | 0 | 오퍼랜드 | RRC 오퍼랜드 | 캐리(carry)를 통해 오른쪽으로 회전합니다(operand:C) : = (C: 오퍼랜드) | ||
접두사 | 0 | 모드 | 0 | 1 | 1 | 1 | 오퍼랜드 | SRA 오퍼랜드 | Shift right 연산, msbit 유지, lsbit 전송 | ||
접두사 | 0 | 모드 | 1 | 0 | 0 | 0 | 오퍼랜드 | SLL 오퍼랜드 | 왼쪽으로 이동, 전달할 msbit: (C:operand) : = (operand:0) | ||
접두사 | 0 | 모드 | 1 | 0 | 0 | 1 | 오퍼랜드 | RLC 오퍼랜드 | 반송을 통해 왼쪽으로 회전합니다. (C:operand) := (operand,C) | ||
접두사 | 0 | 모드 | 1 | 0 | 1 | 0 | 오퍼랜드 | DEC 오퍼랜드 | 감소, N 및 Z 설정, 영향을 받지 않음 | ||
0 | 모드 | 1 | 0 | 1 | 1 | (다른 조작으로 재배치.다음 항 참조) | |||||
접두사 | 0 | 모드 | 1 | 1 | 0 | 0 | 오퍼랜드 | INC 오퍼랜드 | 증가, N 및 Z 설정, 영향을 받지 않음 | ||
접두사 | 0 | 모드 | 1 | 1 | 0 | 1 | 오퍼랜드 | TNZ 오퍼랜드 | 0이 아닌 테스트: 피연산자 값을 기준으로 N과 Z를 설정합니다. | ||
접두사 | 0 | 모드 | 1 | 1 | 1 | 0 | 오퍼랜드 | SWAP 오퍼랜드 | 오퍼랜드의 하프 스왑(4비트 회전, SWAPW X 및 SWAPW Y의 경우 8비트) | ||
접두사 | 0 | 모드 | 1 | 1 | 1 | 1 | 오퍼랜드 | CLR 오퍼랜드 | 피연산자를 0으로 설정, N 삭제, Z 설정 | ||
접두사 | 0 | 모드 | 동작 코드 | 오퍼랜드 | 1 오퍼랜드 범위에서 opode [03-7][125B]를 재할당했습니다. | ||||||
—/90 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | RRWA X/Y | A를 통해 워드 바로 회전: X/Y와 A의 24비트 연결을 8비트 오른쪽으로 회전합니다. (X:A) : = (A:X) |
— | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 주소 16 | EXG A, 주소 16 | 메모리가 있는 Exchange A |
— | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | — | EXG A, XL | Exchange A와 X(하프 하프) |
— | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | — | EXGW X, Y | Exchange X와 Y(16비트) |
— | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | — | EXG A, YL | Exchange A와 Y(낮은 절반) |
— | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | — | (표준) | |
—/90 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | — | RLWA X/Y | A를 통과하는 단어 왼쪽으로 회전: X/Y와 A의 24비트 연결의 8비트 왼쪽으로 회전; (A:X) : = (X:A) |
— | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 주소 16 | POP 주소 16 | 스택에서 팝 |
—/90 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | — | 멀티 X/Y,A | X/Y : = XL/YL × A |
— | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | imm8 | SUBW SP, #imm | SP : = SP - imm8 |
—/90 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | — | DIV X/Y,A | X/Y를 A로 나눕니다. X/Y의 16비트 몫, A의 나머지를 나눕니다. |
— | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | — | 프리픽스 | 명령 프리픽스72 : 다음 opcode를 변경합니다. |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | — | (표준) | ||
— | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | imm8 주소16 | MOV 주소 16, #imm8 | 즉시 메모리로 이동(플래그에 영향을 주지 않음) |
— | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 주소 8 주소 8 | MOV 주소8, 주소8 | 메모리를 메모리로 이동(플래그는 영향을 받지 않음) |
— | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | addr16 addr16 | MOV 주소 16, 주소 16 | 메모리를 메모리로 이동(플래그는 영향을 받지 않음) |
— | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | — | DIVW X, Y | X를 Y로 나눕니다(16비트). X의 몫, Y의 나머지를 나눕니다. |
0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | — | (표준) | ||
0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | (표준) | ||
— | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 주소 16 | PUSH Addr16 | 스택에 푸시 |
— | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | imm8 | 푸시 #imm8 | 스택에 푸시 |
— | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | imm8 | ADDW SP, #imm8 | SP : = SP + imm8 |
— | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 주소 8 | LD(주소 8, SP),a | 스택에 상대적인 스토어 |
— | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 주소 8 | LD A, (주소 8),SP) | 스택에 상대적인 부하 |
— | 1 | 0 | 0 | 동작 코드 | — | 기타 지시사항없음은 조건 코드를 암묵적으로 설정합니다. | |||||
— | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — | IRET | 인터럽트에서 복귀(팝 CC, A, X, Y, PC) |
— | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | 리트 | 스택에서 PC로의 16비트 리턴 주소 팝 |
— | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 주소 24 | 인트 | 인터럽트 벡터 테이블의 특수 점프 |
— | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | — | 트랩 | 강제 트랩 인터럽트 |
— | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | — | POP A | 스택에서 A 팝 |
—/90 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | — | POPW X/Y | 스택에서 팝 X/Y(16비트) |
— | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | — | POP CC | 스택에서 조건 코드를 팝합니다. |
— | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | — | 리트프 | 스택에서 PC로의 24비트 리턴 주소 팝 |
— | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | — | 푸시 A | A를 스택에 푸시합니다. |
—/90 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | — | 푸시W X/Y | X/Y를 스택에 푸시(16비트) |
— | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | — | 푸시 CC | 상태 코드를 스택에 푸시합니다. |
— | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | 브레이크. | 디버거가 있는 경우 중지 또는 NOP |
— | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | — | CCF | 보완(토글) 반송 플래그 |
— | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 주소 24 | CALLF 주소 24 | 24비트 PC 푸시, PC : = addr24 |
92 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 주소 16 | CALLF [주소 16] | 간접 원거리 콜, 주소는 24비트 포인터 |
— | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | — | 정지하다 | 프로세서와 클럭을 정지 |
— | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | 와이파이 | 인터럽트를 기다려 프로세서를 정지하지만 클럭은 정지하지 않습니다. |
72 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | WFE | 이벤트(코프로세서) 대기 중 정상적으로 인터럽트 처리 |
— | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | — | PDY | 명령 프리픽스90 : 다음 명령에서 X와 Y를 스왑합니다. |
— | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | — | PIY | 명령 프리픽스91 : PDY + PIX |
— | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | — | PIX | 명령 프리픽스92 : 오퍼랜드에 간접 8비트 메모리 사용 |
—/90 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | — | LDW X/Y, Y/X | X/Y : = Y/X |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | — | LDW SP, X/Y | SP : = X/Y |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | — | LD XH/YH,A | XH/YH : = A |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | — | LDW X/Y, SP | X/Y : = SP |
—/90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | — | LD XL/YL,A | XL/YL : = A |
— | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | — | RCF | 반송 플래그 재설정(지우기) |
— | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | — | SCF | 반송 플래그 설정 |
— | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | — | 림 | 인터럽트 마스크 리셋(인터럽트 활성화) |
— | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | — | SIM | 인터럽트 마스크 설정(인터럽트 비활성화) |
— | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | — | RVF | 리셋(클리어) 오버플로 플래그 |
— | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | — | NOP | 조작 없음 |
—/90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | — | LD A, XH/YH | A : = XH / YH |
—/90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | — | LD A, XL/YL | A : = XL / YL |
프리픽스 | 1 | 모드 | 동작 코드 | 오퍼랜드 | 2-operand 명령 A :=operand | ||||||
— | 0 | 0 | 0 | 1 | 동작 코드 | 주소 8 | OP(주소 8,SP) | 스택 상대 오퍼랜드(위 참조.opcode 16, 17, 1C, 1D는 패턴을 따르지 않음) | |||
— | 1 | 0 | 1 | 0 | 동작 코드 | imm8 | OP #imm8 | 8비트 즉시 오퍼랜드(수신처로 지정) | |||
— | 1 | 0 | 1 | 1 | 동작 코드 | 주소 8 | OP 주소 8 | 8비트 절대주소(점프/콜용) | |||
— | 1 | 1 | 0 | 0 | 동작 코드 | 주소 16 | OP 주소 16 | 16비트 절대 주소 | |||
72 | 1 | 1 | 0 | 0 | 동작 코드 | 주소 16 | OP [주소 16] | 16비트 간접 주소 | |||
92 | 1 | 1 | 0 | 0 | 동작 코드 | 주소 8 | OP [주소 8] | 16비트 주소의 8비트 간접 주소 | |||
—/90 | 1 | 1 | 0 | 1 | 동작 코드 | 주소 16 | OP(주소 16, X/Y) | 16비트 오프셋으로 색인화 | |||
72 | 1 | 1 | 0 | 1 | 동작 코드 | 주소 16 | OP([addr16],X) | 16비트 간접 + X | |||
92/91 | 1 | 1 | 0 | 1 | 동작 코드 | 주소 16 | OP([addr8], X/Y) | 8비트 간접 + X/Y | |||
—/90 | 1 | 1 | 1 | 0 | 동작 코드 | 주소 8 | OP(주소 8, X/Y) | 8비트 오프셋으로 색인화 | |||
—/90 | 1 | 1 | 1 | 1 | 동작 코드 | — | OP(X/Y) | 오프셋 없이 인덱싱됨 | |||
접두사 | 1 | 모드 | 0 | 0 | 0 | 0 | 오퍼랜드 | SUB A, 오퍼랜드 | A : = A - 오퍼랜드 | ||
접두사 | 1 | 모드 | 0 | 0 | 0 | 1 | 오퍼랜드 | CP A, 오퍼랜드 | A - 피연산자 비교 | ||
접두사 | 1 | 모드 | 0 | 0 | 1 | 0 | 오퍼랜드 | SBC A, 오퍼랜드 | A : = A - 피연산자 - C를 차용하여 빼다 | ||
접두사 | 1 | 모드 | 0 | 0 | 1 | 1 | 오퍼랜드 | CPW X/Y, 오퍼랜드 | X/Y - 피연산자(16비트) 비교, 피연산자 모드가 X/Y로 인덱싱된 경우 Y/X 비교(opcode D3, E3, F3) | ||
접두사 | 1 | 모드 | 0 | 1 | 0 | 0 | 오퍼랜드 | AND, 오퍼랜드 | A : = A & 오퍼랜드, 비트 단위 및 | ||
접두사 | 1 | 모드 | 0 | 1 | 0 | 1 | 오퍼랜드 | BCP A, 오퍼랜드 | 비트 테스트 A & 오퍼랜드 | ||
접두사 | 1 | 모드 | 0 | 1 | 1 | 0 | 오퍼랜드 | LD A, 오퍼랜드 | A : = 오퍼랜드 | ||
접두사 | 1 | 모드 | 0 | 1 | 1 | 1 | 오퍼랜드 | LD 오퍼랜드,a | 오퍼랜드 : = A(모드 2 | ||
접두사 | 1 | 모드 | 1 | 0 | 0 | 0 | 오퍼랜드 | XOR A, 오퍼랜드 | A : = A ^ 오퍼랜드, 배타적 또는 | ||
접두사 | 1 | 모드 | 1 | 0 | 0 | 1 | 오퍼랜드 | ADC A, 오퍼랜드 | A : = A + 피연산자 + C, 캐리 추가 | ||
접두사 | 1 | 모드 | 1 | 0 | 1 | 0 | 오퍼랜드 | 또는 A, 오퍼랜드 | A : = 오퍼랜드(포함) 또는 | ||
접두사 | 1 | 모드 | 1 | 0 | 1 | 1 | 오퍼랜드 | ADD A, 오퍼랜드 | A : = A + 오퍼랜드 | ||
접두사 | 1 | 모드 | 1 | 1 | 0 | 0 | 오퍼랜드 | JP 오퍼랜드 | PC의 16비트 낮음:= 피연산자, 무조건 점프( | ||
접두사 | 1 | 모드 | 1 | 1 | 0 | 1 | 오퍼랜드 | 콜 오퍼랜드 | 16비트 PC, 하위 16비트 PC:= 오퍼랜드 푸시(아래 참조) (2 CALL # | ||
접두사 | 1 | 모드 | 1 | 1 | 1 | 0 | 오퍼랜드 | LDW X/Y, 오퍼랜드 | 로드 X/Y : = 피연산자, LDW Y의 경우 90 1E 대신 16을 사용합니다(addr8,SP) | ||
접두사 | 1 | 모드 | 1 | 1 | 1 | 1 | 오퍼랜드 | LDW 오퍼랜드, X/Y | 피연산자 : = X/Y(16비트, | ||
프리픽스 | 1 | 모드 | 동작 코드 | 오퍼랜드 | 2 오퍼랜드 범위에서 재할당된 opcode A7, AC, BC, AD, BD, AF | ||||||
—/90 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 주소 24 | LDF(주소 24, X/Y), A | 멀리 로드(= |
92/91 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 주소 16 | LDF([addr16], X/Y), A | 24비트 포인터의 16비트 주소 |
— | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 주소 24 | JPF 주소 24 | PC : = addr24 (= |
92 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 주소 16 | JPF [주소 16] | 간접 원거리 점프. 주소는 24비트 포인터입니다. |
— | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 주소 24 | LDF A, 주소 24 | 멀리 로드(= |
92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 주소 16 | LDF A, [addr16] | 24비트 포인터의 원거리 16비트 주소 로드 |
— | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 흐느껴 울다 | CALLR 라벨 | 16비트 PC, PC : = PC + 피연산자 (= |
— | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 주소 24 | LDF 주소 24,a | 오퍼랜드 : = A (= |
92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 주소 16 | LDF [addr16],a | 오퍼랜드 : = A, 24비트 포인터의 16비트 주소 |
—/90 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 주소 24 | LDF A, (주소 24, X/Y) | 멀리 로드(= |
92/91 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 주소 16 | LDF A, ([addr16], X/Y) | 24비트 포인터의 16비트 주소 |
72 | 1 | 모드 | 동작 코드 | 오퍼랜드 | 인덱스 레지스터 산술(16비트) X/Y : = X/Y ± 피연산자 | ||||||
72 | 1 | 0 | 1 | 0 | 동작 코드 | imm16 | OPW X/Y, #imm16 | 16비트(즉시 | |||
72 | 1 | 0 | 1 | 1 | 동작 코드 | 주소 16 | OPW X/Y, 주소 16 | 16비트 절대 | |||
72 | 1 | 1 | 1 | 1 | 동작 코드 | 주소 8 | OPW X/Y, (주소 8,SP) | 스택 상대 | |||
72 | 1 | 모드 | 0 | 0 | 0 | 0 | 오퍼랜드 | SUBW X, 오퍼랜드 | X : = X - 오퍼랜드 (SUBW X의 경우 연산 코드 1D, #imm16이 필요) | ||
72 | 1 | 모드 | 0 | 0 | 1 | 0 | 오퍼랜드 | SUBW Y, 오퍼랜드 | Y : = Y - 오퍼랜드 | ||
72 | 1 | 모드 | 1 | 0 | 0 | 1 | 오퍼랜드 | ADDW Y, 연산자 | Y : = Y + 오퍼랜드 | ||
72 | 1 | 모드 | 1 | 0 | 1 | 1 | 오퍼랜드 | ADDW X, 오퍼랜드 | X : = X + 오퍼랜드 (ADDW X의 경우 opcode 1C, #imm16이 필요) |
오퍼랜드 어드레싱 모드가 X에 의해 인덱스되는 CPW 및 LDW 명령의 경우 STM8은 기본적으로 X 대신 Y 레지스터를 사용합니다.의 적용90
프리픽스는 X와 Y를 교환하기 때문에 레지스터는 X이고 주소 지정 모드는 Y에 의해 색인화됩니다.
레퍼런스
- ^ Carlson, Jay (September 15, 2017). "ST STM8". Retrieved 2018-06-12.
- ^ a b "PM0044: STM8 CPU programming manual" (PDF). STMicroelectronics. September 2011. Document 13590 Rev 3. Retrieved 2018-06-10.
- ^ "COS-C-COMPILER - Free C Compiler for all STM8, from Cosmic" (Press release). STMicroelectronics. Retrieved 24 March 2016.