제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10....

28
제2편 8051 시스템 구조 제2장. 8051 Instruction Se 8051 명령어 구조 1. 8051 명령어 관계

Transcript of 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10....

Page 1: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

1

제2편 8051 시스템 구조

제2장. 8051 Instruction Set

8051 명령어 구조

1. 8051 명령어 관계

Page 2: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

2

명령어 사용법: 오퍼런드는 최대 3개 까지 가능

2. 8051명령어 구조

니모닉 [오퍼런드1], [오퍼런드2], [오퍼런드3 ]

ex) CJNE @R0, #1, Next

명령어의 숫자 사용

Arithmetic Instructions : 수치연산 명령INC, DEC, MUL, DIV

Logical Instructions : 논리연산 명령ANL, ORL, XRL, CLR, CPL, RL, RLC, RR, RRC, SWP

Data Transfer Instructions : 데이터 전송 명령MOV, MOVX, MOVX

Boolean Instructions : 비트 제어 명령CLR, SETB, CPL, ANL, ORL, MOV

Branch Instructions : 프로그램 제어 명령AJMP, LJMP, SJMP, JMP, JZ, JNZ, CJNE, DJNZ, JC, JNC, JBJNB, JBC, ACALL, LCALL, RET, RETI, PUSH, POP, NOP

3. 8051명령어 종류

Page 3: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

3

데이터를 지정하기 위한 어드레스 지정 방법을 어드레싱 모드라 함

Immediate Constant Mode : 전송하고자 하는 데이터를 지정할 때 메모리 데이터의 어드레스를 지정하지 않고 사용하고자 하는 실제 데이터를 직접 지정하는 모드이다.즉 명령어 내에 데이터가 포함되는 모드이다. '#숫자' 형태로 표시한다.- Ex) ADD A, #127 ; 127과 ACC를 더해 ACC에 저장한다.

; 127이라는 숫자를 직접 지정하여 명령어에 포함시킴; #127이 직접 데이터 지정방식

Direct Addressing Mode :전송하고자 하는 데이터나 목적지의 어드레스를 직접 지정하는 어드레싱모드이다. 어드레스를 그냥 숫자로 표기한다. -Ex) ADD A, 7FH ; 7FH번지에 저장된 데이터와 ACC값을 더해 ACC에 저장한다.

; 여기서 어드레스 7FH는 연산 데이터를 지정하기 위해 어드레; 스를 직접 지정한 번지가 된다.

4. 8051 명령어 데이터 지정 방법1

Indirect Addressing Mode :PSW에 의해 선택된 범용레지스터의 R0와 R1 그리고 외부 데이터 메모리엑세스 시 사용하는 DPTR을 이용한 데이터의 어드레스를 지정방법으로 읽거나 전송하고자 하는 어드레스를 R0, R1, DPTR에 저장하고 이 레지스터를지정하면 R0, R1, DPTR에 저장된 내용이 곧 엑세스하고자 하는 데이터의어드레스가 되는 간접 어드레스 지정 방식이다. 즉 C언어에서 데이터 포인터라생각하면 된다. '@어드레스' 형태로 표기한다. -Ex) MOV R0, #127 ; R0에 127을 전송하라는 명령, Immediate Addressing(#127).

ADD A, @R0 ; R0의 데이터 127이 지시하는 번지의 내용과 ACC를 더해 ACC에

; 저장한다. 즉 127번지 내의 데이터와 ACC를 더해 ACC에 저장한; 다는 것이다. C언의 포인터와 비교하면 R0가 포인터이고 @R0는; 포인터가 가리키는 데이터 값이다.

Indexed Addressing Mode : 프로그램 메모리로부터 이미 작성된 고정데이터(ex. Lookup Table)를 효율적으로 읽기 위한 어드레싱 모드로서 특정번지로부터 인덱스 레지스터에 저장된오프셋의 데이터를 쉽게 읽을 수 있도록 한다. 표기방법은 '@A+DPTR'이나'@A+PC' 형태이다.

