하드웨어 설계에 관련한 공개 강좌를 게재하는 공간입니다.
운영진에 의해 강좌글은 편집되며, 공익을 위한 게시글은 '하드웨어 강좌'란으로 이동될 수 있습니다.
판매자 | 아크마 | 판매 납포인트 | 무료 | 평점 | 1.0점 / 총 1명 참여 |
---|
제3장. 명령어
1. 명령어 집합
ㅇ 명령어 집합 : 8비트 Opcode, 28 = 256개의 명령어를 제공
- 255개 명령어 구현, 1개는 정의되지 않음
- 139개가 1바이트 명령어, 92개가 2바이트 명령어, 24개가 3바이트 명령어
* 교재 308page 부록B 그림B-1. 동작코드 참조
2. 주소체계(유형)
2.1 레지스터 주소법(Register addressing)
ㅇ 1byte
ㅇ 8개의 작업 레지스터(R0~R7), 4조의 Bank, 총 32개 레지스터
ㅇ ADD A, R7
- opcode : 00101111B
* 교재 61page 그림3-1 8051의 주소체계 (a) 참조
2.2 직접주소법(Direct addressing)
ㅇ 2byte(opcode, Direct address)
ㅇ ADD A, Direct
ㅇ 바이트 액세스 : MOV A, 3EH
비트 액세스 : MOV C, P1.0
* 교재 61page 그림3-1 8051의 주소체계 (b) 참조
2.3 간접 주소법(Indirect addressing)
ㅇ 1byte
ㅇ ADD A, @R0 (i=0, 1)
* 교재 61page 그림3-1 8051의 주소체계 (c) 참조
2.4 이미디에이트 주소법(Immediate addressing)
ㅇ 2byte(opcode, Immediate data)
ㅇ ADD A, #55H
* 교재 61page 그림3-1 8051의 주소체계 (d) 참조
2.5 상대 주소 방식(Relative addressing)
ㅇ 2byte(opcode, relative offset)
ㅇ SJMP <dest> (SJMP LABEL1)
ㅇ 상대주소(offset)는 프로그램 카운터에 더해지는 8비트 부호화된 값,
범위 : -128 ~ +127
* 교재 61page 그림3-1 8051의 주소체계 (e) 참조
2.6 절대 주소 방식(Absolute addressing)
ㅇ 2byte(opcode, 분기주소 11비트(A0~A10))
ㅇ AJMP <dest> (AJMP LABEL1, ACALL LABEL2)
ㅇ 코드 메모리의 2Kbyte(A0~A10) 범위 내에서 분기
* 교재 61page 그림3-1 8051의 주소체계 (f) 참조
2.7 롱 주소 방식(Long addressing)
ㅇ 3byte(opcode, 분기주소 16비트(A15~A8, A7~A0))
ㅇ LJMP <dest> (LJMP LABEL1, LCALL LABEL2)
ㅇ 코드 메모리의 전체 즉 64Kbyte(A0~A15) 범위 내에서 분기
* 교재 61page 그림3-1 8051의 주소체계 (g) 참조
2.8 색인 주소 방식(Indexed addressing)
ㅇ Base register + Offset = Effective address
[PC(or DPTR)]+[Acc] = Effective address
ㅇ MOVC A, @A+PC
MOVC A, @A+DPTR
* 교재 61page 그림3-1 8051의 주소체계 (h) 참조
3. 명령어 유형
ㅇ 8051 명령어는 아래와 같이 5가지 유형으로 분류
- 산술 명령어
- 논리 명령어
- 데이터 이동 명령어
- 부울 명령어
- 프로그램 분기 명령어
3.1 산술 명령어(Arithmetic Operations)
ㅇ ADD(더하기)
- ADD A, Rn / ADD A, direct / ADD A, @Ri / ADD A, #data
* 교재 310~311page 부록 C 명령어 정의 참조
ㅇ ADDC(캐리와 함께 더하기)
- ADDC A, Rn / ADDC A, direct / ADDC A, @Ri / ADDC A, #data
* 교재 312~313page 부록 C 명령어 정의 참조
ㅇ SUBB(뺴기)
- SUBB A, Rn / SUBB A, direct / SUBB A, @Ri / SUBB A, #data
* 교재 351~353page 부록 C 명령어 정의 참조
ㅇ INC(증가)
- INC A / INC Rn / INC direct / INC @Ri / INC DPTR
* 교재 327~328page 부록 C 명령어 정의 참조
ㅇ DEC(감소)
- DEC A / DEC Rn / DEC direct / DEC @Ri
* 교재 323~324page 부록 C 명령어 정의 참조
ㅇ MUL(곱하기)
- MUL AB
* 교재 341page 부록 C 명령어 정의 참조
ㅇ DIV(나누기)
- DIV AB
* 교재 325page 부록 C 명령어 정의 참조
ㅇ DA(십진수로 조정)
- DA A
* 교재 322~323page 부록 C 명령어 정의 참조
3.2 논리 명령어(Logical Operations)
ㅇ ANL(논리적 AND)
- ANL A, Rn / ANL A, direct / ANL A, @Ri / ANL A, #data /
ANL direct, A / ANL direct, #data
* 교재 314~315page 부록 C 명령어 정의 참조
ㅇ ORL(논리적 OR)
- ORL A, Rn / ORL A, direct / ORL A, @Ri / ORL A, #data /
ORL direct, A / ORL direct, #data
* 교재 342~344page 부록 C 명령어 정의 참조
ㅇ XRL(논리적 Exclusive-OR)
- XRL A, Rn / XRL A, direct / XRL A, @Ri / XRL A, #data /
XRL direct, A / XRL direct, #data
* 교재 355~356page 부록 C 명령어 정의 참조
ㅇ CLR(누산기 내용을 지움)
- CLR A
* 교재 319page 부록 C 명령어 정의 참조
ㅇ CPL(누산기의 내용을 보수화)
- CPL A
* 교재 320~321page 부록 C 명령어 정의 참조
ㅇ RL, RLC, RR, RRC(회전하기)
- RL A (누산기 내용을 왼쪽으로 회전)
- RLC A (캐리 플래그를 포함하여 누산기 내용을 왼쪽으로 회전)
- RR A (누산기 내용을 오른쪽으로 회전)
- RRC A (캐리 플래그를 포함하여 누산기 내용을 오른쪽으로 회전)
* 교재 348~349page 부록 C 명령어 정의 참조
ㅇ SWAP(누산기의 내용 중 상,하 니블(4비트)의 교체)
- SWAP A
* 교재 353page 부록 C 명령어 정의 참조
3.3 데이터 이동 명령(Data Transfer)
ㅇ MOV(바이트 변수 이동)
- MOV A, Rn / MOV A, direct / MOV A, @Ri / MOV A, #data /
- MOV Rn, A / MOV Rn, direct / MOV Rn, #data /
- MOV direct, A / MOV direct, Rn / MOV direct, direct / MOV direct, @Ri / MOV direct, #data /
- MOV @Ri, A / MOV @Ri, direct / MOV @Ri, #data /
- MOV DPTR, #data16
* 교재 335~339page, 340page 부록 C 명령어 정의 참조
ㅇ MOVC(상수 바이트나 코드 바이트 이동)
- MOVC A, @A+DPTR / MOVC A, @A+PC
* 교재 340~341page 부록 C 명령어 정의 참조
ㅇ MOVX(외부 RAM 내용과 누산기 내용을 이동)
* 교재 357page 내용을 삭제 후 아래 사항 기재
- MOVX A, @Ri (i = 0, 1)
․ 바이트 : 1, 사이클 : 2, 코드 : 1110001i, 동작 : (A) ← ((Ri))
- MOVX A, @DPTR
․ 바이트 : 1, 사이클 : 2, 코드 : 11100000, 동작 : (A) ← ((DPTR))
- MOVX @Ri, A (i = 0, 1)
․ 바이트 : 1, 사이클 : 2, 코드 : 1111001i, 동작 : ((Ri)) ← ((A))
- MOVX @DPTR, A
․ 바이트 : 1, 사이클 : 2, 코드 : 11110000, 동작 : ((DPTR)) ← (A)
ㅇ PUSH(스택에 자료를 넣음)
- PUSH DPL, PUSH DPH
* 교재 346page 부록 C 명령어 정의 참조
ㅇ POP(스택으로부터 자료를 꺼냄)
- POP DPH, POP DPL
* 교재 345page 부록 C 명령어 정의 참조
ㅇ XCH(바이트 변수를 가진 누산기의 교환)
- XCH A, Rn / XCH A, direct / XCH A, @Ri
* 교재 353~354page 부록 C 명령어 정의 참조
ㅇ XCHD(하위 니블의 내용을 교환)
- XCHD A, @Ri
* 교재 354~355page 부록 C 명령어 정의 참조
3.4 부울 명령어(Boolean Variable Manipulation)
ㅇ CLR <bit> (비트 지우기)
- CLR C / CLR bit
* 교재 320page 부록 C 명령어 정의 참조
ㅇ SETB <bit> (비트 세트)
- SETB C / SETB bit
* 교재 350page 부록 C 명령어 정의 참조
ㅇ CPL <bit> (비트 보수)
- CPL C / CPL bit
* 교재 321page 부록 C 명령어 정의 참조
ㅇ ANL C, <bit> (비트 논리적 AND)
- ANL C, bit / ANL C, /bit
* 교재 316page 부록 C 명령어 정의 참조
ㅇ ORL C, <bit> (비트 논리적 OR)
- ORL C, bit / ORL C, /bit
* 교재 344~345page 부록 C 명령어 정의 참조
ㅇ MOV <dest-bit>, <src-bit> (비트 변수 옮기기)
- MOV C, bit / MOV bit, C
* 교재 339page 부록 C 명령어 정의 참조
ㅇ JC <rel> (캐리가 셋이면 점프)
- JC LABEL1
* 교재 330page 부록 C 명령어 정의 참조
ㅇ JNC <rel> (캐리가 셋이 아니면 점프)
- JNC LABEL2
* 교재 332~333page 부록 C 명령어 정의 참조
ㅇ JB <bit>, <rel> (비트가 셋이면 rel주소로 점프)
- JB P1.2, LABEL1
* 교재 329page 부록 C 명령어 정의 참조
ㅇ JNB <bit>, <rel> (비트가 셋이 아니면 rel주소로 점프)
- JNB P1.2, LABEL2
* 교재 332page 부록 C 명령어 정의 참조
ㅇ JBC <bit>, <rel> (비트가 셋이면 점프하고, 비트를 클리어)
- JBC ACC.3, LABEL1
* 교재 329~330page 부록 C 명령어 정의 참조
3.5 프로그램 분기 명령어(Program Branching)
ㅇ CALL
- ACALL addr11
- LCALL addr16
* 교재 316, 309~310, 334page 부록 C 명령어 정의 참조
ㅇ JMP
- SJMP rel
- AJMP addr11
- LJMP addr16
- JMP @A+DPTR
* 교재 350~351, 313, 335, 331page 부록 C 명령어 정의 참조
ㅇ RET (서브루틴으로부터 복귀)
* 교재 346~347page 부록 C 명령어 정의 참조
ㅇ RETI (인터럽트로부터 복귀)
* 교재 347page 부록 C 명령어 정의 참조
ㅇ JZ <rel> (누산기의 내용이 0이면 점프)
- JZ LABEL1
* 교재 333~334page 부록 C 명령어 정의 참조
ㅇ JNZ <rel> (누산기의 내용이 0이 아니면 점프)
- JNZ LABEL1
* 교재 334page 여백에 아래사항 기재
․ 바이트 : 2, 사이클 : 2, 코드 : 01110000 eeeeeeee
동작 : (PC) ← (PC) + 2
IF (A) ≠ 0 THEN (PC) ← (PC) + rel
ㅇ CJNE <dest-byte>, <src-byte>, rel
(Compare <dest-byte> to <src-byte> and Jump if Not Equal)
- CJNE A, direct, rel / CJNE A, #data, rel /
CJNE Rn, #data, rel / CJNE @Ri, #data, rel
* 교재 317~319page 부록 C 명령어 정의 참조
ㅇ DJNZ <byte>, <rel>
(Decrement <dest-byte> and Jump if Not Zero)
- DJNZ Rn, rel / DJNZ direct, rel
* 교재 325~327page 부록 C 명령어 정의 참조
ㅇ NOP (No Operation)
* 교재 341~342page 부록 C 명령어 정의 참조