자료 곳간/컴자료 庫

8051 어셈블리 명령어

淸山에 2011. 1. 12. 13:46
  

 

 
 
 

8051 어셈블리 명령어

 

1. 명령어 정리

 

2. 8051 어셈블러 지시어(Directive)

'어셈블러 지시어'란 프로그램 실행과는 관계가 없고 단지 어셈블러에게 정보만 제공해 주는 명령어이다

1) ORG (ORiGen) : 프로그램과 데이터의 시작 번지 설정
2) END: 어셈블러 작업의 종료를 나타냄. END문 이후의 어셈블리어 프로그램은 기계어로 변환되지 않는다
3) EQU (EQUate) : Label에 식의 값을 할당한다
4) DB (Define Byte) : 메모리에 데이터를 1바이트 단위로 저장
5) DW (Define Word) : 메모리에 데이터를 2바이트(워드) 단위로 저장
6) DS (Define Storage) : 메모리를 바이트 단위로 확보


명령어

오 퍼 랜 드

설                                      명

바이트

사이클

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 사이의 어드레스 변위

 

 

2. 8051 어셈블러 지시어(Directive)

'어셈블러 지시어'란 프로그램 실행과는 관계가 없고 단지 어셈블러에게 정보만 제공해 주는 명령어이다

1) ORG (ORiGen) : 프로그램과 데이터의 시작 번지 설정
2) END: 어셈블러 작업의 종료를 나타냄. END문 이후의 어셈블리어 프로그램은 기계어로 변환되지 않는다
3) EQU (EQUate) : Label에 식의 값을 할당한다
4) DB (Define Byte) : 메모리에 데이터를 1바이트 단위로 저장
5) DW (Define Word) : 메모리에 데이터를 2바이트(워드) 단위로 저장
6) DS (Define Storage) : 메모리를 바이트 단위로 확보