5. 8051 명령어 데이터 지정 방법2

Page 4: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

4

-Ex) MOV A, #27H ; Immediate Addressing(#27H). MOV DPTR, #1000H ; Immediate Addressing(#1000H). MOVC A, @A+DPTR ; 작성된 고정데이터가 위치한 번지가 1000H라 가정할 때

; 그로부터 오프셋 27H인 1027H 번지의 데이터를 ACC에; 읽어오는 명령이다.

Register Instruction Mode :8051의 내부 범용 레지스터 R0~R7의 정보를 명령어 내부에 포함하는 명령으로, PSW에 의해 선택된 뱅크(Bank)의 레지스터를 어드레싱하는 방식이다.범용 레지스터(R0~R7) 이름을 그대로 표기한다.

-Ex) MOV R7, A ; ACC의 값을 R1에 전송한다. 이 명령의 경우 R1을 가리키는 3비트; 정보를 MOV 명령어 코드에 내장하고 있다.

6. 8051 명령어 데이터 지정 방법3

데이터 전송 명령

7. 8051데이터 전송 명령

Page 5: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

5

8. 내부 데이터 전송 명령 MOV

형식 : MOV 목적지 어드레스, [소스 어드레스, 데이터]

동작 : 소스 어드레스의 데이터나 소스 데이터를 목적지에 전송한다. MOV 명령은오직 내부 데이터 메모리(IDATA or DATA)나 SFR의 데이터를 전송할 때 사용하는 명령어로서 ACC에 데이터를 전송하는 경우 PSW의 패리티(Parity)비트에 영향을 준다.

가능명령 : MOV A, [#data, @Ri, Rn, data addr]

MOV Rn, [A, #data, data addr] MOV @Ri, [A, #data, data addr] MOV data addr, [A, #data, @Ri, Rn, data addr] MOV DPTR, #word data

* 여기서 i는 0이나 1이고 n은 0-7이다. data는 1byte의 데이터이며, word data는 2byte의 데이터를 의미한다.또한 data addr은 Direct Addressing Mode의 데이터 지정을 의미한다. 참고로 위의 명령에서 보듯이MOV @R0, @R1; MOV R0, R7; MOV @R7, 16H; 형태의 명령은 불가능하다.

9. 내부 데이터 전송 명령 XCH

형식 : [XCH, XCHD] 오퍼런드1, 오퍼런드2

동작 : 오퍼런드1과 오퍼런드2의 데이터를 교환한다. XCH는 바이트별 교환명령이며 XCHD는 하위 디지트 교환 명령이다.

가능명령 : XCH A, [@Ri, Rn, data addr] XCHD A, @Ri

* 여기서 i는 0이나 1이고 n은 0-7이다. data addr은 Direct Addressing Mode의 데이터 지정을 의미한다

Page 6: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

6

XCH, XCHD 예제

10. XCH 예제

Ex) MOV A, #88HMOV R0, #27HMOV 27H, #FFH

XCH A, @R0 ; ACC의 내용 88H와 R0가 가리키는 27H번지의 내용 FFH를 교환

XCHD A, @R0 ; ACC의 하위 디지트 0FH와 27번지의 하위 디지트 8H를 교환

11. 8051 외부 메모리 데이터 전송 명령 MOVX

형식 : MOVX 목적지 어드레스, 소스 어드레스

동작 : XDATA 영역인 소스 어드레스의 데이터를 ACC에 전송하거나 ACC의값을 XDATA의 목적지 어드레스에 전송한다.

가능명령 : MOVX A, [@Ri, @DPTR]

MOVX [@Ri, @DPTR], A

* 여기서 i는 0이나 1이다. MOVX 명령은 오퍼런드로서 A, @R0, @DPTR만이 가능하다

Page 7: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

7

Example

mov dptr, #0a000h;

mov r0, #35h

mov a, #66h

movx @dptr, a

movx a, @r0

movx a, @dptr

12. 프로그램 메모리 데이터 읽기 명령 MOVC

형식 : MOVC A, [@A+DPTR, @A+PC]

동작 : 인덱스 어드레싱모드(Index Addressing Mode)에 의해 지시되는 프로그램 메모리의 데이터를 ACC로 읽어 들인다.

Ex) MOVC A, @A+PC ; 현제 PC(Program Counter)값이 1000H라면 여기서; 부터 오프셋 66H인 프로그램 메모리 1066H의 번지의; 데이터를 ACC로 읽어옴

