You are on page 1of 30

Lệnh chuyển dữ liệu

8 bits của 8051

Võ Thị Thu Hồng 1


Lệnh chuyển dữ liệu 8bits của 8051

1.Chuyển dữ liệu trong RAM nội ,SFR (MOV)


2.Chuyển dữ liệu giữa bộ nhớ trong và bộ nhớ dữ
liệu ngoài (MOVX)
3.Truy xuất dữ liệu từ vùng nhớ chương trình(MOVC)
4.Hoán đổi dữ liệu giữa ô nhớ RAM nội (XCH, XCHD)
5.Lưu (PUSH) hay lấy (POP) dữ liệu trong STACK
Võ Thị Thu Hồng 2
1. LỆNH MOV
Chuyển dữ liệu trong RAM nội và vùng SFR
MOV Dest, Src ; Dest  Src
- (Destination) (Source)
Bảng lệnh MOV (8bits)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)
MOV A, Rn 1 1 1 0 1 n2 n1 n0 E8 ÷ EF A Rn 1
MOV A, direct 1 1 1 0 0 1 0 1 E5 A  (direct) 1
a7 a6 a5 a4 a3 a2 a1 a0 Byte 2
MOV A, @Ri 1 1 1 0 0 1 1 i E6 ÷ E7 A  (Ri) 1
MOV A, #data 0 1 1 1 0 1 0 0 74 A data 1
d7 d6 d5 d4 d3 d2 d1 d0 Byte 2
MOV Rn, A 1 1 1 1 1 n2 n1 n0 F8 ÷ FF Rn A 1
MOV Rn, direct 1 0 1 0 1 n2 n1 n0 A8 ÷ AF Rn 2
a7 a6 a5 a4 a3 a2 a1 a0 Byte 2 (direct)
MOV Rn, #data 0 1 1 1 1 n2 n1 n0 78 ÷ 7F Rn data 1
d7 d6 d5 d4 d3 d2 d1 d0 Byte 2
MOV direct, A 1 1 1 1 0 1 0 1 F5 (direct A 1
a7 a6 a5 a4 a3 a2 a1 a0 Byte 2

Võ Thị Thu Hồng 3


1. LỆNH MOV (TT)
Bảng lệnh MOV (8bits) của 8051 (TT)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOV direct, Rn 1 0 0 0 1 n2 n1 n0 88 ÷ 8F (direct)  2


a7 a6 a5 a4 a3 a2 a1 a0 Byte 2 Rn
MOV direct1, direct2 1 0 0 0 0 1 0 1 85 (direct1) 2
a7 a6 a5 a4 a3 a2 a1 a0 Byte 2(direct 2) (direct2)
a7 a6 a5 a4 a3 a2 a1 a0 Byte 3(direct 1)
MOV direct, @Ri 1 0 0 0 0 1 1 i 86 ÷ 87 (direct) 2
a7 a6 a5 a4 a3 a2 a1 a0 Byte 2 (Ri)
MOV direct, #data 0 1 1 1 0 1 0 1 75 (direct) 2
a7 a6 a5 a4 a3 a2 a1 a0 Byte 2(direct)  data
d7 d6 d5 d4 d3 d2 d1 d0 Byte 3(data)
MOV @Ri, A 1 1 1 1 0 1 1 i F6 ÷ F7 (Ri)  A 1

MOV @Ri, direct 1 0 1 0 0 1 1 i A6 ÷ A7 (Ri)  2


a7 a6 a5 a4 a3 a2 a1 a0 Byte 2 (direct)
MOV @Ri, #data 0 1 1 1 0 1 1 i 76 ÷ 77 (Ri)  data 1
d7 d6 d5 d4 d3 d2 d1 d0 Byte 2
MOV DPTR, #data16 1 0 0 1 0 0 0 0 90 DPTR  2
d15 d14 d13 d12 d11 d10 d9 d8 Byte 2 data16
d7 d6 d5 d4 d3 d2 d1 d0 Byte 3
Võ Thị Thu Hồng 4
1. LỆNH MOV (TT)
Chú ý:
Không dùng chung nguồn và đích các cách định địa chỉ sau:
Rn - Rn
Rn - @Ri
@Ri - @Ri
Ký hiệu
Rn Định địa chỉ thanh ghi (các thanh ghi R0 đến R7)
direct Địa chỉ trực tiếp 8 bit (00H đến FFH), tên gọi các SFR (VD: Port1 là P1)
@Ri Định địa chỉ gián tiếp (thanh ghi R0 hoặc R1)
#data Hằng số 8 bit. Chú ý: với các số HEX nếu bắt đầu bằng chữ thì phải
thêm số 0 phía trước chữ đó.
#data16 Hằng số 16 bit. Chú ý: với các số HEX nếu bắt đầu bằng chữ thì phải
thêm số 0 phía trước chữ đó.
(XXH) Nội dung ô nhớ ở địa chỉ XXH ( Ví dụ : (20H)=15H )

Võ Thị Thu Hồng 5


1. LỆNH MOV (Ví dụ)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOV A, #data 0 1 1 1 0 1 0 0 74 A data 1


d7 d6 d5 d4 d3 d2 d1 d0 Byte 2
MOV A, #0CFH ; A <- CFH
(MOV A, # Data )
Opcode 01110100 11001111
(HEX) 74H CFH

Mnemonic Opcode (binary) Opcode Diễn giải Số MC


D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOV direct, A 1 1 1 1 0 1 0 1 F5 (direct) A 1


a7 a6 a5 a4 a3 a2 a1 a0 Byte 2
MOV P2, A ; P2 <- A
E0H 17H ACC
(MOV direct, A )
Opcode 11110101 10100000
A0H 17H P2
(HEX) F5H A0H

Võ Thị Thu Hồng 6


1. LỆNH MOV (Ví dụ)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOV Rn, direct 1 0 1 0 1 n2 n1 n0 A8 ÷ AF Rn 2


a7 a6 a5 a4 a3 a2 a1 a0 Byte 2 (direct)

RAM Nội
7FH
MOV R3, 45H ; R3 <- (45H)
2AH 45H (MOV Rn, Direct)
Opcode 10101011 01110101
(HEX) ABH 45H

2AH 03H

00H
R3= (45H)=2AH

Võ Thị Thu Hồng 7


1. LỆNH MOV (Ví dụ)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOV Rn, direct 1 0 1 0 1 n2 n1 n0 A8 ÷ AF Rn 2


a7 a6 a5 a4 a3 a2 a1 a0 Byte 2 (direct)

RAM Nội
7FH

MOV R3, # 45H ; R3 <- 45H


2AH 45H (MOV Rn , #Data)
Opcode 7BH 45H

45H 03H

R3= 45H

Võ Thị Thu Hồng 8


1. LỆNH MOV (Ví dụ)
MOV R3,45H tương đương MOV 03H,45H  MOV 3,45H
( MOV Rn, Direct) ( MOV direct1,direct2)
Opcode ABH 45H
Src Dest
Opcode 85H 45H 03h

Chú ý: lệnh MOV direct1, direct2 có 3 byte, byte 1 là mã


lệnh, byte 2 là mã địa chỉ nguồn, byte 3 là mã địa chỉ đích

Võ Thị Thu Hồng 9


1. LỆNH MOV (Ví dụ)
MOV B, @R1 -> B (21H) = 7CH MOV @R0 , 16 -> (38H )= FBH
(MOV direct,@Ri) (MOV @Ri, direct)
Opcode 87H F0H Opcode A6H 10H
Cho trước R1=21H và (21H)= 7CH Cho trước R0=38H và (10H)= FBH
16=10H
B 7CH F0H

7FH 7FH
(2)
FBH 38H
(2) (1)
@R0

7CH 21H FBH 10H

(1) @R1
R1 21H 01H R1 21H 01H
R0 00H R0 38H 00H
RAM Nội Võ Thị Thu Hồng RAM Nội 10
2. Lệnh MOVX
Chuyển dữ liệu giữa bộ nhớ trong và bộ nhớ dữ liệu ngoài

MOVX Dest, Src ; Dest  Src


- (Destination) (Source)

A @Ri Chuyển data từ ngoại


vi vào 8051
A @DPTR
@Ri A Chuyển data từ 8051
ra ngoại vi
@DPTR A
Võ Thị Thu Hồng 11
2. Lệnh MOVX (TT)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOVX A, @DPTR 1 1 1 0 0 0 0 0 E0 A  (DPTR) 2

MOV DPTR , # 10F0H ; DPH= 10H DPL=F0H


Chuyển data từ ngoại vi
MOVX A, @DPTR -> A (10F0H) = 63H
vào 8051
Opcode E0H
Vùng SFR
RAM Ngoài
B 7CH F0H
ACC 63H (2)
E0H

DPH 10H 83H


(1)
DPL F0H 82H
10F0H 63H

80H
Võ Thị Thu Hồng 12
2. Lệnh MOVX (TT)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOVX A, @Ri 1 1 1 0 0 0 1 i E2 ÷ E3 A (Ri) 2

MOV R0 , # 0F7H ; R0=F7H i=0,1 Chuyển data từ ngoại vi


vào 8051 (địa chỉ 1 byte)
MOVX A, @R0 -> A (F7H) = 8AH
RAM Ngoài
Opcode E2H
ACC 8AH E0H
(2) 10FFH
10FEH
7FH

00F7H 8AH

(1)
R0 F7H 00H
RAM Nội Võ Thị Thu Hồng 13
2. Lệnh MOVX (TT)
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOVX @Ri, A 1 1 1 1 0 0 1 i F2 ÷ F3 (Ri)  A 2


MOVX @DPTR, A 1 1 1 1 0 0 0 0 F0 (DPTR)A 2

MOV DPTR , # 2010H ; DPH= 20H DPL=10H


Chuyển data từ 8051
MOVX @DPTR , A -> (2010H)  A= 42H ra ngoại vi
Opcode F0H
Vùng SFR
RAM Ngoài
B 7CH F0H
ACC 42H (2)
E0H

DPH 20H 83H


(1)
DPL 10H 82H
2010H 42H
80H
Võ Thị Thu Hồng 14
3. Lệnh MOVC
Truy xuất vùng nhớ chương trình
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

MOVC A, @A + DPTR 1 0 0 1 0 0 1 1 93 A  (A + DPTR) 2


MOVC A, @A + PC 1 0 0 0 0 0 1 1 83 A  (A + PC) 2

MOVC A, Src ; A  Src


- (Destination) (Source)

+Dùng đọc data cất trong bộ nhớ chương trình


+DPTR và PC được dùng làm thanh ghi chỉ số (INDEX)
NÊN: DÙNG DPTR để dễ quản lý hơn
+ Ứng dụng trong tra bảng

Võ Thị Thu Hồng 15


3. Lệnh MOVC (Ví dụ)
MOV DPTR , # 1000H ; DPH= 10H DPL=00H
MOV A, #15 ; A =0FH
MOVC A, @A+ DPTR , -> A  (0FH+1000H) = 32H
ROM/RAM
Opcode 93H Chương trình
Giá trị lúc sau
Giá trị lúc đầu Vùng SFR

ACC 32H
0FH E0H
(2)

DPH 10H 83H


100FH 32H
DPL 00H 82H
(1)

80H

Võ Thị Thu Hồng 16


3. Lệnh MOVC (Ví dụ)
TABLE EQU 1340H; khai báo đầu chương trình
MOV DPTR , # TABLE ; DPH= 13H DPL=40H
MOV A, #25H ; A =25H
MOVC A, @A+ DPTR , -> A  (25H+1340H)= 71H ROM/RAM
Chương trình
Giá trị lúc sau
Giá trị lúc đầu Vùng SFR

ACC 25H 71H E0H


(2)

DPH 13H 83H


1365H 71H
DPL 40H 82H
(1)

0H

Võ Thị Thu Hồng 17


3. Lệnh MOVC (Ví dụ)
Tính giá trị x2 , với x là ngõ vào port1. Giả sử x có
giá trị thập phân tương đương từ 0 đến 9
Hex Opcode
0000 ORG 0000H ; địa chỉ đầu chương trình
0000 90 00 30 MOV DPTR,#BANG ; nạp giá trị địa chỉ BANG
0003 75 90 FF MOV P1,#0FFH ; đặt port 1 chế độ nhập
0006 E5 90 LAP: MOV A,P1 ; đọc dữ liệu từ port 1 vào A
0008 93 MOVC A,@A+DPTR ; truy xuất dữ liệu từ bảng
0009 F5 A0 MOV P2,A ; xuất giá trị này ra port 2
000B 80 F9 SJMP LAP ; nhảy đến địa chỉ LAP để chạy lại
0030 ORG 0030H ; địa chỉ đầu bảng
0030 00 01 04 09 BANG: DB 00H,01H,04H,09H ; BANG ghi các giá trị
0034 10 19 24 31 DB 10H, 19H,24H,31H ; số HEX của x2
0038 40 51 DB 40H, 51H ; 10 giá trị trong BANG
END ; chiếm 10 ô nhớ từ địa chỉ 0030h đến 0039h
Võ Thị Thu Hồng 18
3. Lệnh MOVC (Ví dụ)
Tính giá trị x2 , với x là ngõ vào port1. Giả sử x có
giá trị thập phân tương đương từ 0 đến 9
Hình sau minh họa giá trị x= 5 = 05H

P2 19H ROM/RAM
Chương trình
Giá trị lúc sau
Giá trị lúc đầu Vùng SFR
MOV P2,A (3)

ACC 05H 19H E0H (2)

DPH 00H 83H


0035H 19H
DPL 30H 82H
(1)

80H
0032H 04H
0031H 01H
BANG 0030H 00H

Võ Thị Thu Hồng 19


Lệnh MOVX và MOVC
Bus Dữ Liệu

Đọc Ghi Đọc


Đọc Ghi RD
Dữ liệu Dữ liệu
A WR
MOVX A, @Ri (Đọc) MOVX
RAM @ Ri,A (Ghi)
R0 hay R1 ROM
MOVX @Ri, A (Ghi) Ngoài
MOVX A,@ Ri (Đọc)
Trong
MOVX A, @DPTR (Đọc)
hay
MOVX @DPTR, A (Ghi) Ngoài
MOVX A, @A + DPTR (Đọc)

MOVX A, @A + PC (Đọc)

PSEN

Võ Thị Thu Hồng 20


4. Lệnh XCH, XCHD
Hoán đổi dữ liệu giữa ô nhớ RAM nội
Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)

XCH A, Rn 1 1 0 0 1 n2 n1 n0 C8 ÷ CF A  Rn 1
XCH A, direct 1 1 0 0 0 1 0 1 C5 A  (direct) 1
d7 d6 d5 d4 d3 d2 d1 d0 Byte 2
XCH A, @Ri 1 1 0 0 0 1 1 i C6 ÷ C7 A  (Ri) 1

XCH A, Src ; A  Src


- (Destination) (Source)
i=0,1

Hoán đổi dữ liệu 4bits thấp giữa ô nhớ RAM nội


Mnemonic Opcode (binary) Opcode Diễn giải Số MC
D7 D6 D5 D4 D3 D2 D1 D0 (HEX)
XCHD A, @Ri 1 1 0 1 0 1 1 i D6 ÷ D7 A 3 ÷ 0  @Ri 3 ÷ 0 1

XCHD A, @Ri; A3 ÷ 0  @Ri 3 ÷ 0


Võ Thị Thu Hồng 21
4. Lệnh XCH, XCHD (Ví dụ)
XCH A, P3;
(XCH A, direct)
Opcode C5H B0H

Giá trị lúc đầu Giá trị lúc sau


Vùng SFR Vùng SFR

ACC 45H E0H ACC 78H E0H

P3 78H B0H P3 45H B0H

80H 80H

Võ Thị Thu Hồng 22


4. Lệnh XCH, XCHD (Ví dụ)
XCHD A, @R1; Cho R1= 15H, A= 2BH, (15H)=1AH
(XCHD A, @Ri)
Opcode D7H

Giá trị lúc đầu


Giá trị lúc sau
ACC 2BH E0H ACC 2AH E0H

1AH 15H 1BH


1BH 15H

R1 15H 01H R1 15H 01H


00H 00H
RAM Nội RAM Nội
Võ Thị Thu Hồng 23
5. Lệnh PUSH,POP
Lưu dữ liệu (PUSH) hay lấy (POP) dữ liệu trong STACK
Mnemonic Opcode (binary) Opcode Diễn giải Số
D7 D6 D5 D4 D3 D2 D1 D (HEX) MC
0

PUSH direct 1 1 0 0 0 0 0 0 C0 SP  SP + 1 2
d7 d6 d5 d4 d3 d2 d1 d Byte 2 (SP)  (direct)
0
POP direct 1 1 0 1 0 0 0 0 D0 (direct)  (SP) 2
d7 d6 d5 d4 d3 d2 d1 d Byte 2 SP  SP - 1
0

Chú ý:
+ Mặc định, ban đầu SP=07H => STACK chiếm cùng vị trí Bank
thanh ghi 1 do đó không nên dùng các địa chỉ vùng này khi sử
dụng STACK
+ Có thể đặt lại SP ban đầu: VD: MOV SP,#30H
+ Vùng Stack dao động từ địa chỉ 08H đến 7FH
+ Các lệnh tác động Stack: PUSH, POP, CALL (Gọi chương trình
con), RET và RETI (Lệnh quay về từ chương trình con)
Võ Thị Thu Hồng 24
5. Lệnh PUSH,POP (Ví dụ)
PUSH direct; Opcode 2bytes : C0H và byte địa chỉ direct

SP 07H 81H SP 08H 81H SP 09H 81H SP 0AH 81H

D4H D4H 21H D4H 21H D4H


21H 21H
34H 20H 34H 20H 34H 20H 34H 20H
Vùng STACK

0AH 0AH 0AH 12H 0AH


09H 09H 34H
34H 09H 34H 09H
08H 6BH
6BH 08H 6BH
6BH 08H 6BH 08H
07H 07H 07H 07H

12H 01H R1 12H 01H R1 12H 01H 12H 01H


R1 R1
6BH 00H R0 6BH 00H R0 6BH 00H 6BH
R0 R0 00H
Ban đầu Sau lệnh 1 Sau lệnh 2 Sau lệnh 3
PUSH 0 PUSH 20H PUSH 01H
Võ Thị Thu Hồng 25
5. Lệnh PUSH,POP (Ví dụ)
POP direct ; Opcode 2bytes : D0H và byte địa chỉ direct

SP 0AH 81H SP 09H 81H SP 08H 81H SP 07H 81H

D4H D4H 21H D4H 21H 6BH 21H


21H
34H 20H 12H 20H 34H 20H 34H 20H

12H 0AH 12H 0AH 12H 0AH 12H 0AH


34H 09H 34H 09H 34H 09H 34H 09H
6BH 08H 6BH 08H 6BH 08H 6BH 08H
07H 07H 07H 07H

R1 12H 01H R1 12H 01H R1 12H 01H R1 12H 01H


6BH 00H 6BH 00H R0 34H 00H R0 6BH 00H
R0 R0
Sau lệnh 3 Sau lệnh 4 Sau lệnh 5 Sau lệnh 6
POP 20H POP 00H POP 21H
Võ Thị Thu Hồng 26
5. Lệnh PUSH,POP (Ví dụ)
Cho đoạn chương trình:
HEX Opcode
0000 ORG 0000H
0000 75 81 0A MOV SP, #0AH ; SP=0AH
0003 79 23 MOV R1, #23H ; R1= 23H
0005 7A 34 MOV R2, #34H ; R2= 34H
0007 7B F2 MOV R3, #0F2H ; R3= F2H
0009 C0 01 PUSH 1 ; SP=0BH (0BH) = 23H
000B C0 02 PUSH 2 ; SP=0CH (0CH)=34H
000D C0 03 PUSH 3 ; SP=0DH (0DH)=F2H
000F D0 04 POP 4 ; R4=(04H)=F2H SP=0CH
0011 D0 05 POP 5 ; R5=(05H)=34H SP=0BH
0013 D0 06 POP 6 ; R6=(06H)=23H SP=0AH
0013 END

Võ Thị Thu Hồng 27


5. Lệnh PUSH,POP (Ví dụ)
Cho đoạn chương trình:
HEX Opcode
00FDH ORG 00FDH
00FDH 75 81 0B MOV SP,#0BH ; SP=0BH
0100 75 F0 10 MOV B,#57H ; B=57H
0103 75 E0 34 MOV Acc,#34H ; A= 34H
0106 7F 00 PUSH B ; SP=0CH (0CH)=57H
0108 12 02 34 LCALL CT1 ; Gọi CT con CT1
010B F5 90 MOV P1,A

0234 7D 25 CT1: MOV R5,#25H


0236 22 RET
0236 END
Võ Thị Thu Hồng 28
5. Lệnh PUSH,POP (Ví dụ)
SP 0EH 81H
0108 12 02 34 LCALL CT1
010B F5 90 MOV P1,A 10H
0FH
01H 0EH
0BH 0DH
0234 7D 25 CT1: MOV R5,#25H 57H 0CH
0BH
0236 22 RET
PC 0234H
0236 END
SP 0CH 81H Sau lệnh LCALL CT1

10H
0FH
01H 0EH
0BH 0DH
57H 0CH
0BH
PC 010BH

Sau lệnh RET


Võ Thị Thu Hồng 29
5. Lệnh PUSH,POP (Ví dụ)
Nếu thêm vào CT1 lệnh POP 0
SP 0EH 81H
0108 12 02 34 LCALL CT1
010B F5 90 MOV P1,A 10H
0FH
01H 0EH
0BH 0DH
0234 7D 25 CT1: MOV R5,#25H 10H 0CH
0BH
0236 D0 00 POP 0
PC 0234H
0238 22 RET
Sau lệnh LCALL CT1
0236 END
SP 0DH 81H SP 0BH 81H

01H 0EH 01H 0EH


0BH 0DH 0BH 0DH
57H 57H 0CH Không quay
0CH
0BH về đúng vị trí
01H 00H 01H 00H sau LCALL
PC 0238H PC 0B57H

Sau lệnh POP 0 Võ Thị Thu Hồng Sau lệnh RET 30

You might also like