Cộng không cờ nhớ ADD 2.. Hiệu chỉnh BCD DA... Các lệnh ảnh hưởng cờ Lệnh Cờ.
Trang 1Nhóm lệnh số học
của 8051
Trang 2Nhóm lệnh số học của 8051
1 Cộng không cờ nhớ (ADD)
2 Cộng qua cờ nhớ (ADDC)
3 Trừ (SUBB)
4 Tăng 1 (INC) / giảm 1 (DEC)
5 Nhân (MUL)
6 Chia (DIV)
7 Hiệu chỉnh BCD (DA)
Trang 3Các lệnh ảnh hưởng cờ
Lệnh
Cờ
Trang 4Cộng không cờ nhớ (ADD)
Các lệnh cộng
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
ADDC A, Rn 0 0 1 1 1 n 2 n 1 n 0 38 ÷ 3F A A + Rn +
CY
1
ADDC A, direct 0
a 7
0
a 6
1
a 5
1
a 4
0
a 3
1
a 2
0
a 1
1
a 0
35 Byte 2
A A + (direct) + CY
1
ADDC A, @Ri 0 0 1 1 0 1 1 i 36 ÷ 37 A A + (Ri) +
CY
1
ADDC A, #data 0
d 7
0
d 6
1
d 5
1
d 4
0
d 3
1
d 2
0
d 1
0
d 0
34 Byte 2
A A + data + CY
1
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
ADD A, Rn 0 0 1 0 1 n 2 n 1 n 0 28 ÷ 2F A A + Rn 1 ADD A, direct 0
a 7
0
a 6
1
a 5
0
a 4
0
a 3
1
a 2
0
a 1
1
a 0
25 Byte 2
A A+(direct) 1 ADD A, @Ri 0 0 1 0 0 1 1 i 26 ÷ 27 A A + (Ri) 1 ADD A, #data 0
d 7
0
d 6
1
d 5
0
d 4
0
d 3
1
d 2
0
d 1
0
d 0
24 Byte 2
A A + data 1
Trang 5Lệnh ADD
MOV A,#25H; A=25H
ADD A ,#8BH; A= 25H + 8BH= B0H
(Opcode 24H 8BH)
AC=1 C=0 OV=0
1 0 1 1 0 0 0 0
0 0 1 0 0 1 0 1
1 0 0 0 1 0 1 1
+
AC=1
B 0 H
2 5 H
8 B H
+
AC=1
0
C=0
(+37) (-117) (-80)
Trang 6MOV A,# 8CH; A=8CH
MOV 6,#0A4H; (06H)= A4H
ADD A ,R6 ; A=30H
(Opcode 2EH)
AC=1 C=1 OV=1
0 0 1 1 0 0 0 0
1 0 0 0 1 1 0 0
1 0 1 0 0 1 0 0
+
AC=1
3 0 H
8 C H
A 4 H
+
AC=1 C=1
(-116)
C=1 0
(-92) (+48) Sai
Lệnh ADD
Mặc định các thanh ghi
Rn đều ở Bank 0
Trang 7MOV A,# 12H; A=12H
MOV 4,#0F5H; (04H)= F5H
SETB C ; đặt C=1
ADDC A , 4; A=08H
(Opcode 35H 04H)
AC=0 C=1 OV=0
0 0 0 0 1 0 0 0
0 0 0 1 0 0 1 0
1 1 1 1 0 1 0 1
+
AC=0
0 8 H
1 2 H
F 5 H
+
1 (C) 1 ( C )
C=1 1
Lệnh ADDC
Trang 8Võ Thị Thu Hồng 8
Cộng 2 số nhị phân 16 bits
95H
41H
53H
R1 C9H R0 MOV A, R0 (1)
(2)
ADD A, R2
(3)
MOV R4, A
+ +
(4)
MOV A, R1
(5)
ADDC A, R3
(6)
MOV R5, A
C=1
X1
X2
Kết quả
Trang 9Các lệnh trừ
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
SUBB A, Rn 1 0 0 1 1 n 2 n 1 n 0 98 ÷ 9F A A - Rn -
CY
1
SUBB A, direct 1
a 7
0
a 6
0
a 5
1
a 4
0
a 3
1
a 2
0
a 1
1
a 0
95 Byte 2
A A - (direct)
- CY
1
SUBB A, @Ri 1 0 0 1 0 1 1 i 96 ÷ 97 A A - (Ri) -
CY
1
SUBB A, #data 1
d 7
0
d 6
0
d 5
1
d 4
0
d 3
1
d 2
0
d 1
0
d 0
94 Byte 2
A A - data -
CY
1
SUBB A, Src ; A A – Src – C
Chú ý : Nếu muốn trừ không qua cờ C, xóa cờ C trước khi thực hiện lệnh trừ
Trang 10
Lệnh trừ SUBB (ví dụ)
MOV A,# 25H ; A=25H
CLR C ; cho C=0
SUBB A , #60H; A=C5H
(Opcode 94H 60H)
SUBB A , #0B5H ; A=0FH
(Opcode 94H B5H)
AC=0 C=1 OV=0
2 5 H (+37)
6 0 H (+96)
–
C 5 H (- 59)
–
B 5 H (- 75)
1 (C)–
1 0 H (+16)
0 F H (+15)
AC=1 C=0 OV=0
C=1 ( số mượn)
Trang 11Lệnh tăng 1/ giảm 1
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
INC A 0 0 0 0 0 1 0 0 04 A ← A + 1 1 INC Rn 0 0 0 0 1 n 2 n 1 n 0 08 ÷ 0F Rn ← Rn + 1 1 INC direct 0
a 7
0
a 6
0
a 5
0
a 4
0
a 3
1
a 2
0
a 1
1
a 0
05 Byte 2
(direct) ← (direct) + 1
1 INC @Ri 0 0 0 0 0 1 1 i 06 ÷ 07 (Ri) ← (Ri) + 1 1 INC DPTR 1 0 1 0 0 0 1 1 A3 DPTR ←
DPTR + 1
1
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
DEC A 0 0 0 1 0 1 0 0 14 A ← A - 1 1 DEC Rn 0 0 0 1 1 n 2 n 1 n 0 18 ÷ 1F Rn ← Rn - 1 1 DEC direct 0
a 7
0
a 6
0
a 5
1
a 4
0
a 3
1
a 2
0
a 1
1
a 0
15 Byte 2
(direct) ← (direct) - 1
1 DEC @Ri 0 0 0 1 0 1 1 i 16 ÷ 17 (Ri) ← (Ri) - 1 1
Trang 12MOV DPTR ,#10FFH
INC DPTR ; DPTR =1100H ( DPH= 11H DPL=00H)
(Opcode A3H)
để giảm 1 cho DPTR ,giả sử DPTR =1100H:
DEC DPL ; DPL=00H-1=FFH
MOV A,DPL ; cất DPL vào A ( A=FFH)
CJNE A, #0FFH, SKIP ; so sánh A và FFH
; nếu không bằng thì nhảy đến SKIP
DEC DPH ; A=FFH thì giảm tiếp DPH -> DPH=10H
Võ Thị Thu Hồng 12
Trang 13Lệnh tăng 1/ giảm 1 (Ví dụ)
Ví dụ : Xóa ô nhớ trong Ram nội từ địa chỉ 30H đến 40H
Org 0000H
MOV R0, #30H
MOV A,#0
LOOP: MOV @R0,A
INC R0
CJNE R0,# 41H, LOOP
END
Ghi Chú: đoạn chương trình trên có 17 vòng lặp
Gợi ý: thử viết lại chương trình trên dùng lệnh DEC
Trang 14Lệnh nhân MUL
Kết quả A*B gồm 2 bytes , A<- byte thấp,B<- byte cao
Cờ OV=1 khi A*B>255 (byte cao khác 0)
VD1: MOV A,#57H;
MOV B,#41H;
MUL AB ; A*B=1617H, B=16H A=17H OV=1
VD2: MOV A,#02H;
MOV B,#1AH;
MUL AB ; A*B=0034H, B=00H A=34H OV=0
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
MUL AB 1 0 1 0 0 1 0 0 A4 A ← (A x B) 7 ÷ 0
B ← (A x B) 15 ÷ 8
4
Trang 15Lệnh chia DIV
Kết quả A chia cho B , A<- thương số,B<- số dư
Cờ OV=1 khi A/0 (số chia=0)
VD1: MOV A,#24;
MOV B,#05H;
DIV AB ; A=04H B=04H OV=0
VD2: MOV A,#28H;
MOV B,#00H;
DIV AB ; A=28H, B=00H OV=1
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
DIV AB 1 0 0 0 0 1 0 0 84 A ← thương số
B ← số dư
4
Trang 16Võ Thị Thu Hồng 16
Lệnh chia DIV (Ví dụ)
Ví dụ : đổi số nhị phân 8 bits trong thanh ghi R0 sang
số BCD ,kết quả chứa trong 3 thanh ghi R7, R6,R5
ORG 0
MOV A, R0
MOV B,#10
DIV AB
MOV R5,B
MOV B,#10
DIV AB ;
MOV R6, B
MOV R7,A
END
TRĂM CHỤC ĐƠN VỊ
Gợi ý: thử viết lại chương trình trên theo cách khác
Trang 17Hiệu chỉnh BCD DA
Hiệu chỉnh giá trị trong A thành 2 số BCD nén
+ Lệnh DA không có tác dụng sau lệnh INC hay DEC
+ Lệnh DA không đổi số nhị phân ra BCD
Mnemonic Opcode (binary) Opcode
(HEX)
Diễn giải Số MC
D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
DA A 1 1 0 1 0 1 0 0 D4
Hiệu chỉnh nội dung của A thành số BCD 1
Trang 18Hiệu chỉnh BCD DA (Ví dụ)
VD1: MOV A,#29H;
MOV B,#15H;
ADD A,B; A<- 29H+15H=3EH
DA A ; A <- 44H
VD2: MOV A,#99H;
MOV B,#22H;
ADD A,B; A<- 99H+22H=BBH
DA A ; A <- 21H
2 9
1 5
4 4
+
9 9
2 2
2 1
+
1
1
Trang 19Hiệu chỉnh BCD DA (Ví dụ)
VD:Cộng 2 số BCD nén, 4 chữ số Số X1 chứa trong ô nhớ
31H và 30H, số X2 chứa trong ô nhớ 33H và 32H Kết quả
chứa vào 31H và 30H
MOV A,30H
ADD A,32H
DA A
MOV 30H,A
MOV A, 31H
ADDC A,33H
DA A
MOV 31H,A
31H 15H 23H 30H
X1
X2
64H
31H 80H 04H 30H
Kết quả