Page 8: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

8

13. 산술 연산 명령 : FLAG 레지스터 PSW 1

CY(Carry Flag) 덧셈, 뺄셈을 위한 플래그(Flag)로 셈 후에 캐리(Carry)나 바로우(Barrow)가 발생하면CY 비트가 세트되어 캐리나 바로우의 발생여부를 나타냄

OV(Overflow Flag) 오버플로우(Overflow) 발생여부를 나타내는 플래그로서 덧셈에서는 결과가 8051의

감가산기가 나타낼 수 있는 -128에서 127까지의 범위를 넘는 경우 OV 비트를 세트하여 오버플로우 발생여부를 나타냄

범용 레지스터 뱅크 선택 제어 비트 RS1, RS0

14. 산술 연산 명령 : FLAG 레지스터 PSW 2

AC(Auxiliary Carry Flag)AC는 보조 캐리 비트로서 덧셈 시 비트3의 캐리 발생여부를 나타내는 플래그이다.뺄셈에서는 비트3의 빌림 수 발생 여부를 나타내는 플래그로 사용된다. 10진 보정명령에서도 AC 비트를 사용한다.

Page 9: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

9

15. 산술연산 명령

16. 데이터 증감, 곱셈 나눗셈 명령

형식 : DEC [A, Rn, @Ri, data addr] INC [A, Rn, @Ri, data addr, DPTR]

동작 : 오퍼런드가 지시하는 데이터를 1증가 시키거나 1 감소한다.

* 여기서 i는 0이나 1이고 n은 0-7이다. DEC DPTR의 명령은 없다. DEC DPL; DEC DPH는 가능하다.

형식 : MUL ABDIV AB

동작 : MUL은 ACC와 B 값을 곱해 상위 값은 ACC에 하위 값은 B에저장한다. DIV는 ACC의 값을 B로 나눈 후 몫은 ACC에 나머지는 B에 저장한다.

* 곱셈은 ACC와 B의 값을 부호 없는 수로 인식한다. 즉 0-255(0xFF)의 수로 생각하며 결과 값 ACC가 0xFF를 넘어서면 PSW의 OV 비트가 세트된다. 나눗셈에서는 제수(나누는 값)가 0인 경우 OV 비트를 세트 시킨다.

Page 10: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

10

Example

ACC(하위)B(상위)

B(나머지)ACC(몫)

MUL AB; ACC*B

DIV AB; ACC/B

mov a, #25h

mov b, #16h

mul ab; P=0, OV=1

div ab;OV=0, P=0

17. 덧셈 뺄셈 명령

형식 : ADD A, [#data, Rn, @Ri, data addr] ADDC A, [#data, Rn, @Ri, data addr] SUBB A, [#data, Rn, @Ri, data addr]

* i는 0 or 1이며 n은 0~7이다. SUB 명령은 없다. data addr은 직접 번지 지정에 의한 데이터 어드레스를 의미한다.

-Ex) ADD A, #1FH ; A= A +#1FH

실행 전 ACC : 75H CY AC OV P+ 1FH 1 0 0 0

실행 후 ACC : 94H 0 1 1 1

Page 11: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

11

• Given two binary digits (X,Y), a borrow in (Z) we get the following difference (S) and borrow (B):

• Borrow in (Z) of 0:

• Borrow in (Z) of 1:

Single Bit Binary Subtraction with Borrow

Z 1 1 1 1X 0 0 1 1

