Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 43 Biên soạn: Phạm Quang Trí
• Ví dụ: AJMP AAA ⇒ Lệnh nhảy đến nhãn AAA (Giả sử: nhãn AAA đặt trước lệnh ở địa chỉ
0F46H, lệnh AJMP nằm trong bộ nhớ tại địa chỉ 0900H và 0901H).
⇒ Mã lệnh:
⇒ Mơ tả lệnh:
0FFFH
2K trang 31
FFFFH
F800H
2K trang 2
2K trang 1
2K trang 0
F800H
1800H
17FFH
1000H
0FFFH
0800H
07FFH
0000H
32 x 2K
(64K)
Bản đồ nhớ 64K được chia thành
32 trang 2K
0F46H
46H
0901H
E1H
0900H
0800H
AJMP AAA
AAA
2K trang 1
A15 A11A10 A0
5 bit xác đònh
trang 2K
11 bit xác đònh đòa chỉ trong
1 trang 2K
Cách
thành lập
đòa chỉ của
nhãn sẽ
nhảy tới
Từ 5 bit (A15 A11)
trong thanh ghi PC
Từ 11 bit (A10 A0) trong
lệnh nhảy
7. ðịnh địa chỉ dài (Long Addressing):
• ðược sử dụng cho các lệnh LCALL và LJMP.
• ðịa chỉ dài là một giá trị 16 bit.
• Tầm nhảy giới hạn là: tồn bộ khơng gian nhớ 64K.
• Số byte của lệnh: 3 byte.
• Cấu trúc lệnh:
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 44 Biên soạn: Phạm Quang Trí
• Ví dụ: LJMP AAA ⇒ Lệnh nhảy đến nhãn AAA (Giả sử: nhãn AAA đặt trước lệnh ở địa chỉ
A209H, lệnh LJMP nằm trong bộ nhớ tại địa chỉ 0100H, 0101H và 0102H).
⇒ Mã lệnh:
⇒ Mơ tả lệnh:
FFFFH
A209H
09H
0102H
A2H
0101H
0000H
LJMP AAA
AAA
64K
12H
0100H
8. ðịnh địa chỉ chỉ số (Indexed Addressing):
• ðược dùng trong các ứng dụng cần tạo các bảng nhảy hay các bảng tìm kiếm. Kiểu định địa chỉ
này dùng một thanh ghi nền (PC hay DPTR) kết hợp với một offset (A) để tạo thành dạng địa
chỉ hiệu dụng cho lệnh.
• Số byte của lệnh: 1 byte.
• Cấu trúc lệnh:
• Ví dụ:
JMP @A+DPTR ⇒ Lệnh nhảy gián tiếp.
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 45 Biên soạn: Phạm Quang Trí
III. TẬP LỆNH CỦA 8051 (8051 INSTRUCTION SET):
Một số ký hiệu dùng trong lệnh:
Rn ðịa chỉ thanh ghi sử dụng (R0 – R7).
direct ðịa chỉ trực tiếp của một byte trong RAM nội (00H-FFH)
@Ri ðịa chỉ gián tiếp sử dụng (R0 hoặc R1).
source Tốn hạng nguồn (Rn, direct hoặc @Ri).
dest Tốn hạng đích (Rn, direct hoặc @Ri).
#data Hằng số 8 bit (#00H - #0FFH).
#data16 Hằng số 16 bit (#0000H - #0FFFFH).
bit ðịa chỉ trực tiếp của một bit (địa chỉ bit).
rel Offset 8 bit có dấu.
addr11 ðịa chỉ 11 bit.
addr16 ðịa chỉ 16 bit.
←
←←
← ðược thay thế bởi …
( ) Nội dung của …
(( )) Nội dung được chứa bởi …
rrr Thanh ghi của dãy thanh ghi (000 = R0, 001 = R1, …, 111 = R7).
i ðịa chỉ gián tiếp sử dụng R0 (i = 0) hoặc R1 (i = 1).
dddddddd Các bit dữ liệu.
aaaaaaaa Các bit địa chỉ.
eeeeeeee ðịa chỉ tương đối.
Một số lưu ý khi lập trình bộ vi điều khiển 8051:
• ðể thơng báo đó là một giá trị tức thời thì cần phải đặt thêm ký hiệu “#” vào trước giá trị đó.
Nếu khơng có ký hiệu “#” thì giá trị đó được hiểu là địa chỉ của ơ nhớ.
MOV A, #12H ;Nạp giá trị 12H vào thanh ghi A.
MOV A, 12H ;Sao chép nội dung của ơ nhớ có địa
;chỉ 12H vào thanh ghi A.
Ở đây ta cũng nên lưu ý rằng nếu thiếu ký hiệu “#” thì lệnh trên cũng khơng gây ra lỗi trong q
trình biên dịch. Vì trình dịch hợp ngữ cho đó là một lệnh hợp lệ. Tuy nhiên, kết quả lập trình sẽ khơng
đúng như ý muốn của người lập trình.
• Các giá trị tức thời nếu có thành phần chữ (A, B, C, …, F) đứng đầu thì cần phải thêm số 0 vào
trước thành phần chữ và sau ký hiệu “#”. Việc này để báo rằng thành phần chữ đó là một số HEX chứ
khơng phải là một ký tự.
MOV A, #BH ;Thiếu số 0 → gây lỗi khi biên dịch.
MOV A, #0BH ;Thêm số 0 → đúng.
MOV A, #F9H ;Thiếu số 0 → gây lỗi khi biên dịch.
MOV A, #0F9H ;Thêm số 0 → đúng.
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 46 Biên soạn: Phạm Quang Trí
Ở đây ta cũng nên lưu ý rằng việc thiếu số 0 thêm vào này sẽ gây lỗi trong q trình biên dịch
đối với các chương trình biên dịch cũ. Ngày nay, một số phần mềm biên dịch đã hỗ trợ việc này. ðiều
này có nghĩa là ta có thể thêm hay khơng thêm số 0 vào thì đều khơng ảnh hưởng gì đến q trình biên
dịch (khơng gây ra lỗi khi biên dịch).
• Trong lệnh, các giá trị tức thời hay địa chỉ của ơ nhớ có thể được biểu diễn dưới bất kỳ dạng nào
BIN (nhị phân), DEC (thập phân) hay HEX (thập lục phân).
o ðịa chỉ ơ nhớ
: các câu lệnh sau đây là tương đương nhau:
MOV A, 64H ;Sao chép nội dung của ơ nhớ có địa
;chỉ 64H vào thanh ghi A.
MOV A, 100 ;Sao chép nội dung của ơ nhớ có địa
;chỉ 64H vào thanh ghi A.
MOV A, 01100100B ;Sao chép nội dung của ơ nhớ có địa
;chỉ 64H vào thanh ghi A.
o Giá trị tức thời:
các câu lệnh sau đây là tương đương nhau:
MOV A, #0C9H ;Nạp giá trị C9H vào thanh ghi A.
MOV A, #201 ;Nạp giá trị C9H vào thanh ghi A.
MOV A, #11001001B ;Nạp giá trị C9H vào thanh ghi A.
Lưu ý các hậu tố đi kèm tương ứng cho từng dạng: B – dạng BIN (nhị phân), H – dạng HEX
(thập lục phân), D hoặc khơng có hậu tố – dạng DEC (thập phân).
• Chuyển một giá trị tức thời hay địa chỉ của ơ nhớ lớn hơn khả năng chứa của một thanh ghi thì
sẽ gây ra lỗi (00H-FFH: cho thanh ghi hoặc ơ nhớ 8 bit; 0000H-FFFFH: cho thanh ghi 16 bit -
DPTR).
MOV A, #123H ;Khơng hợp lệ vì 123H > FFH.
MOV A, #214 ;Hợp lệ vì 214 (D6H) < FFH (255).
MOV A, #0F2H ;Hợp lệ vì F2H < FFH.
MOV A, 123H ;Khơng hợp lệ vì 123H > FFH.
MOV A, 200 ;Hợp lệ vì 200 (C8H) < FFH (255).
MOV DPTR, #123H ;Hợp lệ vì 123H < FFFFH (16 bit).
1. Nhóm lệnh số học:
1.1. Lệnh ADD A, <src-byte>:
• Chức năng: Cộng (Add).
• Mơ tả: ADD cộng nội dung của thanh ghi A (A) với nội dung của một byte có địa chỉ
được chỉ ra trong lệnh (src- byte) và đặt kết quả vào thanh ghi A. Các cờ bị ảnh
hưởng.
o Cờ CY = 1 nếu có số nhớ từ bit 7. Ngược lại CY = 0.
o Cờ AC = 1 nếu có số nhớ từ bit 3. Ngược lại AC = 0.
o Cờ OV = 1 nếu có số nhớ từ bit 6 nhưng khơng có số nhớ từ bit 7 hoặc
nếu có số nhớ từ bit 7 nhưng khơng có số nhớ từ bit 6. Ngược lại OV = 0.
o Khi cộng hai số ngun khơng dấu và có dấu:
Số khơng dấu: CY = 1 Phép tốn có nhớ.
Số có dấu: CY = 1 Số dương = Số âm + Số âm.
Số âm = Số dương + Số dương.
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 47 Biên soạn: Phạm Quang Trí
• Các dạng lệnh:
ADD A, Rn
Số byte 1
Số chu kỳ 1
Mã đối tượng 00101rrr
Hoạt động (A) ← (A) + (Rn)
ADD A, direct
Số byte 2
Số chu kỳ 1
Mã đối tượng 00100101 aaaaaaaa
Hoạt động (A) ← (A) + (direct)
ADD A, @Ri
Số byte 1
Số chu kỳ 1
Mã đối tượng 0010011i
Hoạt động (A) ← (A) + ((Ri))
ADD A, #data
Số byte 2
Số chu kỳ 1
Mã đối tượng 00100100 dddddddd
Hoạt động (A) ← (A) + #data
• Ví dụ: Cho biết trước (A)=C3H, (R0)=47H, (P1)=(90H)=AAH, (47H)=D2H.
Sau khi thực thi lệnh ADD A, R0 thì:
(A)=0AH, CY=1, AC=0, OV=0
Sau khi thực thi lệnh ADD A, 90H hay ADD A, P1 thì:
(A)=6DH, CY=1, AC=0, OV=1
Sau khi thực thi lệnh ADD A, @R0 thì:
(A)=95H, CY=1, AC=0, OV=0
C3HA
47HR0
C3H + D2H = 95H
ADD A, @R0
D2H47H
95HA
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 48 Biên soạn: Phạm Quang Trí
Sau khi thực thi lệnh ADD A, #4EH thì:
(A)=11H, CY=1, AC=1, OV=0
1.2. ADDC A, <src-byte>
• Chức năng: Cộng có cờ nhớ (Add with Carry).
• Mơ tả: ADDC cộng đồng thời nội dung của thanh ghi A (A) với nội dung của byte có địa
chỉ được chỉ ra trong lệnh (src-byte) và cờ nhớ (CY), đặt kết quả vào thanh ghi A.
Các cờ bị ảnh hưởng.
o Cờ CY = 1 nếu có số nhớ từ bit 7. Ngược lại CY = 0.
o Cờ AC = 1 nếu có số nhớ từ bit 3. Ngược lại AC = 0.
o Cờ OV = 1 nếu có số nhớ từ bit 6 nhưng khơng có số nhớ từ bit 7 hoặc
nếu có số nhớ từ bit 7 nhưng khơng có số nhớ từ bit 6. Ngược lại OV = 0.
o Khi cộng hai số ngun khơng dấu và có dấu:
Số khơng dấu: CY = 1 Phép tốn có nhớ.
Số có dấu: CY = 1 Số dương = Số âm + Số âm.
Số âm = Số dương + Số dương.
• Các dạng lệnh:
ADDC A, Rn
Số byte 1
Số chu kỳ 1
Mã đối tượng 00110rrr
Hoạt động (A) ← (A) + (C) + (Rn)
ADDC A, direct
Số byte 2
Số chu kỳ 1
Mã đối tượng 00110101 aaaaaaaa
Hoạt động (A) ← (A) + (C) + (direct)
ADDC A,@Ri
Số byte 1
Số chu kỳ 1
Mã đối tượng 0011011i
Hoạt động (A) ← (A) + (C) + ((Ri))
ADDC A, #data
Số byte 2
Số chu kỳ 1
Mã đối tượng 00110100 dddddddd
Hoạt động (A) ← (A) + (C) + # data
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 49 Biên soạn: Phạm Quang Trí
• Ví dụ: Cho biết trước (A)=C3H, (R0)=47H, (P1)=(90H)=AAH, (47H)=D2H và cờ CY=1.
Sau khi thực thi lệnh ADDC A, R0 thì:
(A)=0BH, CY=1, AC=0, OV=0
C3HA
47HR0
C3H + 47H + 1H = 0BH
ADDC A, R0
0BHA
CY
Sau khi thực thi lệnh ADDC A, 90H hay ADDC A, P1 thì:
(A)=6DH, CY=1, AC=0, OV=1
Sau khi thực thi lệnh ADDC A, @R0 thì:
(A)=96H, CY=1, AC=0, OV=0
Sau khi thực thi lệnh ADDC A, #4EH thì:
(A)=11H, CY=1, AC=1, OV=0
C3HA
4EH
C3H + 4EH + 1H = 12H
ADDC A, #4EH
12HA
1.3. SUBB A, <src-byte>
• Chức năng: Trừ có số mượn (Subtract with Borrow).
• Mơ tả: SUBB trừ nội dung của thanh ghi A (A) với nội dung của byte có địa chỉ được chỉ
ra trong lệnh (src-byte) cùng với cờ nhớ và cất kết quả vào thanh ghi A. Các cờ bị
ảnh hưởng.
o Cờ CY = 1 nếu có số mượn cho bit 7. Ngược lại CY = 0.
o Cờ AC = 1 nếu có số mượn cho bit 3. Ngược lại AC = 0.
o Cờ OV = 1 nếu có số mượn cho bit 6 nhưng khơng có số mượn cho bit 7
hoặc nếu có số mượn cho bit 7 nhưng khơng có số mượn cho bit 6. Ngược
lại OV = 0.
o Khi cộng hai số ngun khơng dấu và có dấu:
Số khơng dấu: CY = 1 Phép tốn có mượn.
Số có dấu: CY = 1 Số dương = Số âm - Số dương.
Số âm = Số dương - Số âm.
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 50 Biên soạn: Phạm Quang Trí
• Các dạng lệnh:
SUBB A, Rn
Số byte 1
Số chu kỳ 1
Mã đối tượng 10011rrr
Hoạt động (A) ← (A) – (C) – (Rn)
SUBB A, direct
Số byte 2
Số chu kỳ 1
Mã đối tượng 10010101 aaaaaaaa
Hoạt động (A) ← (A) – (C) – (direct)
SUBB A, @Ri
Số byte 1
Số chu kỳ 1
Mã đối tượng 1001011i
Hoạt động (A) ← (A) – (C) – ((Ri))
SUBB A, #data
Số byte 1
Số chu kỳ 1
Mã đối tượng 100110100 dddddddd
Hoạt động (A) ← (A) – (C) – #data
• Ví dụ: Cho biết trước (A)=83H, (R0)=78H, (P1)=(90H)=AAH, (78H)=C5H và cờ CY=1.
Sau khi thực thi lệnh SUBB A, R0 thì:
(A)=0AH, CY=0, AC=1, OV=1
Sau khi thực thi lệnh SUBB A, 90H hay SUBB A, P1 thì:
(A)=D8H, CY=1, AC=1, OV=0
Sau khi thực thi lệnh SUBB A, @R0 thì:
(A)=BDH, CY=1, AC=1, OV=0
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 51 Biên soạn: Phạm Quang Trí
Sau khi thực thi lệnh SUBB A, #D6H thì:
(A)=ACH, CY=1, AC=1, OV=0
1.4. INC byte
• Chức năng: Tăng thêm 1 (Increment).
• Mơ tả: Tăng nội dung của byte có địa chỉ được chỉ ra trong lệnh (byte) thêm 1. Các cờ
khơng bị ảnh hưởng.
• Lưu ý: Khi lệnh này được dùng để thay đổi giá trị của một port xuất thì giá trị được dùng
làm dữ liệu ban đầu của port được lấy từ bộ chốt dữ liệu xuất, khơng phải được lấy
từ các chân nhập.
• Các dạng lệnh:
INC A
Số byte 1
Số chu kỳ 1
Mã đối tượng 00000100
Hoạt động (A) ← (A) + 1
INC Rn
Số byte 1
Số chu kỳ 1
Mã đối tượng 00001rrr
Hoạt động (Rn) ← (Rn) + 1
INC direct
Số byte 2
Số chu kỳ 1
Mã đối tượng 00000101 aaaaaaaa
Hoạt động (direct) ← (direct) + 1
INC @Ri
Số byte 1
Số chu kỳ 1
Mã đối tượng 0000011i
Hoạt động ((Ri)) ← ((Ri)) + 1
• Ví dụ: Cho biết trước (A)=C3H, (R0)=69H, (P1)=(90H)=AAH, (69H)=7FH.
Sau khi thực thi lệnh INC A thì: (A)=C4H
Sau khi thực thi lệnh INC 90H hay INC P1 thì: (P1)=(90H)=ABH
Chương 3: Tập lệnh của 8051. Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 52 Biên soạn: Phạm Quang Trí
Sau khi thực thi lệnh INC @R0 thì: (@R0)=(69H)=80H
Sau khi thực thi lệnh INC R0 thì: R0=6AH
1.5. INC DPTR
• Chức năng: Tăng con trỏ dữ liệu (Increment Data Pointer).
• Mơ tả: Tăng nội dung của thanh ghi con trỏ dữ liệu 16-bit thêm 1. Các cờ khơng bị ảnh
hưởng.
Số byte 1
Số chu kỳ 2
Mã đối tượng 10100011
Hoạt động (DPTR) ← (DPTR) + 1
• Ví dụ 1: Cho biết trước (DPTR)=1234H.
Sau khi thực thi lệnh INC DPTR thì:
(DPTR)=1235H với (DPH)=12H và (DPL)=35H
• Ví dụ 2: Cho biết trước (DPH)=12H và (DPL)=FFH.
Sau khi thực thi lệnh INC DPTR thì:
(DPTR)=1300H với (DPH)=13H và (DPL)=00H
• Lưu ý: Khơng có lệnh giãm nội dung của DPTR (DEC DPTR). Nếu muốn giãm nội dung
của DPTR ta phải viết một đoạn chương trình con để thực hiện điều này. Chương
trình con được minh họa như sau:
DEC_DPTR: ;Chương trình con giãm DPTR.
PUSH ACC ;Cất tạm giá trị ACC.
DEC DPL ;Giãm byte thấp của DPTR.
MOV A, DPL ;So sánh byte thấp của DPTR
CJNE A,#0FFH, SKIP ;với FFH.
DEC DPH ;Giãm byte cao của DPTR.
SKIP:
POP ACC ;Phục hồi giá trị ACC.
RET
Không có nhận xét nào:
Đăng nhận xét