I. MỞ ĐẦU:
* Khuôn dạng tổng quát của một dòng lệnh:
[LABEL:] MNEMONIC [OPERAND][,OPERAND]… [;COMMENT]
- Nhãn (Label): biểu thị địa chỉ của dòng lệnh (hoặc dữ liệu) theo sau, được dùng trong trường toán hạng của lệnh nhảy, lệnh rẽ nhánh (SJMP AAA; ACALL BBB; CJNE A, #35H, LOOP; JNB P3.1, TEST_1…).
Lưu ý về nhãn:
+ Do người lập trình tự đặt (không được trùng với từ khoá, mã gợi nhớ, chỉ dẫn, toán tử hoặc ký hiệu tiền định nghĩa).
+ Bắt đầu bằng ký tự chữ, dấu chấm hỏi (?), dấu gạch dưới (_).
+ Dài tối đa 31 ký tự.
+ Kết thúc bằng dấu hai chấm (:).
- Mã gợi nhớ (Mnemonic): biểu diễn các mã của lệnh hoặc các chỉ dẫn của chương trình dịch hợp ngữ (Mã gợi nhớ: ADD, SUBB, INC, …; Chỉ dẫn: ORG, EQU, DB, …).
- Toán hạng (Operand): chứa địa chỉ hoặc dữ liệu mà lệnh sẽ sử dụng. Số lượng toán hạng trong một dòng lệnh phụ thuộc vào từng dòng lệnh (RET– không toán hạng, INC A– một toán hạng, ADD A, R0– hai toán hạng, CJNE A, #12H, ABC– ba toán hạng).
Lưu ý về toán hạng: Trong các lệnh có 2 toán hạng thì toán hạng đầu tiên còn được gọi là
toán hạng đích(Destination), toán hạng thứ hai còn được gọi là toán hạng nguồn(Source).
- Chú thích (Comment): làm cho rõ nghĩa cho chương trình. Các chú thích phải nằm trên cùng một dòng và bắt đầu bằng dấu chấm phẩy (;). Các chú thích nếu nằm trên nhiều dòng thì mỗi dòng cũng phải bắt đầu bằng dấu chấm phẩy (;).
Lưu ý: Chi tiết về phần này xem thêm tại “Chương 7: Lập trình hợp ngữ” trong sách “Họ
vi điều khiển – Tống Văn On”.
II. CÁC KIỂU ĐỊNH ĐỊA CHỈ (ADDRESSING MODE):
1. Định địa chỉ thanh ghi (Register Addressing):
- Được dùng để truy xuất dữ liệu trong các thanh ghi từ R0 đến R7.
- Số byte của lệnh: 1 byte.
- Cấu trúc lệnh:
Ví dụ: ADD A, R5 ⇒Lệnh cộng nội dung thanh ghi A với nội dung thanh ghi R5. (Giả sử:
(A)=05H, (R5)=9AH).
- Ngoài ra, một số trường hợp đặc biệt kiểu định địa chỉ này cũng dùng để truy xuất dữ liệu trong các thanh ghi như: thanh ghi chứa A, thanh ghi con trỏ dữ liệu DPTR, thanh ghi bộ đếm chương trình PC, cờ nhớ C và cặp thanh ghi AB.
Ví dụ: INC A → Lệnh tăng nội dung thanh ghi A.
INC DPTR → Lệnh tăng nội dung thanh ghi DPTR.
2. Định địa chỉ trực tiếp (Direct Addressing):
- Được dùng để truy xuất dữ liệu trong các ô nhớ (00H – FFH) hay trong các thanh ghi (A, B, P0–P3, DPH, DPL,…) của bộ nhớ bên trong chip.
- Số byte của lệnh: 2 byte.
- Cấu trúc lệnh:
Ví dụ: ADD A, P1 ⇔ ADD A, 90H ⇒ Lệnh cộng nội dung thanh ghi A với nội dung thanh ghi
port 1 hay ô nhớ 90H. (Giả sử: (A) = 05H, (P1) = (90H) = 9AH).
3. Định địa chỉ gián tiếp (Indirect Addressing):
- Được dùng để truy xuất dữ liệu trong các ô nhớ “gián tiếp” của bộ nhớ bên trong chip. Các thanh ghi R0 và R1 được dùng để chứa địa chỉ của các ô nhớ gián tiếp (00H – FFH) trong chip. Lưu ý rằng, trước các thanh ghi R0, R1 cần phải có dấu “@”.
- Số byte của lệnh: 1 byte.
- Cấu trúc lệnh:
Ví dụ: ADD A, @R0 ⇒ Lệnh cộng nội dung thanh ghi A với nội dung ô nhớ có địa chỉ chứa
trong thanh ghi R0. (Giả sử: (A) = 05H, (R0) = 3BH, (3BH) = 9AH).
4. Định địa chỉ tức thời (Immediate Addressing):
- Được dùng để truy xuất một hằng số (giá trị biết trước) thay vì là một biến (giá trị không biết trước) như các kiểu định địa chỉ trên. Lưu ý rằng, trước dữ liệu tức thời cần phải có dấu “#”.
- Chế độ định địa chỉ tức thời có thể dùng để nạp dữ liệu vào mọi ô nhớ và thanh ghi bất kỳ ( đối với thanh ghi 8 bit: #00H – #0FFH, đối với thanh ghi 16 bit: #0000H – #0FFFFH ).
- Số byte của lệnh: 2 byte.
- Cấu trúc lệnh:
Ví dụ: ADD A, #9AH ⇒ Lệnh cộng nội dung thanh ghi A với giá trị 9AH. (Giả sử: (A) = 05H).
5. Định địa chỉ tương đối (Relative Addressing):
- Được sử dụng cho các lệnh nhảy.
- Địa chỉ tương đối (hay offset) là một giá trị 8 bit có dấu.
- Tầm nhảy giới hạn là: -128 byte … 127 byte từ vị trí của lệnh tiếp theo sau lệnh nhảy.
- Số byte của lệnh: 2 byte.
- Cấu trúc lệnh:
Ví dụ 1: SJMP AAA ⇒ Lệnh nhảy đến nhãn AAA (Giả sử: nhãn AAA đặt trước lệnh ở địa chỉ
0107H, lệnh SJMP nằm trong bộ nhớ tại địa chỉ 0100H và 0101H).
⇒ Mã lệnh:
⇒Mô tả lệnh: xem hình 3.5.2.1
Ví dụ 2: SJMP AAA ⇒ Lệnh nhảy đến nhãn AAA (Giả sử: nhãn AAA đặt trước lệnh ở địa chỉ
203BH, lệnh SJMP nằm trong bộ nhớ tại địa chỉ 2040H và 2041H).
⇒Mã lệnh:
⇒Mô tả lệnh: xem hình 3.2.5.2.
6. Định địa chỉ tuyệt đối (Absolute Addressing):
- Được sử dụng cho các lệnh ACALL và AJMP.
- Địa chỉ tuyệt đối là một giá trị 11 bit.
- Tầm nhảy giới hạn là: trong cùng trang 2K hiện hành(trang 2K chứa lệnh nhảy).
- Số byte của lệnh: 2 byte.
- Cấu trúc lệnh:
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:
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à: toàn bộ không gian nhớ 64K.
- Số byte của lệnh: 3 byte.
- Cấu trúc lệnh:
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:
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.