z8051 명령어의이해 z명령어종류 -...

Post on 16-Jan-2020

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

8051 8051 명령어명령어

8051 명령어의 이해

명령어 종류명령어 종류

dolicom@naver.comhttp://blog.naver.com/dolicom

CPU의 기계어 프로그램CPU의 기계어 프로그램

80518051 어셈블리어셈블리 언어언어8051 8051 어셈블리어셈블리 언어언어

기계어기계어

기계어( )기계어(Machine Language)CPU가 직접 이해할수 있는 언어

일련의0과 1로 표시실행할명령 데이터 기억장소의주소등포함실행할명령, 데이터, 기억장소의주소등포함

하드웨어가 직접 실행 시킬 수 있는형태다양한 비트 형식 가짐다양한 비트 형식 가짐

주로 16진수로 표기2진코드로 이해하기 어려움

CPU 기종에 따라 다름

프로그램 언어프로그램 언어

저급 언어 (Low Level Language)어셈블리어어셈블리어

기계어를 기호화 한 프로그램 언어

고급 언어 (High Level Langage)컴파일러 사용컴파일러 사용

C, Fortran, COBAL, Pascal

어셈블리 언어어셈블리 언어

어셈블리 언어 (A bl L )어셈블리 언어 (Assembly Language)기계어와 1대1로 대응한 명령을 기술하는 언어

Mnemonic code : 니모딕코드Mnemonic code 니 딕

상징적인 연상 기호 사용, 주로 시스템 프로그래밍에 사용하드웨어 이해에 적합

CPU 개발사에 따라 독자적인 기능 가짐CPU 개발사에 따라 독자적인 기능 가짐

매크로 어셈블리 언어(Macro Assembly Language)기계어로 번역되지 않는 의사명령사용, 매크로 기능 가짐기계어 역되지 않 의사명령사용, 매 기능 가

의사(psuedo)명령=>어셈블러 직접 기계어로 번역되지 않지만번역시 어셈블러에 의해 참조

어셈블러(Assembler)어셈블러(Assembler)어셈블리 프로그램 언어로 쓰여진 소스프로그램을 번역하여기계어 프로그램을 작성해주는 프로그램

8051의 명령어의 종류8051의 명령어의 종류

데이터 전송명령 : MOV

산술연산명령 ADD SUBB MUL DIV산술연산명령 : ADD, SUBB, MUL, DIV

논리연산명령 : AND, OR논리연산명령 AND, OR

비트조작명령 : RRC, RLC

( )점프명령 : JMP, JZ(조건 점프)

기능별 분류기능별 분류

명령어의 구조명령어의 구조

1 바이트 명령어 형식

OP 코드

2바이트 명령어

OP 코드

2바이트 명령어

OP 코드 오퍼랜드

3 바이트명령어

OP 코드 오퍼랜드

3 바이트명령어

OP 코드 오퍼랜드1 오퍼랜드2OP 코드 오퍼랜드1 오퍼랜드2

CPU의 기계어 프로그램CPU의 기계어 프로그램

주소주소 지정지정 방식방식주소주소 지정지정 방식방식

주소지정방식(addressing mode)주소지정방식(addressing mode)

CPU 명령이 처리할 데이터가 저장되어있는 소스나 처리결과를 저장할 목적지를있 나 처리 과 저장 목적지지정하는 방식

유효주소(Effective Addess) 계산 방식이유효주소(Effective Addess) 계산 방식이필요

주소주소 지정지정 방식방식주소주소 지정지정 방식방식

데이터데이터 전송과전송과 관련된관련된 주소주소 지정지정 방식방식

주소지정방식 종류주소지정방식 종류

이미디어트 주소지정 방식이미디어트 주소지정 방식

immediate addressing mode

직접 주소지정 방식

direct addressing mode

간접 주소지정 방식

indirect addressing modeindirect addressing mode

레지스터 사용

레지스터 주소지정 방식레지스터 주소지정 방식

register addressing mode

이미디어트 주소지정 방식이미디어트 주소지정 방식

MOV A,#12HA ← 12H

74 12

A 1 H

ADD A #34HADD A,#34HA ← A + 34H

