[[볼때 관점]]

명령어 비트와 사이클 부분을 중요하게 볼 필요가 있다.

비트는 명령어 자체만의 비트..즉 오퍼랜드는 제외..

사이클은 CPU 내부 펄스 사이클

메모리에서 읽어드리는 경우는 읽어드리는 과정이 포함됨으로 최소 2사이클 이상이 됨을 주의해볼 필요가 있다.

Coprocessor 부분을 이용하는 연산의 경우도 꽤나 많은 사이클이 걸린다.

결국, 메모리보다 Coprocessor부분이 많은 실행 소요시간을 차지한다.

 

명령어

오 퍼 랜 드

설                                      명

바이트

사이클

Arithmetic Operations (산술 연산 명령어)

ADD

A, Rn

Acc에 레지스터 Rn의 값을 더함

1

1

A, direct

Acc에 direct 번지의 값을 더함

2

1

A, @Ri

Acc에 Ri가 가리키는 번지의 값을 더함

1

1

A, #data

Acc에 data(상수) 값을 더함

2

1

ADDC

A, Rn

Acc에 레지스터 Rn의 값과 자리올림수를 함께 더함

1

1

A, direct

Acc에 direct 번지의 값과 자리올림수를 함께 더함

2

1

A, @Ri

Acc에 Ri가 가리키는 번지의 값과 자리올림수를 함께 더함

1

1

A, #data

Acc에 data(상수) 값과 자리올림수를 함께 더함

2

1

SUBB

A, Rn

Acc에서 레지스터 Rn의 값과 빌림수를 함께 뺌

1

1

A, direct

Acc에서 direct 번지의 값과 빌림수를 함께 뺌

2

1

A, @Ri

Acc에서 Ri가 가리키는 번지의 값과 빌림수를 함께 뺌

1

1

A, #data

Acc에서 data(상수) 값과 빌림수를 함께 뺌

2

1

INC

A

Acc의 값을 1 증가

1

1

Rn

레지스터 Rn의 값을 1 증가

1

1

direct

direct 번지의 값을 1 증가

2

1

@Ri

Ri가 가리키는 번지의 값을 1 증가

1

1

DEC

A

Acc의 값을 1 감소

1

1

Rn

레지스터 Rn의 값을 1 감소

1

1

direct

direct 번지의 값을 1 감소

2

1

@Ri

Ri가 가리키는 번지의 값을 1 감소

1

2

MUL

AB

A, B레지스터를 곱하여 B에 상위, A에 하위 8비트 저장

1

4

DIV

AB

A⁒B를하여 A레지스터에 몫, B레지스터에 나머지 저장

1

4

DA

A

Acc의 값을 BCD코드 형태로 변환

1

1

Logical Operations (논리 연산 명령어)

ANL

A, Rn

Acc와 레지스터 Rn의 값을 AND 연산

1

1

A, direct

Acc와 direct 번지의 값을 AND 연산

2

1

A, @Ri

Acc와 Ri가 가리키는 번지의 값을 AND 연산

1

1

A, #data

Acc와 data(상수) 값을 AND 연산

2

1

direct, A

direct 번지의 값과 Acc를 AND 연산

2

1

direct, #data

direct 번지의 값과 data(상수) 값을 AND 연산

3

2

ORL

A, Rn

Acc와 레지스터 Rn의 값을 OR 연산

1

1

A, direct

Acc와 direct 번지의 값을 OR 연산

2

1

A, @Ri

Acc와 Ri가 가리키는 번지의 값을 OR 연산

1

1

A, #data

Acc와 data(상수) 값을 OR 연산

2

1

direct, A

direct 번지의 값과 Acc를 OR 연산

2

1

direct, #data

direct 번지의 값과 data(상수) 값을 OR 연산

3

2

XRL

A, Rn

Acc와 레지스터 Rn의 값을 EX-OR 연산

1

1

A, direct

Acc와 direct 번지의 값을 EX-OR 연산

2

1

A, @Ri

Acc와 Ri가 가리키는 번지의 값을 EX-OR 연산

1

1

A, #data

Acc와 data(상수) 값을 EX-OR 연산