- Y -0 -1 -0 -1BS 11 1 0 0 0 1 1

Z 0 0 0 0X 0 0 1 1

- Y -0 -1 -0 -1BS 0 0 1 1 0 1 0 0

• Extending this to two multiple bit examples:Borrows 0 0

Minuend 10110 10110

Subtrahend - 10010 - 10011Difference

• Notes: The 0 is a Borrow-In to the least significant bit. If the Subtrahend > the Minuend, interchange and append a – to the result.

Multiple Bit Binary Subtraction

Page 12: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

12

18. 10진 보정 명령

형식 : DA A

동작 : 1) 덧셈 결과의 숫자가 A-F를 포함하는 경우 그 니블(Nibble)에

6을 더한다. 2) 덧셈 후 캐리가 1이면 상위 니블(Nibble)에 6을 더하고 보조

캐리가 1이 면 하위 니블에 6을 더한다. 3) DA 명령은 앞의 덧셈 명령의 캐리 값과 보조 캐리 값을 그대로

가져간다.

* 10진 보정 명령은 DA A; 명령만 존재한다. 이 10진 보정 명령은 ADD, ADDC 명령 실행 이후에만 정상적인실행 결과(뺄셈 등 기타 명령은 보장 불가)를 보장하며 ADD, ADDC의 오퍼런드 데이터가 0~9 이외의 A-F가포함된 경우 정상적인 실행 결과를 보장할 수 없다.

Ex) ADD A, 17H ; ACC와 17H의 데이터를 더한 후 ACC에 넣음DA A ; ACC의 내용을 10진 보정함

19. 10진 보정 명령 예제

Ex) ADD A, 17H ; ACC와 17H의 데이터를 더한 후 ACC에 넣음DA A ; ACC의 내용을 10진 보정함

20

0

0

15

0

0

17

1

0

70

0

1

86

1

1

27

0

0

ACC

AC

CY

DA A

명령 실행 후

BA

0

0

0F

0

0

11

1

0

10

0

1

20

1

1

27

0

0

ACC

AC

CY

ADD A,17H

실행 전

87

33

08

07

08

09

80

90

89

97

13

14

ACC

17H

ADD A,17H

실행 전

valuevaluevaluevaluevaluevalue레지스터명령실행

결과 값

Page 13: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

13

20. 논리연산 명령

21. 논리 연산 명령

형식 : [ANL, ORL, XRL] A, [#data, @Ri, Rn, data addr] [ANL, ORL, XRL] data addr, [A, #data] CLR A CPL A

•i는 0 or 1이고 n은 0-7이다

-Ex) CLR A ; ACC의 값을 클리어, ACC=0 CPL A ; ACC의 값에 1의 보수 취함, 참고로 0AH의 1의 보수는 F5H

ANL A, #1FH ; ACC의 값과 데이터 1FH를 각 비트별로 AND 연산하여; ACC에 저장한다.

ORL A, @R0 ; ACC의 값과 R0 내의 데이터가 가리키는 번지의 데이터; 값과 OR 연산하여 ACC에 저장한다.

XRL A, R5 ; ACC의 값과 R5의 값을 XOR 연산하여 ACC에 저장한다.

Page 14: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

14

22. ACC 로테이트 명령

형식 : RL A ; ACC의 값을 비트별로 좌로 시프트 한다.

RR A ; ACC의 값을 비트별로 좌로 시프트 한다.

SWAP A ; ACC의 값의 상위 니블과 하위 니블을 교환한다.

동작 : 로테이트 명령을 실행할 때마다 한번의 로테이트가 일어나며 C언어의 ‘>>,<<’ 연산자와 비슷하지만 Bit0이 Bit7로 또는 B7이 Bit0으로

로테이트 된다는 점이 다르다.

형식 : RLC A

RRC A