24 34

MOV DPTR #1234HMOV DPTR,#1234HDPTR ← 1234H

90 12 34

이미디어트 주소지정 방식 특징이미디어트 주소지정 방식 특징

오퍼랜드가 명령 코드중에 상수값으로 포함되어 있는 방식되어 있 방식

이미디어트 데이터의 앞에는 반드시 #기호를 사용한다호를 사용한다.

이미디어트 데이터는 DPTR을 제외하고는 항상 8비트이다.

직접 주소지정 방식직접 주소지정 방식

MOV A,50HA ←M[50H]

E5 50

A M[50H]

ADD A,52H 25 52

A ← A + M[52H]

직접 주소지정 방식 특징직접 주소지정 방식 특징

데이터가 저장된 메모리의 8 비트 주소를직접 지정하는 방식직 지정하 방식

내부 데이터 메모리의 하위 128바이트(00H 7FH)나 SFR을 액세스할 때 사용(00H∼7FH)나 SFR을 액세스할 때 사용

명령에서 오퍼랜드가 8비트 번지로 표현되므로 기계어 코드가 짧아지고, 명령의실행 속도가 빠르다실행 속도가 빠르다.

간접 주소지정 방식간접 주소지정 방식

MOV A @R0 E6MOV A,@R0A ← (R0) : 내부 데이터 메모리

E6

ADD A,@R1A ← A + (R1) : 내부 데이터

27

메모리

MOVX A,@R0 E2

A ← (R0) : 외부 데이터 메모리(8비트 어드레스)

E0MOVX A,@DPTR

A ← (DPTR) : 외부 데이터메모리(16비트 어드레스)

E0

( )

간접 주소지정 방식 특징간접 주소지정 방식 특징

오퍼랜드의 주소를 저장하고 있는 레지스터를오퍼랜드의 주소를 저장하고 있는 레지스터를이용하여 오퍼랜드를 간접적으로 지정하는 방식식간접 주소지정을 나타내는 레지스터의 앞에 @기호를 붙인다.내부 데이터 메모리나 외부 데이터 메모리를 액세스하는데 모두 사용레지스터로서 R0, R1이나 스택 포인터를 사용하면 오퍼랜드를 가리키는 번지가 8비트로 표현현DPTR을 사용하면 오퍼런드를 가리키는 번지

가 16비트로 표현가 16비트로 표현

레지스터 주소지정 방식레지스터 주소지정 방식

MOV A,R0A ← R0

E8

xxxxx rrrA R0 xxxxx rrr

ADD A,R7 2F

A ← A + R7

베이스 인덱스 주소지정 방식베이스 인덱스 주소지정 방식

MOVC A, @A+PC A <- M[A+PC]

83

A M[A PC]

MOVC A, @A+DPTRA < M[A DPTR]

93A <- M[A+DPTR]

DPTR A

주소

데이터

데이터 메모리

베이스 인덱스 주소지정 방식베이스 인덱스 주소지정 방식

Based indexed addresing mode

EA = (base register) + (index register)EA (base register) + (index register)base register: DTPR, PC

i d i t Aindex register: A

외부 프로그램 메모리에 저장된 탐색표(lookup table) 참조 시 이용

주소주소 지정지정 방식방식주소주소 지정지정 방식방식

점프점프 명령과명령과 관련된관련된 주소주소 지정지정 방식방식

C에서 점프 예C에서 점프 예

C에서는 대표적으로 goto 사용

void main(){int cnt;

scanf (“%d”, &cnt);if (cnt > 10)

t Ski Addgoto Skip_Add;cnt += 10;

Skip Add:Skip_Add:printf(“cnt = %d₩n”, cnt);

}}

상대 주소지정 방식상대 주소지정 방식

SJMP 08Hshort jump

SJMP 명령의 주소가 100H인 경우 분기되는 주소는?TargetAddress = 0102H(PC) + 08H = 010AH

0100 SJMP 08H0102 ……… <- PC

……..

010A MOV A,#10

상대 주소지정 방식상대 주소지정 방식

Relative addressing mode