2

1

direct, A

direct 번지의 값과 Acc를 EX-OR 연산

2

1

direct, #data

direct 번지의 값과 data(상수) 값을 EX-OR 연산

3

2

CLR

A

Acc를 클리어 시킴

1

1

CPL

A

Acc의 값을 컴플리먼트(1의 보수) 시킴

1

1

RL

A

Acc의 값을 왼쪽으로 로테이트(회전) 시킴

1

1

RLC

A

Acc의 값을 캐리와 함께 왼쪽으로 로테이트(회전) 시킴

1

1

RR

A

Acc의 값을 오른쪽으로 로테이트(회전) 시킴

1

1

RRC

A

Acc의 값을 캐리와 함께 오른쪽으로 로테이트(회전) 시킴

1

1

SWAP

A

Acc의 값의 상·하위 값을 교체시킴

1

1

Data Transfer (데이터 이동 명령어)

MOV

A, Rn

레지스터 Rn의 값을 Acc에 이동시킴

1

1

A, direct

direct 번지의 값을 Acc에 이동시킴

2

1

A, @Ri

Ri가 가리키는 번지의 값을 Acc에 이동시킴

1

1

Rn, #data

data(상수)의 값을 레지스터 Rn에 이동시킴

2

1

Rn, A

Acc의 값을 레지스터 Rn에 이동시킴

1

1

Rn, direct

direct 번지의 값을 레지스터 Rn에 이동시킴

2

2

Rn, #data

data(상수)의 값을 레지스터 Rn에 이동시킴

2

1

direct, A

Acc의 값을 direct 번지로 이동시킴

2

1

direct, Rn

레지스터 Rn의 값을 direct 번지로 이동시킴

2

2

direct, direct

direct 번지의 값을 direct 번지로 이동시킴

3

2

direct, @Ri

Ri가 가리키는 번지의 값을 direct 번지로 이동시킴

2

2

direct, #data

data(상수)의 값을 direct 번지로 이동시킴

3

2

@Ri, A

Acc의 값을 Ri가 가리키는 번지로 이동시킴

1

1

@Ri, direct

direct 번지의 값을 Ri가 가리키는 번지로 이동시킴

2

2

@Ri, #data

data(상수)의 값을 Ri가 가리키는 번지로 이동시킴

2

1

DPTR, #data16

16bit data(상수)의 값을 DPTR로 이동시킴

3

2

MOVC

A, @A+DPTR

Acc에 Acc+DPTR이 가리키는 번지의 값을 이동시킴

1

2

A, @A+PC

Acc에 Acc+PC가 가리키는 번지의 값을 이동시킴

1

2

MOVX

A, @Ri

Acc에 Ri가 가리키는 외부 번지의 값을 이동시킴

1

2

A, @DPTR

Acc에 DPTR이 가리키는 외부 번지의 값을 이동시킴

1

2

@Ri, A

Ri가 가리키는 외부 번지에 Acc의 값을 이동시킴

1

2

@DPTR, A

DPTR이 가리키는 외부 번지에 Acc의 값을 이동시킴

1

2

PUSH

direct

direct 번지의 값을 스택에 넣음

2

2

POP

direct

스택의 SP가 지시하는 위치의 값을 꺼내 direct 번지에 넣음

2

2

XCH

A, Rn

Acc의 값과 레지스터 Rn의 값을 교환

1

1

A, direct

Acc의 값과 direct 번지의 값을 교환

2

1

A, @Ri

Acc의 값과 Ri가 가리키는 번지의 값을 교환

1

1

XCHD

A, @Ri

Acc의 값과 Ri가 가리키는 번지의 값의 하위 4bit 교환

1

1

Boolean Variable Manipulation (불 대수 처리 명령어)

CLR

C

캐리 플래그를 클리어(0) 시킴

1

1

bit

bit 어드레스의 값을 클리어(0) 시킴

2

1

SETB

C

캐리 플래그를 셋(1) 시킴

1

1

bit

bit 어드레스의 값을 셋(1) 시킴

2

1

CPL

C

캐리 플래그를 컴플리먼트(1의 보수) 시킴

1

1

bit