동작 : 로테이트 명령을 실행할 때마다 한번의 로테이트가 일어나며 CY 비트를 Bit0과 Bit7 사이에 연결하여 로테이트되는 것이 일반 로테이트명령과 다르다. 위의 예제에서 볼 수 있듯이 RRC 명령은 실행 이전의CY 값을 비트7에 넘겨주며 비트0 값을 새로운 CY의 데이터로 받아들이고 있다. 또한 RLC 명령은 명령 실행 전 CY비트 값을 비트0에 넘기고 비트7로부터 새로운 데이터를 받고 있다.

23. 불 대수 연산과 비트 엑세스 명령을 위한 메모리 공간

Page 15: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

15

24. 비트 엑세스 가능한 SFR과 그 비트 번지

비트별 엑세스가 가능한 메모리 공간의 데이터 연산 명령으로서 비트 제어명령과 비트 전송 명령이 있다.

25. 비트 엑세스 및 불대수 연산 명령

Page 16: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

16

26. 불 대수 연산 명령 ANL, ORL

형식 : ANL C, [bit addr, /bit addr] ORL C, [bit addr, /bit addr]

동작 : CY 비트와 뒤에 오는 오퍼런드 비트를 AND나 OR시켜 CY 비트에저장한다.

* bit addr은 대상 비트의 어드레스를 의미하고, /bit addr은 비트 어드레스의 데이터를 Not시켜 사용하는 것을의미한다.

-Ex) ANL C, 25H.3 ; PSW의 CY 비트와 내부메모리 25H번지 비트3의 값을 AND하; CY 비트에 넣음

ANL C, 2BH ; 앞 그림에서 25H번지 비트3의 비트 어드레스가 2BH이므로 앞; 예제와 동일한 동작을 함.

ANL C, 21H.5 ; 역시 ANL C, 0DH와 동일한 명령이다. ORL C, 07H ; 07번지의 비트 데이터와 CY 비트를 OR시켜 CY에 넣음

27. 비트 데이터 전송 및 제어 명령CPL, CLR, SETB, MOV

형식 : CPL [C, bit addr] CLR [C, bit addr] SETB [C, bit addr] MOV [C, bit addr], [bit addr, C]

* MOV bit addr, bit addr 명령은 불가능하다.

Ex) CPL C ; 명령 실행 전 CY가 0이면 1로, 1이면 0으로 반전CLR 23H.2 ; 23H.2(비트 어드레스 1AH 번지)의 비트 값을 클리어SETB P1.3 ; Port1.7(비트 어드레스 97H 번지 값)을 1로 세트MOV C, 23H.2 ; 23H.2(비트 어드레스 1AH 번지) 값을 CY 비트에 전송 저장MOV 23H.2, C ; CY비트 값을 23H.2(비트 1AH 번지)에 전송 저장

Page 17: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

17

28. 브렌치 명령1

29. 브렌치 명령 2

Page 18: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

18

30. 무조건 브렌치 명령 AJMP

형식 : AJMP code address from block base

동작 : PC에 2를 더한 값을 다시 PC에 넣고 오퍼런드 데이터를 PC10~ PC0에 넣는다.

* 위의 block base는 현제 (PC)+2를 한 어드레스를 2K(2048)로 나누었을 때 떨어지는 시작 어드레스를 의미한다. 즉 자동으로 증가된 PC 값(PC+2)의 비트0부터 비트10까지의 데이터를 0으로 했을 때의 PC값이된다. 아래의 예제에서는 1000H가 된다.

31. 무조건 브렌치 명령 AJMP 예제

Ex) AJMP 123H ; 동작은 다음과 같다.

Page 19: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

19

32. 무조건 브렌치 명령 LJMP, SJMP

형식 : LJMP code address SJMP Offset JMP @A+DPTR

동작 : LJMP는 오퍼런드인 'code address'가 가리키는 어드레스로 브렌치하고 SJMP는 현제 위치에서 Offset 크기만큼으로 브렌치한다. JMP 명령은 ACC의 값과 DPTR의 값을 더한 번지로 브렌치 한다.