지금부터의 주소지정방식은 분기명령과지금부터의 주소지정방식은 분기명령과밀접한 관계

A C 8 bi i d ffEA = PC + 8 bit signed offset-128 ~ +127 범위 분기/지정

절대 주소지정 방식절대 주소지정 방식

Absolute addressing mode

11 비트의 절대주소 지정PC0-10 <= absolute address

PC의 나머지 5비트(11-15)는 변경되지 않음

AJMP addrAJMP addrAbsoulute jump

Addr10-8 10101 Addr7-0

절대 주소지정 방식절대 주소지정 방식

AJMP 0123H=> 3523H001 10101 0010 0011

AJMP의 주소가 8000H일때 분기되는 주소는?PC0-10 <- 123H

8123H 번지로 분기

롱 주소지정 방식롱 주소지정 방식

long addressing mode

분기할 번지를 16비트 절대값으로 표현PC <= absolute address

예예LJMP 9000H ; long jump

9000H 번지로 분기9000H 번지로 분기

02 90 0002 90 00

CPU의 기계어 프로그램CPU의 기계어 프로그램

데이터데이터 전송명령전송명령데이터데이터 전송명령전송명령

데이터 전송 명령 - MOV데이터 전송 명령 MOV

MOVMOV8비트 데이터 전송 (내부 RAM과 SFR)

MOV A, RnMOV A, directMOV A, @RiMOV A, #dataMOV Rn AMOV Rn, AMOV Rn, directMOV Rn, #dataMOV direct, AMOV direct, RnMOV direct, directMOV direct, @RiMOV direct #dataMOV direct, #dataMOV @Ri, AMOV @Ri, directMOV @Ri, #data

MOV의 예MOV의 예

MOV A #12HMOV A,#12H

MOV A,R0

MOV R0,A

MOV A @12HMOV A,@12H

MOV A,@R0

@MOV @R1,A

MOV DPTR, A

MOV R0 R2MOV R0, R2

MOVMOV

1비트 전송 - CY 플래그에MOV C,bitMOV C,bit

MOV bit,C

DPTR을 사용한 16비트 전송MOV DPTR, #data

MOVX – 외부 데이터 메모리MOVX 외부 데이터 메모리

A 레지스터와 외부 메모리와의

데이터 전송데이터 전송

MOVX A, @Ri

MOVX A, @DPTR

MOVX @Ri, A

MOVX @DPTR AMOVX @DPTR, A

MOVC – 프로그램 메모리MOVC 프로그램 메모리

Move Code Byte

프로그램 메모리로 부터 프로그램 코드프로그램 메모리로 부터 프로그램 코드전송

인덱스 주소 방식 만 가능인덱스 주소 방식 만 가능

MOVC A, @A+DPTR

MOVC A @A+PCMOVC A, @A+PC

PUSH / POPPUSH / POP

스택( t k)에 데이터 전송스택(stack)에 데이터 전송내부 메모리를 사용하고 직접주소 방식

PUSH DPL ; DPTR -> 스택PUSH DPHPUSH DPHPUSH A ; A 레지스터 저장

POP APOP DPHPOP DPHPOP DPL

PUSHPUSH

기계어 데이터를 넣으려면 PUSH 명령을 사용기계어 데이터를 넣으려면 PUSH 명령을 사용

MOV SP #5FHMOV A,#10PUSH A

PUSH A 실행 과정

주소

MOV SP,#5FH

SP

PUSH APUSH A 실행 과정

주소주소

5F 5F

60

주소SP

60

SP

60

SP5F

6010

5F

60

주소

62

6162

61

62

61

A

내부메모리

2. SP가 가리키는1. SP가 1이 자동증가

10

A

2. SP가 가리키는주소에 A=10을 넣는다.

POPPOP

기계어 데이터를 꺼내려면 POP 명령을 사용기계어 데이터를 꺼내려면 POP 명령을 사용

POP A 실행 과정

읽기

POP APOP A 실행 과정

주소

60 60

SP 5F

10

주소

60 60

SP 5F

10

주소

5F

SP

5F

60

62

61

6010 60

62

61

6010

62

61

6010

10

A 레지스터

