970 likes | 1.96k Views
8051 명령어. 8051 명령어의 이해 명령어 종류. dolicom@naver.com http://blog.naver.com/dolicom. CPU 의 기계어 프로그램. 8051 어셈블리 언어. 기계어. 기계어 (Machine Language) CPU 가 직접 이해할수 있는 언어 일련의 0 과 1 로 표시 실행할명령 , 데이터 , 기억장소의주소등포함 하드웨어가 직접 실행 시킬 수 있는형태 다양한 비트 형식 가짐 주로 16 진수로 표기 2 진코드로 이해하기 어려움
E N D
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 바이트 명령어 형식 • 2바이트 명령어 • 3 바이트명령어
CPU의 기계어 프로그램 주소 지정 방식
주소지정방식(addressing mode) • CPU 명령이 처리할 데이터가 저장되어 있는 소스나 처리결과를 저장할 목적지를 지정하는 방식 • 유효주소(Effective Addess)계산 방식이 필요
주소 지정 방식 데이터 전송과 관련된 주소 지정 방식
주소지정방식 종류 • 이미디어트 주소지정 방식 immediate addressing mode • 직접 주소지정 방식 direct addressing mode • 간접 주소지정 방식 indirect addressing mode 레지스터 사용 • 레지스터 주소지정 방식 register addressing mode
이미디어트 주소지정 방식 • MOV A,#12H • A ← 12H • ADD A,#34H • A ← A + 34H • MOV DPTR,#1234H • DPTR ← 1234H
이미디어트 주소지정 방식 특징 • 오퍼랜드가 명령 코드중에 상수값으로 포함되어 있는 방식 • 이미디어트 데이터의 앞에는 반드시 #기호를 사용한다. • 이미디어트 데이터는 DPTR을 제외하고는 항상 8비트이다.
직접 주소지정 방식 • MOV A,50H • A ←M[50H] • ADD A,52H • A ← A + M[52H]
직접 주소지정 방식 특징 • 데이터가 저장된 메모리의 8 비트 주소를 직접 지정하는 방식 • 내부 데이터 메모리의 하위 128바이트(00H∼7FH)나 SFR을 액세스할 때 사용 • 명령에서 오퍼랜드가 8비트 번지로 표현되므로 기계어 코드가 짧아지고, 명령의 실행 속도가 빠르다.
간접 주소지정 방식 • MOV A,@R0 • A ← (R0) : 내부 데이터 메모리 • ADD A,@R1 • A ← A + (R1) : 내부 데이터 메모리 • MOVX A,@R0 • A ← (R0) : 외부 데이터 메모리(8비트 어드레스) • MOVX A,@DPTR • A ← (DPTR) : 외부 데이터 메모리(16비트 어드레스)
간접 주소지정 방식 특징 • 오퍼랜드의 주소를 저장하고 있는 레지스터를 이용하여 오퍼랜드를 간접적으로 지정하는 방식 • 간접 주소지정을 나타내는 레지스터의 앞에 @기호를 붙인다. • 내부 데이터 메모리나 외부 데이터 메모리를 액세스하는데 모두 사용 • 레지스터로서 R0, R1이나 스택 포인터를 사용하면 오퍼랜드를 가리키는 번지가 8비트로 표현 • DPTR을 사용하면 오퍼런드를 가리키는 번지가 16비트로 표현
레지스터 주소지정 방식 • MOV A,R0 • A ← R0 • ADD A,R7 • A ← A + R7
베이스 인덱스 주소지정 방식 • MOVC A, @A+PC • A <- M[A+PC] • MOVC A, @A+DPTR • A <- M[A+DPTR] A DPTR 주소 데이터 데이터 메모리
베이스 인덱스 주소지정 방식 • Based indexed addresing mode • EA = (base register) + (index register) • base register: DTPR, PC • index register: A • 외부 프로그램 메모리에 저장된 탐색표(lookup table) 참조 시 이용
주소 지정 방식 점프 명령과 관련된 주소 지정 방식
C에서 점프 예 • C에서는 대표적으로 goto 사용 void main() { int cnt; scanf (“%d”, &cnt); if (cnt > 10) gotoSkip_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 = PC + 8 bit signed offset • -128 ~ +127 범위 분기/지정
절대 주소지정 방식 • Absolute addressing mode • 11 비트의 절대주소 지정 • PC0-10 <= absolute address • PC의 나머지 5비트(11-15)는 변경되지 않음 • AJMP addr • Absoulute jump
절대 주소지정 방식 • AJMP 0123H => 3523H • AJMP의 주소가 8000H일때 분기되는 주소는? • PC0-10 <- 123H • 8123H 번지로 분기
롱 주소지정 방식 • long addressing mode • 분기할 번지를 16비트 절대값으로 표현 • PC <= absolute address • 예 • LJMP 9000H ; long jump • 9000H 번지로 분기
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 DPTR, A MOV 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 A,#10 PUSH A PUSH A 실행 과정 MOV SP,#5FH 주소 주소 주소 SP 5F SP 5F 5F SP 5F 10 60 60 60 60 60 61 61 61 62 62 62 A 10 내부메모리 1. SP가 1이 자동증가 2. SP가 가리키는 주소에 A=10을 넣는다.
POP • 기계어 데이터를 꺼내려면 POP 명령을 사용 POP A 실행 과정 POP A 읽기 주소 주소 SP 주소 5F 5F SP SP 5F 5F 60 60 60 10 60 10 60 10 61 61 61 62 62 62 A 레지스터 10 2. SP을 1 감소 한다. • SP에서 읽어 • A에 저장 한다.
XCH • A레지스터와 바이트 데이터 교환 • XCH A, Rn • XCH A, direct • XCH A, @Ri XCH A, R0 R0 A 56H 23H 실행전 23H 56H 실행후
XCHD • 하위 4비트 만 데이터 교환 • XCH A, @Ri XCH A, @R0 R0 23H A 56H 23H 주소 23H 실행전 53H 26H 실행후
CPU의 기계어 프로그램 산술 연산 명령
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
연산 명령의 종류 • 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 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 A B 03H 10H
DIV 나눗셈 • DIV AB • A÷B => A(몫) B(나머지) • B=0, OV=1 : 결과 보증할 수 없다. MOV A,#118 MOV B,#5 DIV A,B B A 23 OV=0 3
CPU의 기계어 프로그램 논리 연산 명령
ANL/ORL - AND와 OR 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 ORL A, Rn ORL A, direct ORL A, @Ri ORL A, #data ORL direct, A ORL direct, #data ORL C, bit ORL C, /bit