* Offset은 -128~127까지의 부호 있는 8비트 데이터만이 가능하다. 결국 브렌치할 수 있는 한계영역이 현제 PC 값에 2를 더한 어드레스(PC+2)로부터 오프셋 -128~127이 된다.

33. LJMP 예제

Ex) LJMP 4000H ; 4000H번지로 브렌치 한다.; 세부 동작은 다음과 같다.

Page 20: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

20

34. SJMP 예제

Ex) SJMP 4000H ; SJMP는 상대 브렌치 명령이다.; 세부 동작은 다음과 같다.

35. 조건 브렌치 명령1

형식 :[JZ, JNZ] Rel : ACC가 0(JZ)이거나 0(JNZ)이 아니면 Rel 만큼 분기한다.

[JC, JNC] Rel : CY 비트가 1(JC)이거나 0(JNC)이면 Rel 만큼 분기한다.

[JB, JNB] Bit, Rel : Bit가 1(JB)이거나 0(JNB)이면 Rel 만큼 분기한다.

JBC Bit, Rel : Bit가 1이면 클리어하고 무조건 Rel 만큼 분기한다.

* Rel은 -128~~127의 부호 있는 바이트 단위의 숫자이며, 이는 자동 증가된 PC값으로부터 Offset의 의미를갖는 숫자이다.

* 프로그래머가 프로그램 작성 시 Rel 대신 레이블(Label)을 주로 사용한다. 주의 할 것은 그 레이블이 위치한코드의 어드레스가 -128~~127의 범위를 벗어나면 어셈블러는 에러를 띄우게 된다.

* JBC 명령은 무조건 분기 명령이다. 다만 지정된 비트가 1이면 클리어할 뿐이다.

Ex) JZ Next ; ACC가 0이면 Next로 브렌치한다. MOV R0, #98H ; JZ 명령 실행 시 ACC≠0이면 이 명령을 실행하게 된다.

:Next : MOV R0, #28H ; JZ 명령 실행 시 ACC=0이면 이 명령으로 분기하게 된다.

:

Page 21: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

21

36. 조건 브렌치 명령 예제

Ex) JZ Next ; ACC가 0이면 Next로 브렌치한다. MOV R0, #98H ; JZ 명령 실행 시 ACC≠0이면 이 명령을 실행하게 된다.

:Next : MOV R0, #28H ; JZ 명령 실행 시 ACC=0이면 이 명령으로 분기하게 된다.

:

Ex) JNZ Next ; ACC≠0이면 Next로 브렌치한다. MOV R0, #98H ; JNZ 명령 실행 시 AC=0이면 이 명령을 실행하게 된다.

:

Next : MOV R0, #28H ; JZ 명령 실행 시 ACC=0이면 이 명령으로 분기하게 된다. :

Ex) JNC Next ; CY=0이면 Next로 브렌치한다. MOV R0, #98H ; JNC명령 실행 시 CY=1이면 이 명령을 실행하게 된다.

:Next : MOV R0, #28H ; JNC명령 실행 시 CY=0이면 이 명령으로 분기하게 된다.

:

37. 조건 브렌치 명령 예제

Ex) JB 21H.7, Next ; 비트 21H.7이 1이면 Next로 브렌치한다. MOV R0, #98H ; JB 명령 실행 시 21H.7=0이면 이 명령을 실행하게 된다.

:Next : MOV R0, #28H ; JB명령 실행 시 21H.7=1이면 이 명령으로 분기하게 된다.

:

Ex) JBC 21H.7, Next ; 명령실행 시 21H.7=1이면 21H.7을 클리어시키고 Next로: ; 분기한다. 만약 27H.7=0이면 바로 Next로 분기한다.

Next: MOV R0, #28H :

Ex) JBC PSW.7, Next ; 명령실행 시 CY=1이면 CY(PSW.7)을 클리어시키고 Next : ; 로 분기한 다. 만약 P1.7=0이면 바로 Next로 분기한다.

Next: MOV R0, #28H :