2. SP을 1 감소 한다.

62

1. SP에서 읽어A에 저장 한다.

XCHXCH

A레지스터와 바이트 데이터 교환XCH A, RnXCH A, Rn

XCH A, direct

XCH A @RiXCH A, @Ri

XCH A, R0

R0

23H 56H

A R0

실행전

56H 23H실행후

XCHDXCHD

하위 4비트 만 데이터 교환XCH A, @RiXCH A, @Ri

XCH A @R0XCH A, @R0

R0

23H

23H 56H

A

23H 주소실행전

26H 53H실행후

CPU의 기계어 프로그램CPU의 기계어 프로그램

산술산술 연산연산 명령명령산술산술 연산연산 명령명령

Arithmetic Operations (산술 연산 명령어)

11Acc에 Ri가 가리키는 번지의 값을 더함A, @Ri

12Acc에 direct 번지의 값을 더함A, direct

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

ADD

Arithmetic Operations (산술 연산 명령어)

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

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

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

ADDC

12Acc에 data(상수) 값을 더함A, #data

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

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

SUBB

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

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

11레지스터 Rn의 값을 1 증가Rn

11Acc의 값을 1 증가A

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

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

11Acc의 값을 1 감소A

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

12direct 번지의 값을 1 증가direct

11레지스터 Rn의 값을 1 증가RnINC

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

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

12direct 번지의 값을 1 감소direct

11레지스터 Rn의 값을 1 감소RnDEC

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

41A&#8274;B를하여 A레지스터에 몫, B레지스터에 나머지 저장ABDIV

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

연산 명령의 종류연산 명령의 종류

더하기ADD : A+operand -> A 더하기

ADDC : A+operand+CY 플래그 -> Ap 래

SUBB : A – operand – CY -> A

MUL AB : A x B > A:BMUL AB : A x B -> A:B

DIV AB : A / B -> A=몫, B=나머지

INC : 1증가 - INC A : A+1 -> A

DEC : 1 감소 – DEC A : A-1->ADEC : 1 감소 DEC A : A 1 >A

DA : BCD 조작

ADD/ADDC/SUBB 덧셈/뺄셈ADD/ADDC/SUBB 덧셈/뺄셈

ADD A,#32H : A + 32H -> A

ADDC A #32H : A + 32H +CY -> AADDC A,#32H : A + 32H +CY > A

SUBB A,#32H : A – 32H – CY -> A

MOV A,#5 ; 5ADD A #0FEH ; 5 + (-3) -> AADD A,#0FEH ; 5 + (-3) -> A

5 0000 0101+ (-3) 1111 1101

2 110000 0010

CY AC OV P(Even)

1 1 0 0

ADDC / SUBBADDC / SUBB

ADDC A,50H : A +(50H) + CY -> A

A 55A 55(50H) 4E

A A4A41010 01001010 0100

CY AC OV P(Odd)

0 1 1 1

1010 01001010 0100

SUBB A,@R0 : A -@R0 - CY -> AA 53

(50H) 37CY 1A 1B1B

CY AC OV P

0 1 0 0A 110001 10110001 1011

0 1 0 0

16비트 더하기 예16비트 더하기 예

int a;int a;a = 0x1E44;a += 0x56CA;

CLR C ; CY 지우고MOV A, #44H ; 8비트 44+CAADD A, #CAHMOV R1, A ; 결과값 0EH을 R1에, 현재 CY = 1.MOV A, #1EH ; 상위 8비트 1E+56+CYMOV A, #1 H 상위 8비 1 56 CYADDC A, #56HMOV R2, A ; 상위 바이트 결과값 75H -> R2에 저장

결과 750EH은 R2:R1에 저장

BCD 더하기 – DA 사용BCD 더하기 DA 사용

34d + 49d -> 83d

CLR C ; CY flag 지우기

MOV A, #34H ; A에 34 저장

ADD A, #49H ; A와 49 더하기.,

; ADD 결과 A = 7DH

DA A ; 10진수 결과를 얻기 위해DA A ; 10진수 결과를 얻기 위해

A = 83H1 결과 9보다 클 경우 +61. 결과 9보다 클 경우 +62. CY = 1 : 상위 +6