bit 어드레스의 값을 컴플리먼트(1의 보수) 시킴

2

1

ANL

C, bit

캐리 플래그와 bit 어드레스의 값을 AND 시킴

2

2

C, /bit

캐리 플래그와 bit 어드레스의 컴플리먼트 값을 AND 시킴

2

2

ORL

C, bit

캐리 플래그와 bit 어드레스의 값을 OR 시킴

2

2

C, /bit

캐리 플래그와 bit 어드레스의 컴플리먼트 값을 OR 시킴

2

2

MOV

C, bit

캐리 플래그에 bit 어드레스의 값을 이동시킴

2

1

bit, C

bit 어드레스에 캐리 플래그의 값을 이동시킴

2

2

Program And Machine Control (서브루틴 / 분기 명령어)

ACALL

addr11

2Kbyte (2048 byte) 내의 절대 콜 (서브루틴)

2

2

LCALL

addr16

롱 콜 (서브루틴)

3

2

RET


서브루틴의 복귀

1

2

RET1


인터럽트로부터의 복귀

1

2

AJMP

addr11

2Kbyte (2048 byte) 내의 절대 점프

2

2

LJMP

addr16

롱 점프

3

2

SJMP

rel

현재 PC에 변위(rel : -128∼128)를 더한 위치로 점프

2

2

JMP

@A+DPTR

Acc와 DPTR의 값을 더한 주소로 점프

1

2

JZ

rel

Acc가 0이면 현재 PC에 변위(rel : -128∼128)를 더한 위치로 점프

2

2

JNZ

rel

Acc가 0이 아니면 PC에 변위(rel : -128∼128)를 더한 위치로 점프

2

2

JC

rel

캐리 플래그가 1이면 PC에 변위(rel : -128∼128)를 더한 위치로 점프

2

2

JNC

rel

캐리 플래그가 0이면 PC에 변위(rel : -128∼128)를 더한 위치로 점프

2

2

JB

bit, rel

비트 어드레스가 셋(1) 상태이면 PC에 변위를 더한 위치로 점프

3

2

JNB

bit, rel

비트 어드레스가 셋(1) 상태가 아니면 PC에 변위를 더한 위치로 점프

3

2

JBC

bit, rel

비트 어드레스가 셋(1) 상태이면 PC에 변위를 더한 위치로 점프 & 비트 클리어(0)

3

2

CJNE

A, direct, rel

Acc와 direct 번지의 값을 비교하여 다르면 PC에 변위를 더한 위치로 점프

3

2

A, #data, rel

Acc와 data(상수) 값을 비교하여 다르면 PC에 변위를 더한 위치로 점프

3

2

Rn, #data, rel

레지스터 Rn과 data(상수) 값을 비교하여 다르면 PC에 변위를 더한 위치로 점프

3

2

@Ri, #data, rel

Ri가 가리키는 값과 data(상수) 값을 비교하여 다르면 PC에 변위를 더한 위치로 점프

3

2

DJNZ

Rn, rel

레지스터 Rn값을 1 감소시키고 PC에 변위를 더한 위치로 점프

2

2

direct, rel

direct 번지의 값을 1 감소시키고 PC에 변위를 더한 위치로 점프

3

2

NOP


아무 처리도 하지 않음

1

1

오퍼 랜드의 어드레스 모드 설명

Rn

메모리 어드레스 00∼1FH / 범용 레지스터 / R0, R1은 메모리 어드레스 포인터로 사용 / R3∼R7은 범용

direct

메모리 어드레스 20H∼2FH / 내부 데이터 메모리 (16byte = 128bit) /

@Ri

내부 데이터 메모리의 간접 번지 지정 / R0, R1 이용

#data

8bit 상수 데이터

#data16

16bit 상수 데이터

bit

비트 어드레스 영역의 비트 번호

addr16

LCALL과 LJMP에서 사용하는 64Kbyte 내의 프로그램 메모리 어드레스

addr11

ACALL과 AJMP에서 사용하는 2Kbyte 내의 프로그램 메모리 어드레스

rel

SJMP등에서 사용하는 -128∼128byte 사이의 어드레스 변위