z8051 명령어의이해 z명령어종류 -...
TRANSCRIPT
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⁒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의 기계어 프로그램
끝끝끝끝