AC = 1 : 하위 +6

MUL 곱셈MUL 곱셈

MUL ABAxB => B(상위 8비트) : A(하위8비트)Ax (상위 8비 ) A(하위8비 )

255넘으면 OV=1

MOV A,#31H

MOV B,#10H

MUL A,B

03H 10H

B A

03H 10H

DIV 나눗셈DIV 나눗셈

DIV ABA÷B => A(몫) B(나머지)A A(몫) (나머지)

B=0, OV=1 : 결과 보증할 수 없다.

MOV A,#118

MOV B,#5

DIV A,B

23 3

A B

OV=023 3 OV 0

CPU의 기계어 프로그램CPU의 기계어 프로그램

논리논리 연산연산 명령명령논리논리 연산연산 명령명령

ANL/ORL - AND와 ORANL/ORL AND와 OR

AND 명령 OR 명령

ANL A, Rn ORL A, Rn

AND 명령 OR 명령

ANL A, direct

ANL A, @Ri

ORL A, direct

ORL A, @RiANL A, @Ri

ANL A, #data

ANL direct A

, @

ORL A, #data

ORL direct AANL direct, A

ANL direct, #data

ORL direct, A

ORL direct, #data

ANL C, bit

ANL C /bi

ORL C, bit

ORL C /bitANL C, /bit ORL C, /bit

ANL/ORL 예ANL/ORL 예

ANL A #00001000BANL A,#00001000B

MOV A,#01110111B

ANL A,#00001000B

실행후 A 00000000B

MOV A,#01110111B

ORL A #00001000BORL A,#00001000B

실행후 A 01111111B

XRL - XOR연산XRL XOR연산

XRL A,@R0

실행전

A : 10010001B

@R0 : 11100011B@R0 : 11100011B

실행후 A : 01110010B

CLR (Clear) / CPL (1의 보수)CLR (Clear) / CPL (1의 보수)

CLR A : A 레지스터를 0으로 지운다.

CPL A : A레지스터의 값을 보수 연산

2의 보수 예2의 보수 예

CPL A ; 1의 보수

INC A ; 1의 보수 + 1

로테이트 명령로테이트 명령

RR : 오른쪽으로 1비트 쉬프트 한다.

→ 1111 1101 →

RL : 왼쪽으로 1비트 쉬프트 한다RL : 왼쪽으로 1비트 쉬프트 한다.

← 1111 1101 ←

로테이션 명령에서 carry와 함께로테이션 명령에서 carry와 함께

RRC A : RRC (Rotate Right with Carry)

→ 1111 1101 → C → C=1A레지스터

RLC A : RLC (Rotate Left with Carry)RLC A : RLC (Rotate Left with Carry)

A레지스터

← C ← 1111 1101 ← C=0

1111 1010실행후 C=1

CPU의 기계어 프로그램CPU의 기계어 프로그램

비트비트 조작조작 명령명령비트비트 조작조작 명령명령

CLR – 비트 & CY 지우기CLR 비트 & CY 지우기

CLR P1.1 Port 1의 1비트를 지운다.Port 1의 1비 를 지운다.

CLR C CY 플래그를 지운다CLR C – CY 플래그를 지운다.

SETBSETB

SETB A.2A레지스터의 3번째 비트를 지운다.A레지 터의 3번째 비 를 지운다.

SETB CSETB CCY 플래그를 지운다.

CPU의 기계어 프로그램CPU의 기계어 프로그램

프로그램프로그램 실행실행 위치위치 제어제어 명령명령프로그램프로그램 실행실행 위치위치 제어제어 명령명령

점프 명령점프 명령

무조건 점프(U diti l B h)무조건 점프(Unconditional Branch)ajmp addr11 ; 절대 번지로 점프ljmp addr16 ; 절대번지(16비트) 점프 - long jumpsjmp rel ; 상대번지 점프 - short jumpjmp @A+DPTR ; 간접번지 지정 점프

조건 점프(Conditional branch)조건 점프(Conditional branch)jz, jnz rel ; 상대 주소로 점프 -short conditionaldjnz rel ; 감소 후 0이면 점프cjne rel ; 비교 후 같지 않으면 점프cjne rel ; 비교 후 같지 않으면 점프

