8051 명령어 8051 명령어의이해 명령어종류 dolicom@naver.com http://blog.naver.com/dolicom
CPU 의기계어프로그램 8051 어셈블리언어
기계어 기계어 (Machine Language) CPU가직접이해할수있는언어 일련의0과 1로표시 실행할명령, 데이터, 기억장소의주소등포함 하드웨어가직접실행시킬수있는형태 다양한비트형식가짐 다양한비트형식가짐 주로 16 진수로표기 2 진코드로이해하기어려움 CPU 기종에따라다름
프로그램언어 저급언어 (Low Level Language) 어셈블리어 기계어를기호화한프로그램언어 고급언어 (High Level Langage) 컴파일러사용 C, Fortran, COBAL, Pascal
어셈블리언어 어셈블리언어 (Assembly Language) 기계어와 1대1로대응한명령을기술하는언어 Mnemonic code : 니모딕코드 상징적인연상기호사용, 주로시스템프로그래밍에사용 하드웨어이해에적합 CPU 개발사에따라독자적인기능가짐 매크로어셈블리언어 (Macro Assembly Language) 기계어로번역되지않는의사명령사용, 매크로기능가짐 의사 (psuedo) 명령 => 어셈블러직접기계어로번역되지않지만번역시어셈블러에의해참조 어셈블러 (Assembler) 어셈블리프로그램언어로쓰여진소스프로그램을번역하여기계어프로그램을작성해주는프로그램
8051 의명령어의종류 데이터전송명령 : MOV 산술연산명령 : ADD, SUBB, MUL, DIV 논리연산명령 : AND, OR 비트조작명령 : RRC, RLC 점프명령 : JMP, JZ( 조건점프 )
기능별분류
명령어의구조 1 바이트명령어형식 OP 코드 2 바이트명령어 OP 코드 오퍼랜드 3 바이트명령어 OP 코드오퍼랜드 1 오퍼랜드 2
CPU 의기계어프로그램 주소지정방식
주소지정방식 (addressing mode) CPU 명령이처리할데이터가저장되어있는소스나처리결과를저장할목적지를지정하는방식 유효주소 (Effective Addess) 계산방식이 유효주소 (Effective Addess) 계산방식이필요
주소지정방식 데이터전송과관련된주소지정방식
주소지정방식종류 이미디어트주소지정방식 immediate addressing mode 직접주소지정방식 direct addressing mode 간접주소지정방식 indirect addressing mode 레지스터사용 레지스터주소지정방식 register addressing mode
이미디어트주소지정방식 MOV A,#12H AA 12H 74 12 ADD A#34H A,#34H A A+34H 24 34 MOV DPTR,#1234H DPTR 1234H 90 12 34
이미디어트주소지정방식특징 오퍼랜드가명령코드중에상수값으로포함되어있는방식 이미디어트데이터의앞에는반드시 # 기호를사용한다. 이미디어트데이터는 DPTR 을제외하고는항상 8 비트이다.
직접주소지정방식 MOV A,50H AA M[50H] E5 50 ADD A,52H 25 52 A A+M[52H]
직접주소지정방식특징 데이터가저장된메모리의 8 비트주소를직접지정하는방식 내부데이터메모리의하위 128바이트 (00H 7FH) 나 SFR 을액세스할때사용 명령에서오퍼랜드가 8비트번지로표현되므로기계어코드가짧아지고, 명령의실행속도가빠르다.
간접주소지정방식 E6 MOV A@R0 A,@R0 A (R0) : 내부데이터메모리 ADD A,@R1 A A + (R1) : 내부데이터메모리 27 MOVX A,@R0 A (R0) : 외부데이터메모리 (8비트어드레스 ) MOVX A,@DPTR A (DPTR) : 외부데이터메모리 (16 비트어드레스 ) E2 E0
간접주소지정방식특징 오퍼랜드의주소를저장하고있는레지스터를이용하여오퍼랜드를간접적으로지정하는방식 간접주소지정을나타내는레지스터의앞에 @ 기호를붙인다. 내부데이터메모리나외부데이터메모리를액세스하는데모두사용 레지스터로서 R0, R1이나스택포인터를사용하면오퍼랜드를가리키는번지가 8비트로표현 DPTR을사용하면오퍼런드를가리키는번지가 16 비트로표현
레지스터주소지정방식 MOV A,R0 E8 AA R0 xxxxx rrr ADD A,R7 2F A A+R7
베이스인덱스주소지정방식 MOVC A, @A+PC A A <- M[A+PC] MOVC A, @A+DPTR A <- M[A+DPTR] 83 93 DPTR A 주소 데이터 데이터메모리
베이스인덱스주소지정방식 Based indexed addresing mode EA = (base register) + (index register) base register: DTPR, PC index d register: A 외부프로그램메모리에저장된탐색표 (lookup table) 참조시이용
주소지정방식 점프명령과관련된주소지정방식
C 에서점프예 C 에서는대표적으로 goto 사용 void main() { int cnt; scanf ( %d, &cnt); if (cnt > 10) goto Skip_Add; cnt += 10; Skip_Add: printf( cnt = %d n, cnt); }
상대주소지정방식 SJMP 08H short jump SJMP 명령의주소가 100H 인경우분기되는주소는? TargetAddress = 0102H(PC) + 08H = 010AH 0100 SJMP 08H 0102 <- PC.. 010A MOV A,#10
상대주소지정방식 Relative addressing mode 지금부터의주소지정방식은분기명령과밀접한관계 EA A = PC + 8 bit signed offset -128 ~ +127 범위분기 / 지정
절대주소지정방식 Absolute addressing mode 11 비트의절대주소지정 PC 0-10 <= absolute address PC의나머지 5비트 (11-15) 는변경되지않음 AJMP addr Absoulute jump Addr 10-8 10101 Addr 7-0
절대주소지정방식 AJMP 0123H 001 10101 0010 0011 => 3523H AJMP 의주소가 8000H 일때분기되는주소는? PC 0-10 <- 123H 8123H 번지로분기
롱주소지정방식 long addressing mode 분기할번지를 16비트절대값으로표현 예 PC <= absolute address LJMP 9000H 9000H 번지로분기 ; long jump 02 90 00
CPU 의기계어프로그램 데이터전송명령
데이터전송명령 - MOV MOV 8비트데이터전송 ( 내부 RAM과 SFR) 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 의예 MOV A,#12H MOV A,R0 MOV R0,A MOV A,@12H MOV A,@R0 MOV @R1,A MOV MOV DPTR, A R0, R2
MOV 1 비트전송 - CY 플래그에 MOV C,bit MOV bit,c DPTR 을사용한 16 비트전송 MOV DPTR, #data
MOVX 외부데이터메모리 A 레지스터와외부메모리와의 데이터전송 MOVX A, @Ri MOVX A, @DPTR MOVX @Ri, A MOVX @DPTR, A
MOVC 프로그램메모리 Move Code Byte 프로그램메모리로부터프로그램코드전송 인덱스주소방식만가능 MOVC A, @A+DPTR MOVC A, @A+PC
PUSH / POP 스택 (stack) 에데이터전송 내부메모리를사용하고직접주소방식 PUSH DPL ; DPTR -> 스택 PUSH DPH PUSH A ; A 레지스터저장 POP A POP DPH POP DPL
PUSH 기계어데이터를넣으려면 PUSH 명령을사용 MOV SP,#5FH MOV A,#10 PUSH A PUSH A 실행과정 SP 5F 내부메모리 주소 5F 60 61 62 SP 60 주소 5F 60 61 62 1. SP 가 1 이자동증가 주소 SP 5F 60 10 60 61 62 A 10 2. SP 가가리키는 주소에 A=10을넣는다.
POP 기계어데이터를꺼내려면 POP 명령을사용 POP A POP A 실행과정 주소 주소 SP 5F SP 5F 60 10 60 60 10 60 61 62 1. SP 에서읽어 A 에저장한다. 61 62 읽기 A 레지스터 10 SP 5F 10 주소 5F 60 61 62 2. SP 을 1 감소한다.
XCH A 레지스터와바이트데이터교환 XCH A, Rn XCH A, direct XCH A, @Ri XCH A, R0 실행전 A 23H R0 56H 실행후 56H 23H
XCHD 하위 4 비트만데이터교환 XCH A, @Ri XCH A, @R0 R0 23H A 실행전 23H 56H 23H 주소 실행후 26H 53H
CPU 의기계어프로그램 산술연산명령
Arithmetic Operations ( 산술연산명령어 ) A, Rn Acc에레지스터 Rn의값을더함 ADD A, direct Acc에 direct 번지의값을더함 A, @Ri Acc에 Ri가가리키는번지의값을더함 A, #data Acc에 data( 상수 ) 값을더함 A, Rn Acc에레지스터 Rn의값과자리올림수를함께더함 ADDC A, direct Acc에 direct 번지의값과자리올림수를함께더함 A, @Ri Acc 에 Ri 가가리키는번지의값과자리올림수를함께더함 A, #data Acc에 data( 상수 ) 값과자리올림수를함께더함 A, Rn Acc에서레지스터 Rn의값과빌림수를함께뺌 SUBB A, direct Acc에서 direct 번지의값과빌림수를함께뺌 A, @Ri Acc에서 Ri가가리키는번지의값과빌림수를함께뺌 A, #data Acc에서 data( 상수 ) 값과빌림수를함께뺌 A Acc의값을 1 증가 INC Rn 레지스터 Rn 의값을 1 증가 direct direct 번지의값을 1 증가 @Ri Ri가가리키는번지의값을 1 증가 A Acc의값을 1 감소 DEC Rn 레지스터 Rn의값을 1 감소 direct direct 번지의값을 1 감소 @Ri Ri가가리키는번지의값을 1 감소 MUL AB A, B 레지스터를곱하여 B 에상위,A 에하위 8 비트저장 DIV AB A B를하여 A레지스터에몫, B레지스터에나머지저장 DA A Acc의값을 BCD코드형태로변환 1 2 1 2 1 2 1 2 1 2 1 2 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 4 4 1
연산명령의종류 ADD : A+operand -> A 더하기 ADDC : A+operand+CY 플래그 -> A SUBB : A operand CY -> A MUL 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->A DA : BCD 조작
ADD/ADDC/SUBB 덧셈 / 뺄셈 ADD A,#32H : A + 32H -> A ADDC A,#32H : A + 32H +CY -> A SUBB A,#32H : A 32H CY -> A MOV A,#5 ; 5 ADD A,#0FEH ; 5 + (-3) -> A 5 0000 0101 + (-3) 1111 1101 2 10000 0010 CY AC OV P(Even) 1 1 0 0
ADDC / SUBB ADDC A,50H : A +(50H) + CY -> A A 55 (50H) 4E A A4 1010 0100 CY AC OV P(Odd) 0 1 1 1 SUBB A,@R0 : A -@R0 - CY -> A A 53 (50H) 37 CY 1 A 1B 0001 1011 CY AC OV P 0 1 0 0
16 비트더하기예 int a; a = 0x1E44; a += 0x56CA; CLR C ; CY 지우고 MOV A, #44H ; 8비트 44+CA ADD A, #CAH MOV R1, A ; 결과값 0EH을 R1에, 현재 CY = 1. MOV A, #1EH ; 상위 8비트 1E+56+CY ADDC A, #56H MOV R2, A ; 상위바이트결과값 75H -> R2에저장 결과 750EH 은 R2:R1 에저장
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 진수결과를얻기위해 A = 83H 1 결과 9 보다클경우 +6 1. 결과 9 보다클경우 +6 2. CY = 1 : 상위 +6 AC = 1 : 하위 +6
MUL 곱셈 MUL AB AxB => B( 상위 8비트 ) : A( 하위 8비트 ) 255 넘으면 OV=1 MOV A,#31H MOV B,#10H MUL A,B B 03H A 10H
DIV 나눗셈 DIV AB A B => A( 몫 ) B( 나머지 ) B=0, OV=1 : 결과보증할수없다. MOV A,#118 MOV B,#5 DIV A,B A B 23 3 OV=0
CPU 의기계어프로그램 논리연산명령
ANL/ORL - AND 와 OR AND 명령 ANL A, Rn ANL A, direct ANL A, @Ri ANL A, #data ANL direct, A ANL direct, #data ANL C, bit ANL C, /bit OR 명령 ORL A, Rn ORL A, direct ORL A,,@Ri ORL A, #data ORL direct, A ORL direct, #data ORL C, bit ORL C, /bit
ANL/ORL 예 ANL A,#00001000B MOV A,#01110111B ANL A,#00001000B A 00000000B 실행후 MOV A,#01110111B ORL A,#00001000B A 01111111B 실행후
XRL - XOR 연산 XRL A,@R0 실행전 A : 10010001B @R0 : 11100011B 실행후 A : 01110010B
CLR (Clear) / CPL (1 의보수 ) CLR A : A 레지스터를 0 으로지운다. CPL A : A 레지스터의값을보수연산 2 의보수예 CPL A ; 1 의보수 INC A ; 1 의보수 + 1
로테이트명령 RR : 오른쪽으로 1 비트쉬프트한다. 1111 1101 RL : 왼쪽으로 1 비트쉬프트한다. 1111 1101
로테이션명령에서 carry 와함께 RRC A : RRC (Rotate Right with Carry) A레지스터 1111 1101 C C=1 RLC A : RLC (Rotate Left with Carry) A 레지스터 C 1111 1101 C=0 실행후 1111 1010 C=1
CPU 의기계어프로그램 비트조작명령
CLR 비트 &CY 지우기 CLR P1.1 Port 1 의 1비트를지운다. CLR C CY 플래그를지운다.
SETB SETB A.2 A레지스터의 3 번째비트를지운다. SETB C CY 플래그를지운다.
CPU 의기계어프로그램 프로그램실행위치제어명령
점프명령 무조건점프 (Unconditional Branch) ajmp addr11 ; 절대번지로점프 ljmp addr16 ; 절대번지 (16비트) 점프 - long jump sjmp rel ; 상대번지점프 - short jump jmp @A+DPTR ; 간접번지지정점프 조건점프 (Conditional branch) jz, jnz rel ; 상대주소로점프 -short conditional djnz rel ; 감소후 0 이면점프 cjne rel ; 비교후같지않으면점프 cjne rel ; 비교후같지않으면점프 Subroutine Call acall addr11 ; 절대번지 (11 비트 ) 서브루틴콜 lcall addr16 ; long 절대번지서브루틴콜 (Subroutine Call) ret ; 서브루틴으로부터복귀 (return) reti ; 인터럽트처리후복귀
프로그램실행위치제어명령 무조건점프명령 ajmp addr11 ljmp addr16 sjmp rel jmp @A+DPTR
AJMP 절대번지 (11 비트 ) 점프 11 비트로번지표현 ( 점프영역 2Kbyte 범위 ) 나머지상위 5 비트 (A[15:11]) 는그대로유지 2 바이트명령어로표현 명령어 2 바이트 Addr 10-8 10101 Addr 7-0 PC A[15:11] A[10:0] 점프주소 16비트 A[15:11] A[10:8] A[7:0] PC
LJMP Long Jump 점프할주소 16 비트사용 (64K byte 범위 ) 3 바이트명령어 (2 바이트주소 ) LJMP 점프주소상위점프주소하위 PC A[15:0]
JMP 절대번지점프 JMP addr16 LJMP 와같이 16비트주소로점프 JMP 0030H 0030H 번지로점프 JMP @A + DPTR Indirect Jump 점프주소 = DPTR + A 레지스터값
SJMP Short Jump 8 비트부호옵셋트상대주소 (8bit signed offset relative) 2바이트명령어 주소값은 PC와상대주소값을더한다. 예 ) SJMP 0FEH 다음명령이 PC가 0015H에있다면 PC 0015 상대주소 FFFE 점프할주소 0013
SJMP 어셈블리예 80E2 LOOP2: MOV R7,#50... SJMP LOOP2 ; PC+FFE2->PC 80FE SJMP $ * $ : PC+FFFE -> PC 대기계속같은명령수행
프로그램실행위치제어명령 조건점프명령 JZ/JNZ rel DJNZ rel JC / JNC rel CJNE rel
조건점프명령 JZ A=0 일때점프 JNZ A!=0 일때점프 DJNZ 감소후, A!=0 일때점프 CJNE A,byte A!= byte 일때점프 CJNE reg,#data byte!= #data 일때점프 JC CY=1 일때점프 JNC CY=0 일때점프 JB Bit = 1 일때점프 JNB Bit = 0 일때점프 JBC Bit = 1 일때점프후, 비트클리어 (clear)
jz, jnz Z(zero) : A 레지스터값이 0 인가? JZ : A 레지스터값이 0 이면점프한다. 2 바이트명령 주소는 SJMP 와같이 8 비트상대주소 현재 PC 에서 -128 ~ 127 번지내에서점프 JNZ : A 레지스터값이 0이아닐때점프한다.
JC / JNC 캐리 캐리플래그 (CY) 의값에따라점프결정 JC : 만약 CY=1 이면점프 JNC : 만약 CY=0 이면점프 2바이트명령 주소는 SJMP/JZ/JNZ와같이 8비트상대주소 현재 PC 에서 -128 ~ 127 번지내에서점프
CJNE rel 두값을비교후, 값이같지않으면점프 NE : Not Equal 같지않으면 cjne A, direct, rel cjne Rn, #data, rel cjne @Rn, #data, rel CJNE A, 20H, LOOP CJNE A,#10,LOOP CJNE R0,#10,LOOP CJNE @R0,#10,LOOP
JB / JNB / JBC JB : 정의된플래그의비트가 1 이면점프 JNB : 정의된플래그의비트가 0이면점프 ( 예 ) * JB F0,LOOPEND F0플래그가 1이면점프 * JNB F0,$ - F0 가 1 일때까지이명령실해 대기할때 * JB ACC.2,LOOP A 레지스터의 3 번째비트가 1 이면점프 JBC : 사용자플래그가 1 이면점프하고, 그비트를클리어한다.
DJNZ 반복루프를구성할때 1 을감소하고, 0 이아니면점프 DJNZ Rn, rel DJNZ direct, rel MOV DPTR,#2010H CLR A MOV R0,A MOV R4,#5 LOOP: MOV A,@DPTR ADD A,R0 MOV R0,A INC DPTR DJNZ R4,LOOP
프로그램실행위치제어명령 서브루틴콜명령 ACALL addr11 LCALL addr16 RET
ACALL addr11 2 바이트명령 2K 바이트내의서브루틴호출가능 스택에복귀주소저장하고 RET 복귀명령에의해스택에저장된 주소값사용하여복귀한다. 주소값결정방식은 AJMP와같음.
LCALL addr16 Long Call 3 바이트명령 (2 바이트는주소값 ) 64K 바이트내의서브루틴호출 스택에다음복귀주소 PC 값을저장하고 RET 명령에의해스택에서 PC 값복귀한다.
RET 서브루틴복귀명령 Call 명령에의해서브루틴실행이끝나면 CALL 다음명령으로복귀한다. Call 명령에위해스택에저장된복귀주소 PC 값을스택에서읽어 PC 에저장하여 call 다음명령으로복귀실행
프로그램실행위치제어명령 기타명령 NOP
NOP NOP 명령은 CPU 가어떤조작도하지않고다음명령을읽어실행을계속한다. 이것도기계어명령이기때문에 PC 값은자동으로 1 증가한다. 약간의짧은시간지연이필요할때사용할수있다. 시스템의특정부분의안정되는데시간이필요하다면, 이명령으로짧은시간을지연시킬수있다.
CPU 의기계어프로그램 의사명령
의사명령어 (Pseudo Code) 기계어로번역되지않음 어셈블러에게정보만제공 프로그램작성을편리하게도우는기능
의사명령어 ORG (origin) : 프로그램이위치할주소값 EQU (equate) : 특정값의정의 C 의 define 과유사. 데이터및주소값지정가능 DB (define byte) : 특정데이터값의정의 DW (define word) : 특정데이터값의정의 DS (define storage) : 특정데이터값의정의 BIT (bit) : 비트변수의정의 END (assemble end) : 프로그램의끝표시
ORG 프로그램또는데이터의시작번지지정 예 ) ORG 00H MOV A,#0F3H MOV 명령부터프로그램영역의 00 번지부터시작
EQU 수치값을레이블에할당 수치대신의미있는문자기호를사용가능 예 ) NEXT EQU 20H BUF EQU 10110100B
DB 메모리에숫자또는문자를 저장하고자할때 예 ) ORG 1000H DB 11H, 22H, 33H 데이터메모리 1000 11 1001 22 1002 33
DB 메모리에문자를저장하는예 예 ) ORG 1000H DB ABC 데이터메모리 1000 41 1001 42 1002 43
DW 메모리에문자를저장하는예 예 ) ORG 1000H DW 0102H, 0304H 데이터메모리 1000 01 1001 02 1002 03 1003 04
DS 메모리에숫자또는문자를저장할공간을확보하고자할때 예 ) ORG 1000H 데이터메모리 BUFFER EQU $ 1000? DS 04H 1001? $ : 현재의위치 내용에대해서는정해지지않음 고급언어의배열확보와유사 1002? 1003?
BIT 특정 BIT 의주소를정의하는데사용 예 ) COUNT BIT 38H 또는 COUNT BIT 27H.1
END 어셈블러에게번역을끝낼것을지시 번역하고자하는마지막부분에기록 END 이후의명령은번역되지않음 프로그램의끝이아닌어셈블리의끝을지시
ASM 예 ; 파일이름 : BOOL.A51 SELECT EQU 0FC48H ; I/O 실험선택어드레스 IO_SEL EQU 10011110B ; I/O 실험선택값 ORG 0 SJMP START ; 메인프로그램으로점프 ; 메인프로그램시작 ORG 0030H START: MOV SP,#60H ; 스택지정 MOV A,#IO_SEL ; 그림 4-2의 U15 선택값 MOV DPTR,#SELECT ; 그림 4-2의 U15 어드레스 MOVX @DPTR,A ; 그림 4-2 의 U15 선택
ASM 예 LP1: ; (P14 XOR P15) AND P16 MOV C,0 ANL C,P1.6 ; (P14 XOR P15) AND P16 + (P14 AND P15) ORL C,1 MOV P1.0,C ; 출력 SJMP LP1 ; 무한루프 END
CPU 의기계어프로그램 끝