1. Các cách định địa chỉ
1.3. Định địa chỉ gián tiếp
Làm thế nào để xác định một ô nhớ khi mà địa chỉ của nó là kết quả của một phép tính, hoặc địa chỉ này bị thay đổi khi đang chạy chương trình, điều này thường xảy ra khi cần thâm nhập bảng chữ số hoặc bảng ký tự có địa chỉ liên tiếp nhau. Yêu cầu này được giải quyết bằng cách dùng hai thanh ghi R0 và R1 làm con trỏ, nội dung của chúng chính là địa chỉ của dử liệu, hai thanh ghi này được xác định bởi bít thấp nhất trong mả lệnh (hình 3.1c). Cú pháp hợp ngữ 8051 dùng ký hiệu @ đặt trước ký hiệu thanh ghi R0 hoặc R1 trong cách định địa chỉ gián tiếp .
VD: Nếu nội dung thanh ghi R1 là 40H và nội dung của ô nhớ trong tại địa chỉ 40H là 55H thì lệnh sau
MOV A, @ R1
Sẽ chuyển giá trị 55H vào bộ tích lũy. Cách định địa chỉ gián tiếp rất tiện lợi khi tác động lên vùng nhớ có địa chỉ liên tiếp
Ví dụ: Các lệnh sau đây sẽ xóa một vùng RAM trong có địa chỉ từ 60H đến 7FH.
MOV R0, # 60H Loop: MOV @ R0, # 0 INC R0
CJNE R0, # 80H, Loop
Lệnh đầu tiên đặt địa chỉ đầu tiên của vùng nhớ vào R0, lệnh thứ hai áp dụng cách định địa chỉ gián tiếp để chuyển giá trị 00H vào ô nhớ được trỏ đến bởi R0, lệnh thứ ba tăng con trỏ R0 đến địa chỉ tiếp theo và lệnh cuối cùng kiểm tra xem R0 đã trỏ đến ô nhớ cuối cùng chưa, ở đây địa chỉ so sánh là 80H thay vì 7FH để bảo đãm ô nhớ 7FH bị xóa trước khi kết thúc chương trình.