Subroutine Callacall addr11 ; 절대번지(11비트) 서브루틴 콜lcall addr16 ; long 절대번지 서브루틴 콜(Subroutine Call)ret ; 서브루틴으로 부터 복귀 (return)reti ; 인터럽트 처리 후 복귀

프로그램 실행 위치 제어 명령프로그램 실행 위치 제어 명령

무조건무조건 점프점프 명령명령무조건무조건 점프점프 명령명령

ajmp addr11 ljmp addr16ljmp addr16sjmp rel jmp @A+DPTR

AJMP – 절대번지(11비트) 점프AJMP 절대번지(11비트) 점프

11비트로 번지 표현 (점프 영역 2Kbyte 범위)나머지 상위 5비트(A[15:11])는 그대로 유지

2바이트 명령어로 표현

A[15:11] A[10:0]

Addr10-8 10101 Addr7-0

PC

명령어 2바이트

A[15:11] A[10:0]PC

A[15:11] A[10:8] A[7:0]점프 주소16비트16비

PC

LJMP – Long JumpLJMP Long Jump

점프할 주소 16비트 사용(64K byte 범위)

3바이트 명령어 (2바이트 주소)3바이트 명령어 (2바이트 주소)

LJMP 점프주소 상위 점프주소 하위

[ ]PC A[15:0]

JMP – 절대 번지 점프JMP 절대 번지 점프

JMP addr16LJMP와 같이 16비트 주소로 점프JMP와 같이 16비 주 점

JMP 0030H – 0030H 번지로 점프

JMP @A + DPTR – Indirect Jump

점프 주소 = DPTR + A레지스터 값

SJMP – Short JumpSJMP Short Jump

8비트 부호 옵셋트 상대 주소8비트 부호 옵셋트 상대 주소

(8bit signed offset relative)

2바이트 명령어

주소 값은 PC와 상대 주소값을 더 한다.

예) SJMP 0FEH 다음 명령이 PC가 0015H에 있다면

PC 0015

상대주소 FFFE

점프할 주소 0013

SJMP 어셈블리 예SJMP 어셈블리 예

LOOP2:

MOV R7,#50,

. . .

80E2 SJMP LOOP2 ; PC+FFE2 >PC80E2 SJMP LOOP2 ; PC+FFE2->PC

80FE SJMP $

* $ : PC+FFFE -> PC* $ : PC+FFFE > PC

대기 계속 같은 명령 수행

프로그램 실행 위치 제어 명령프로그램 실행 위치 제어 명령

조건조건 점프점프 명령명령조건조건 점프점프 명령명령

JZ/JNZ relDJNZ relDJNZ relJC / JNC relCJNE rel

조건 점프 명령조건 점프 명령

일때점JZ A=0 일때점프JNZ A !=0 일때점프DJNZ 감소후, A !=0 일때점프CJNE A,byte A != byte 일때점프, y y 일때점

CJNE reg,#data byte != #data 일때점프JC CY=1일때점프JC CY=1 일때점프JNC CY=0 일때점프

일때점JB Bit = 1 일때점프JNB Bit = 0 일때점프JBC Bit = 1 일때점프후, 비트클리어(clear)

jz jnzjz, jnz

Z(zero) : A 레지스터 값이 0 인가?

JZ : A 레지스터 값이 0이면 점프 한다JZ : A 레지스터 값이 0이면 점프 한다.2바이트 명령

주소는 SJMP와 같이 8비트 상대 주소주소는 SJMP와 같이 8비트 상대 주소

현재 PC에서 -128 ~ 127 번지 내에서 점프

JNZ : A 레지스터 값이 0이 아닐 때 점프한다한다.

JC / JNC – 캐리JC / JNC 캐리

캐리플래그(CY)의 값에 따라 점프 결정

JC : 만약 CY=1이면 점프JC : 만약 CY 1이면 점프

JNC : 만약 CY=0이면 점프2바이트 명령

주소는 SJMP/JZ/JNZ와 같이 8비트 상대 주소