Ex) JBC CY, Next ; 명령실행 시 CY=1이면 CY 비트를 클리어시키고 Next로 분기: ; 한다. 만약 CY=0이면 바로 Next로 분기한다.

Next: MOV R0, #28H :

Page 22: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

22

38. 조건 브렌치 명령2

형식 : DJNZ [Rn, data addr], RelCJNE A, [data addr, #data], RelCJNE [Rn, @Ri], #data, Rel

동작 : DJNZ는 첫 번째 오퍼런드에서 1을 뺀 후 결과가 0이면 다음 명령을 실행하고, 0이 아니면 Rel 크기만큼 분기한다. 뺄셈을 하지만 PSW의 플래그에는

영향을 주지 않는다.

CJNE 명령은 오퍼런드1과 오퍼런드2를 비교하여 같으면 CY를 0으로 세트하고 다음명령을 실행하며, 오퍼런드1<오퍼런드2이면 C에 1을 넣고 Rel 만큼 분기하고, 오퍼런드1>오퍼런드2 이면 CY에 0을 넣고 Rel 만큼 분기한다.이는 꼭 뺄셈과 비슷하지만 오퍼런드의 값은 변하지 않고 CY 비트에만 영향을 준다.

* Rel은 -128~127의 부호 있는 바이트 단위의 숫자이며, 이는 자동 증가된 PC값으로부터 Offset의 의미를 갖는 숫자이다. n은 0~7이며 i는 1 or 2이다.

* 프로그래머가 프로그램 작성 시 Rel 대신 LABEL을 사용한다. 주의 할 것은 그 LABEL이 위치한 코드의 어드레스가 -128~~127의 범위를 벗어나면 Assembler는 error를 띄우게 된다.

39. DJNZ, CJNE 예제

Ex) MOV R3, #07H ; R3에 7을 전송 저장Loop : INC A

:DJNZ R3, Loop ; DJNZ 명령을 사용하여 7바퀴의 루프 문을 만듦DEC A:

Ex) CJNE A, #12H, Next ; ACC = #12H이면 CY를 0으로 하고 다음명령 MOV를

MOV R3, #23H ; 실행하고 ACC<#12H이면 CY를 1로 세트하고 Next

: ; 로 분기한다. Next로 분기한 후 CY는 1이므로 결국: ; Next1로 분기하게 된다.

Next: MOV A, #28H ; 만약 ACC>#12H라면 CY를 0으로 클리어하고 NexJC Next1 ; 로 분기하므로 결국 Next2로 분기하게 된다. JNC Next2

:

Page 23: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

23

40. 함수 호출 명령 : 스택의 기능

41. 함수 호출 명령 : 8051 LIFO Stack 동작

Page 24: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

24

42. 스택 조작 명령 PUSH, POP

형식 : PUSH data addrPOP data addr

동작 : data addr의 데이터를 스택에 넣거나 읽어 들이는 동작을 한다.

PUSH는 SP를 1증가시킨 후 data addr의 데이터를 SP가 가리키는 어드레스에 쓰고, POP은 현제 SP가 가리키는 어드레스로부터 데이터를 읽어 data addr에 저장한 후 SP 값을 1 감소 시킨다.

* data addr은 직접번지(Direct Addressing Mode)지정을 의미하며 SFR의 경우 SFR의 이름을 사용해도 무방하다. Rn은 SFR이 아니므로 POP R7;과 같은 명령은 없으며 R7대신 POP 7H; 형식과 같이 직접번지를사용해야 한다.

* PUSH, POP의 오퍼런드는 직접 번지 지정(Direct Addressing Mode)을 사용하나 스택으로부터 데이터입출력을 위한 스택의 포인팅은 SP가 간접 번지 지정을 사용하므로 스택은 IDATA 영역이 된다.

43. 스택 조작 명령 PUSH 예제

PUSH 17H ; 17H의 데이터를 스택에 저장한다.

Page 25: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

25

