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 Toán hạng nguồn (Rn, direct hoặc @Ri).
dest Toá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 Offset8 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ếukhô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 quá
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àotrướ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.
→ Ở đâ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 quá 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 quá 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ố nguyên không dấu và có dấu:
+ Số không dấu: CY = 1 ↔ Phép toá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:
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.
1.2. ADDC A,
- 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ố nguyên không dấu và có dấu:
+ Số không dấu: CY = 1 ↔ Phép toá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
Ví dụ : Cho biết trước (A)=C3H, (R0)=47H, (P1)=(90H)=AAH, (47H)=D2H và cờ CY=1.
1.3. SUBB A,
- 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 = 1nếu có số mượn cho bit 7. Ngược lại CY = 0.
o Cờ AC = 1nếu có số mượn cho bit 3. Ngược lại AC = 0.
o Cờ OV = 1nế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ố nguyên không dấu và có dấu:
+ Số không dấu: CY = 1 ↔ Phép toá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.
- 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.