현재 PC에서 -128 ~ 127 번지 내에서 점프현재 PC에서 1 8 1 7 번지 내에서 점

CJNE relCJNE rel

두 값을 비교 후, 값이 같지 않으면 점프

NE : Not Equal – 같지 않으면NE : Not Equal 같지 않으면

cjne A, direct, rel

cjne Rn, #data, rel

cjne @Rn #data relcjne @Rn, #data, rel

CJNE A 20H LOOPCJNE A, 20H, LOOP CJNE A,#10,LOOPCJNE R0,#10,LOOPCJNE R0,#10,LOOPCJNE @R0,#10,LOOP

JB / JNB / JBCJB / JNB / JBC

JB 정의된 플래그의 비트가 1이면 점프JB : 정의된 플래그의 비트가 1이면 점프

JNB : 정의된 플래그의 비트가 0이면 점프(예)

* JB F0,LOOPEND – F0플래그가 1이면 점프

JNB F0 $ F0가 1일때 까지 이 명령 실해 대기 할* JNB F0,$ - F0가 1일때 까지 이 명령 실해 – 대기 할때

* JB ACC.2,LOOP – A레지스터의 3번째 비트가 1이면 JB ACC.2,LOOP A레지스터의 3번째 비트가 1이면점프

JBC : 사용자 플래그가 1이면 점프하고, 그비트를 클리어 한다.

DJNZ – 반복 루프를 구성할 때DJNZ 반복 루프를 구성할 때

1을 감소하고 0이 아니면 점프1을 감소하고, 0이 아니면 점프

DJNZ Rn, rel

DJNZ direct, relMOV DPTR #2010HMOV DPTR,#2010HCLR AMOV R0,AMOV R4,#5

LOOP:MOV A @DPTRMOV A,@DPTRADD A,R0MOV R0 AMOV R0,AINC DPTRDJNZ R4,LOOP

프로그램 실행 위치 제어 명령프로그램 실행 위치 제어 명령

서브루틴서브루틴 콜콜 명령명령서브루틴서브루틴 콜콜 명령명령

ACALL addr11 LCALL addr16LCALL addr16RET

ACALL addr11ACALL addr11

2바이트 명령

2K 바이트 내의 서브루틴 호출 가능2K 바이트 내의 서브루틴 호출 가능

스택에 복귀 주소 저장하고

RET 복귀 명령에 의해 스택에 저장된

주소값 사용하여 복귀 한다주소값 사용하여 복귀 한다.

주소값 결정 방식은 AJMP와 같음.

LCALL addr16 – Long CallLCALL addr16 Long Call

3바이트 명령 (2바이트는 주소값)

64K 바이트 내의 서브루틴 호출64K 바이트 내의 서브루틴 호출

스택에 다음 복귀 주소 PC 값을 저장하고

RET 명령에 의해 스택에서 PC 값 복귀한다.한다.

RET – 서브루틴 복귀 명령RET 서브루틴 복귀 명령

Call 명령에 의해 서브루틴 실행이 끝나면 CALL 다음 명령으로 복귀 한다.다 명령 복귀 다

Call 명령에 위해 스택에 저장된 복귀주소 PC 값을 스택에서 읽어 PC에 저장하소 PC 값을 스택에서 읽어 PC에 저장하여 call 다음 명령으로 복귀 실행

프로그램 실행 위치 제어 명령프로그램 실행 위치 제어 명령

기타기타 명령명령기타기타 명령명령

NOP

NOPNOP

명령은 가 어떤 조작도 하지 않NOP 명령은 CPU가 어떤 조작도 하지 않고 다음 명령을 읽어 실행을 계속 한다.

이것도 기계어 명령이기 때문에 PC 값은자동으로 1증가 한다.자동 1증가 한다.

약간의 짧은 시간지연이 필요할 때 사용할 수 있다할 수 있다.

시스템의 특정 부분의 안정되는데 시간이필요하다면 이 명령으로 짧은 시간을 지필요하다면, 이 명령으로 짧은 시간을 지연 시킬 수 있다.

CPU의 기계어 프로그램CPU의 기계어 프로그램