POP ACC ; 현제 SP가 가리키는 스택 데이터를 ACC로 읽어 들인다.

44. 스택 조작 명령 POP 예제

45. 함수 호출 명령 ACALL

형식 : ACALL code address from block base

동작 : PC 값에 2를 더한 값을 다시 PC에 넣고 SP를 1증가 시킨 후PCL 값을 SP가 가리키는 스택에 저장한다. 다시 SP를 1증가

시키고 PCH 값을 현제 SP가 가리키는 스택에 저장한다. 다음은오퍼런드 데이터(code address)를 PC10~PC0에 세트하여 새로 로드된 PC가 가리키는 번지로 분기한다.

* 위의 block base는 현제 (PC)+2를 한 어드레스를 2K(2048)로 나누었을 때 떨어지는 시작 어드레스를 의미한다. 즉 자동으로 증가된 PC 값(기존 PC 값+2)의 비트0부터 비트10까지의 데이터를 0으로 했을 때의PC값이 된다. 아래의 예제에서는 1000H가 된다.

Page 26: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

26

Ex) ACALL 123H

46. ACALL 예제 : 스택 동작

명령 실행 시 스택의 동작

47. ACALL 예제 : 동작과정

앞 예제 의 동작 과정

Page 27: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

27

45. 함수 호출 명령 LCALL

형식 : LCALL code addr

동작 : 현재의 PC값에 3을 더한 값을 다시 PC에 넣고 PC의 값을 스택

에 저장한 다음 해당 어드레스(code addr)로 분기한다.

1) LCALL이 3바이트 명령이므로 PC의 값을 자동으로 3 증가시킨다.

2) SP의 값을 1증가 시킨 후 PCL 값을 SP가 가리키는 스택에 저장한다. 3) SP의 값을 다시 1증가 시킨 후 PCH 값을 SP가 가리키는 스택에 저장한다. 4) code addr 값을 PC에 넣어 해당 함수로 분기한다.

* 위의 code addr은 8051의 프로그램 메모리 전 영역 중 하나의 어드레스를 의미하는 것으로 이는 0H부터

0FFFFH(0~65535)의 값이 올 수 있다.

Ex) LCALL 4000H ; LCALL 명령을 실행 하지 않았을 경우 다음 실행할; 번지인 PC 값을 스택에 저장한(서브 루틴을 모두; 실행하고 되돌아올 위치) 후 4000H로 브렌치 한다.; (LCALL 명령이 1280 번지에 위치했다고 가정)

46. LCALL 명령 예제

Page 28: 제2장. 8051 Instruction Setcslee/uproc/2-2_commset2.pdf · 2011-06-20 · 6 xch, xchd 예제 10. xch 예제 ex) mov a, #88h mov r0, #27h mov 27h, #ffh xch a, @r0 ;acc의내용88h와r0가가리키는27h번지의내용ffh를교환

28

45. 함수 리턴 명령 RET와 인터럽트 서비스 루틴 리턴 명령

형식 : RET RETI

동작 : RET는 CALL 명령에 의해 스택에 저장했던 복귀할 PC 값을 스택으로부터 읽어 PC에 로드하는 함수(서브루틴) 복귀명령이다. RETI는 함수로부터 리턴하는 명령이긴 하나 인터럽트 서비스 함수(나중에 설명하지만 인터럽트 서비스 루틴)로부터 리턴 하는명령이다. 이는 인터럽트 서비스 함수로부터 리턴하는 것 뿐 아니라 8051로 하여금 인터럽트 수행이 종료되었음을 인식하도록 하는 동작을 동반한다.

1) 현제 SP가 가리키는 스택으로부터 데이터를 PCH에 읽어 들인다. 2) SP의 값을 1 감소시킨다. 3) SP가 가리키는 스택으로부터 데이터를 PCL에 읽어 들인다. 4) SP의 값을 1 감소시킨다.

5) 스택으로부터 새로 로드된 PC 값에 따라 브렌치한다.