회원가입 ID/PW 찾기

하드웨어 설계에 관련한 공개 강좌를 게재하는 공간입니다.
운영진에 의해 강좌글은 편집되며, 공익을 위한 게시글은 '하드웨어 강좌'란으로 이동될 수 있습니다.

콘텐츠 수 7

제3장. 명령어

8051 어셈블리 강좌(by 허인교수님) 구매수 0 조회 수 4159 2012.04.07 19:10:29
판매자 아크마 판매 납포인트 무료 평점 1.0점 / 총 1명 참여

3. 명령어

 

 

1. 명령어 집합

ㅇ 명령어 집합 : 8비트 Opcode,  28 = 256개의 명령어를 제공

  - 255개 명령어 구현, 1개는 정의되지 않음

  - 139개가 1바이트 명령어, 92개가 2바이트 명령어, 24개가 3바이트 명령어

* 교재 308page 부록B 그림B-1. 동작코드 참조

 

 

2. 주소체계(유형)

 

     clip_image001[4].jpg

 

2.1 레지스터 주소법(Register addressing)

1byte

8개의 작업 레지스터(R0R7), 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비트(A0A10))

AJMP <dest> (AJMP LABEL1, ACALL LABEL2)

ㅇ 코드 메모리의 2Kbyte(A0A10) 범위 내에서 분기

* 교재 61page 그림3-1 8051의 주소체계 (f) 참조

 

2.7 롱 주소 방식(Long addressing)

3byte(opcode, 분기주소 16비트(A15A8, A7A0))

LJMP <dest> (LJMP LABEL1, LCALL LABEL2)

ㅇ 코드 메모리의 전체 즉 64Kbyte(A0A15) 범위 내에서 분기

* 교재 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

  * 교재 310311page 부록 C 명령어 정의 참조

 

ADDC(캐리와 함께 더하기)

  - ADDC A, Rn / ADDC A, direct / ADDC A, @Ri / ADDC A, #data

  * 교재 312313page 부록 C 명령어 정의 참조

 

SUBB(뺴기)

  - SUBB A, Rn / SUBB A, direct / SUBB A, @Ri / SUBB A, #data

  * 교재 351353page 부록 C 명령어 정의 참조

 

INC(증가)

  - INC A / INC Rn / INC direct / INC @Ri / INC DPTR

  * 교재 327328page 부록 C 명령어 정의 참조

 

DEC(감소)

  - DEC A / DEC Rn / DEC direct / DEC @Ri

  * 교재 323324page 부록 C 명령어 정의 참조

 

MUL(곱하기)

  - MUL AB

  * 교재 341page 부록 C 명령어 정의 참조

 

DIV(나누기)

  - DIV AB

  * 교재 325page 부록 C 명령어 정의 참조

 

DA(십진수로 조정)

  - DA A

  * 교재 322323page 부록 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

  * 교재 314315page 부록 C 명령어 정의 참조

 

ORL(논리적 OR)

  - ORL A, Rn / ORL A, direct / ORL A, @Ri / ORL A, #data /

    ORL direct, A / ORL direct, #data

  * 교재 342344page 부록 C 명령어 정의 참조

 

XRL(논리적 Exclusive-OR)

  - XRL A, Rn / XRL A, direct / XRL A, @Ri / XRL A, #data /

    XRL direct, A / XRL direct, #data

  * 교재 355356page 부록 C 명령어 정의 참조

 

CLR(누산기 내용을 지움)

  - CLR A

  * 교재 319page 부록 C 명령어 정의 참조

 

CPL(누산기의 내용을 보수화)

  - CPL A

  * 교재 320321page 부록 C 명령어 정의 참조

 

RL, RLC, RR, RRC(회전하기)

  - RL A  (누산기 내용을 왼쪽으로 회전)

  - RLC A (캐리 플래그를 포함하여 누산기 내용을 왼쪽으로 회전)

  - RR A  (누산기 내용을 오른쪽으로 회전)

  - RRC A (캐리 플래그를 포함하여 누산기 내용을 오른쪽으로 회전)

  * 교재 348349page 부록 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

  * 교재 335339page, 340page 부록 C 명령어 정의 참조

 

MOVC(상수 바이트나 코드 바이트 이동)

  - MOVC A, @A+DPTR / MOVC A, @A+PC

  * 교재 340341page 부록 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

  * 교재 353354page 부록 C 명령어 정의 참조

 

XCHD(하위 니블의 내용을 교환)

  - XCHD A, @Ri

  * 교재 354355page 부록 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

  * 교재 344345page 부록 C 명령어 정의 참조

 

MOV <dest-bit>, <src-bit> (비트 변수 옮기기)

  - MOV C, bit / MOV bit, C

  * 교재 339page 부록 C 명령어 정의 참조

 

JC <rel> (캐리가 셋이면 점프)

  - JC LABEL1

  * 교재 330page 부록 C 명령어 정의 참조

 

JNC <rel> (캐리가 셋이 아니면 점프)

  - JNC LABEL2

  * 교재 332333page 부록 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

  * 교재 329330page 부록 C 명령어 정의 참조

 

 

3.5 프로그램 분기 명령어(Program Branching)

CALL

  - ACALL addr11

  - LCALL addr16

  * 교재 316, 309310, 334page 부록 C 명령어 정의 참조

 

JMP

  - SJMP rel

  - AJMP addr11

  - LJMP addr16

  - JMP @A+DPTR

  * 교재 350351, 313, 335, 331page 부록 C 명령어 정의 참조

 

RET (서브루틴으로부터 복귀)

  * 교재 346347page 부록 C 명령어 정의 참조

 

RETI (인터럽트로부터 복귀)

  * 교재 347page 부록 C 명령어 정의 참조

 

JZ <rel> (누산기의 내용이 0이면 점프)

  - JZ LABEL1

  * 교재 333334page 부록 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

  * 교재 317319page 부록 C 명령어 정의 참조

 

 

DJNZ <byte>, <rel>

   (Decrement <dest-byte> and Jump if Not Zero)

  - DJNZ Rn, rel / DJNZ direct, rel

  * 교재 325327page 부록 C 명령어 정의 참조

 

NOP (No Operation)

  * 교재 341342page 부록 C 명령어 정의 참조

 

 

 

 

 


위 내용은 청강대학교 허인 교수님의 고마운 공유정신 발휘로 마이컴박스에 게시 및 수정 업데이트됩니다.
허인 교수님 및 마이컴박스(개정부분)의 동의 없이 무단 복재 및 전재, 재배포 금지합니다.

모르는 것이 무엇인지 스스로 정리하고 질문하는 습관을 가집시다.
무성의/광범위하거나 직접 해보지 않고 올리는 질문은 서로를 피곤하게 합니다.
질문쪽지는 사절이오니 게시판에 글을 남겨주세요. 그래야 다같이 공유할 수 있으니까요.

첨부

profile
11시22분 2019.04.17 14:58
감사합니다
search

8051 어셈블리 강좌(by 허인교수님) : (7)
■ 제3장. 명령어 2019-04-17 14:58
ETC
  • 사람은 자기 일이 끝나기 전에는 죽지 않는다.
    - 리빙스턴
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.