의사의사 명령명령

의사명령어(Pseudo Code)의사명령어(Pseudo Code)

기계어로 번역되지 않음

어셈블러에게 정보만 제공어셈블러에게 정보만 제공

프로그램 작성을 편리하게 도우는 기능

의사명령어의사명령어

ORG (origin) : 프로그램이 위치할 주소값

EQU (equate) : 특정값의 정의qC의 define과 유사. 데이터 및 주소값 지정 가능

DB (define byte) : 특정 데이터 값의 정의DB (define byte) 특정 데이터 값의 정의

DW (define word) : 특정 데이터 값의 정의

DS (d fi t ) : 특정 데이터 값의 정의DS (define storage) : 특정 데이터 값의 정의

BIT (bit) : 비트 변수의 정의

END (assemble end) : 프로그램의 끝 표시

ORGORG

프로그램 또는 데이터의 시작번지 지정

예)

ORG 00H

MOV A #0F3HMOV A,#0F3H

MOV명령 부터 프로그램 영역의 00번지 부터 시작

EQUEQU

수치 값을 레이블에 할당

수치 대신 의미있는 문자기호를 사용가능수치 대신 의미있는 문자기호를 사용가능

예)

NEXT EQU 20HNEXT EQU 20H

BUF EQU 10110100B

DBDB

메모리에 숫자 또는 문자를

저장하고자 할때저장하고자 할때

데이터 메모리

예)ORG 1000H 1000 11

데이터 메모리

ORG 1000HDB 11H, 22H, 33H

1000

1001

1002

11

22

33

DBDB

메모리에 문자를 저장하는 예

데이터 메모리

예)ORG 1000H 1000 41

데이터 메모리

ORG 1000HDB ‘ABC’

1000

1001

1002

41

42

43

DWDW

메모리에 문자를 저장하는 예

데이터 메모리

예)ORG 1000H 1000 01

데이터 메모리

ORG 1000HDW 0102H, 0304H

1000

1001

1002

01

02

03

1003 041003 04

DSDS

메모리에 숫자 또는 문자를 저장할 공간을 확보 하고자 할 때공 확 하 자 때

예) 데이터 메모리)ORG 1000H

BUFFER EQU $ 1000 ?

데이터 메모리

DS 04H1000

1001

1002

?

?

?

1003 ?1003 ?

• $ : 현재의 위치• 내용에 대해서는 정해지지 않음내용에 대해서는 정해지지 않음• 고급언어의 배열 확보와 유사

BITBIT

특정BIT의 주소를 정의하는 데 사용

예)

COUNT BIT 38H

또는또는

COUNT BIT 27H.1

ENDEND

어셈블러에게 번역을 끝낼 것을 지시

번역하고자 하는 마지막 부분에 기록번역하고자 하는 마지막 부분에 기록

END이후의 명령은 번역되지 않음

프로그램의 끝이 아닌 어셈블리의 끝을지시지시

ASM 예ASM 예

; 파일 이름 : BOOL A51; 파일 이름 : BOOL.A51 SELECT EQU 0FC48H ; I/O 실험 선택 어드레스IO_SEL EQU 10011110B ; I/O 실험 선택 값

ORG 0SJMP START 메인 프로그램으로 점프SJMP START ; 메인 프로그램으로 점프; 메인 프로그램 시작

ORG 0030HSTART: MOV SP,#60H ; 스택 지정

MOV A,#IO_SEL ; 그림 4-2의 U15 선택 값MOV DPTR,#SELECT ; 그림 4-2의 U15 어드레스MOVX @DPTR A 그림 4 2의 U15 선택MOVX @DPTR,A ; 그림 4-2의 U15 선택

ASM 예ASM 예

LP1:LP1:; (P14 XOR P15) AND P16MOV C 0MOV C,0ANL C,P1.6; (P14 XOR P15) AND P16 + (P14 AND P15)ORL C,1MOV P1.0,C ; 출력SJMP LP1 ; 무한 루프SJMP LP1 ; 무한 루프

ENDEND

CPU의 기계어 프로그램CPU의 기계어 프로그램

끝끝끝끝

top related