Giáo trình Vi điều khiển 8051 Assembly - Chương 5: Các chế độ đánh địa chỉ của 8051

CPC có thể truy cập dữ liệu theo nhiều cách khác nhau. Dữ liệu có thể ở trong

một thanh ghi hoặc trong bộ nhớ hoặc được cho như một giá trị tức thời các cách

truy cập dữ liệu khác nhau được gọi là các chế độ đánh địa chỉ. Chương này chúng ta

bàn luận về các chế độ đánh địa chỉ của 8051 trong phạm vi một số ví dụ.

Các chế độ đánh địa chỉ khác nhau của bộ vi xử lý được xác định như nó được

thiết kế và do vậy người lập trình không thể đánh địa chỉ khác nhau là:

1. tức thời 2. Theo thanh ghi 3. Trực tiếp

4. gián tiếp qua thanh ghi 5. Theo chỉ số

pdf10 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 6339 | Lượt tải: 5download
Tóm tắt nội dung Giáo trình Vi điều khiển 8051 Assembly - Chương 5: Các chế độ đánh địa chỉ của 8051, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
g có thể dùng được để giữ 
địa chỉ của toán hạng nằm trong RAM khi sử dụng chế độ đánh địa chỉ này khi Ro 
và R1 được dùng như các con trỏ, nghĩa là khi chúng giữ các địa chỉ của các ngăn 
nhớ RAM thì trước chúng phải đặt dấu (@) như chỉ ra dưới đây. 
MOV A, @ R0 ; Chuyển nội dung của ngăn nhớ RAM có địa chỉ trong RO và A 
MOV @ R1, B ; Chuyển nội dung của B vào ngăn nhớ RAM có địa chỉ ở R1 
Lưu ý rằng R0 cũng như R1 luôn có dấu “@” đứng trước. Khi không có dấu 
này thì đó là lệnh chuyển nội dung các thanh ghi Ro và R1 chứ không phải dữ liệu 
ngăn nhớ mà địa chỉ có trong R0 và R1. 
Ví dụ 5.3: 
Viết chương trình để sao chép giá trị 55H vào ngăn nhớ RAM tại địa chỉ 40H 
đến 44H sử dụng: 
a) Chế độ đánh địa chỉ trực tiếp 
b) Chế độ đánh địa chỉ gián tiếp thanh ghi không dùng vòng lặp 
c) Chế độ b có dùng vòng lặp 
Lời giải: 
MOV A, #55H ; Nạp A giá trị 55H 
MOV 40H, A ; Sao chép A vào ngăn nhớ RAM 40H 
MOV 41H, A ; Sao chép A vào ngăn nhớ RAM 41H 
MOV 42H, A ; Sao chép A vào ngăn nhớ RAM 42H 
MOV 43H, A ; Sao chép A vào ngăn nhớ RAM 43H 
MOV 44H, A ; Sao chép A vào ngăn nhớ RAM 44H 
b) 
MOV A, # 55H ; Nạp vào A giá trị 55H 
MOV R0, #40H ; Nạp con trỏ R0 = 40 H 
MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ đến 
INC R0 ; Tăng con trỏ. Bây gì R0 = 41H 
MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ 
INC R0 ; Tăng con trỏ. Bây giờ R0 = 42H 
MOV @R0,A ; Sao chép Avào vị trí ngăn nhớ RAM do R0 chỉ 
INC R0 ; Tăng con trỏ. Bây giờ R0 = 43H 
MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ 
MOV @R0, A ;Tăng con trỏ. Bây gờ R0 = 44H 
MOV @R0, A 
c) 
MOV A, # 55H ; Nạp vào A giá trị 55H 
MOV R0, #40H ; Nạp con trỏ địa chỉ ngăn nhớ RAM R0 = 40H 
MOV R2, #05 ; Nạp bộ đếm R2 = 5 
 AGAIN: MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do Ro chi đến 
INC ; Tăng con trỏ Ro 
DJNZ R2, AGAIN ; Lặp lại cho đến khi bộ đếm = 0. 
5.2.5 ưu điểm của chế độ đánh địa chỉ gián tiếp thanh ghi. 
Một trong những ưu điểm của chế độ đánh địa chỉ gián tiếp thanh ghi là nó 
làm cho việc truy cập dữ liệu năng động hơn so với chế độ đánh địa chỉ trực tiếp. 
 Ví dụ 5.3 trình bày trường hợp sao chép giá trị 55H vào các vị trí ngăn nhớ 
của RAM từ 40H đến 44H . 
Lưu ý rằng lời giải b) có hai lệnh được lặp lại với một số lần. Ta có thể tạo ra 
vòng lặp với hai lệnh này như ở lời giải c). Lời giải c) là hiệu quả nhất và chỉ có thể 
khi sử dụng chế độ đánh địa chỉ gián tiếp qua thanh ghi. Vòng lặp là không thể trong 
chế độ đánh địa chỉ trực tiếp. Đây là sự khác nhau chủ yếu giữa đánh địa chỉ trực tiếp 
và gián tiếp. 
Ví dụ 5.4: 
Hãy viết chương trình để xoá 16 vị trí ngăn nhớ RAM bắt đầu tại địa chỉ 60H. 
Lời giải: 
 CLR A ; Xoá A=0 
MOV R1, #60H ; Nạp con trỏ. R1= 60H 
MOV R7, #16H ;Nạp bộ đếm, R7 = 1 6 (10 H dạng hex) 
 AGAIN: MOV @R1, A ; Xoá vị trí ngăn nhớ RAM do R1 chỉ đến 
INC R1 ; Tăng R1 
DJNZ R7, AGAiN ; Lặp lại cho đến khi bộ đếm = 0 
Một ví dụ về cách sử dụng cả R0 và R1 trong chế độ đánh địa chỉ gián tiếp 
thanh ghi khi truyền khối được cho trong ví dụ 5.5. 
Ví dụ 5.5: 
Hãy viết chương trình để sao chép một khối 10 byte dữ liệu từ vị trí ngăn nhớ 
RAM bắt đầu từ 35H vào các vị trí ngăn nhớ RAM bắt đầu từ 60H 
Lời giải: 
MOV R0, # 35H ; Con trỏ nguồn 
MOV R1, #60H ; Con trỏ đích 
MOV R3, #10 ; Bộ đếm 
 BACK: MOV A, @R0 ; Lấy 1byte từ nguồn 
MOV @R1, A ; Sao chép nó đến đích 
INC R0 ; Tăng con trỏ nguồn 
INC R1 ; Tăng con trỏ đích 
DJNZ R3, BACK ; Lặp lại cho đến khi sao chép hết 10 byte 
5.2.6 Hạn chế của chế độ đánh địa chỉ gián tiếp thanh ghi trong 8051. 
Như đã nói ở phần trước rằng R0 và R1 là các thanh ghi duy nhất có thể được 
dùng để làm các con trỏ trong chế độ đánh địa chỉ gián tiếp thanh ghi. Vì R0 và R1 
là các thanh ghi 8 bit, nên việc sử dụng của chúng bị hạn chế ở việc truy cập mọi 
thông tin trong các ngăn nhớ RAM bên trong (các ngăn nhớ từ 30H đến 7FH và các 
thanh ghi SFR). Tuy nhiên, nhiều khi ta cần truy cập dữ liệu được cắt trong RAM 
ngoài hoặc trong không gian mã lệnh của ROM trên chip. Hoặc là truy cập bộ nhớ 
RAM ngoài hoặc ROM trên chíp thì ta cần sử dụng thanh ghi 16 bit đó là DPTR. 
5.2.7 Chế độ đánh địa chỉ theo chỉ số và truy cập bộ nhớ ROM trên chíp. 
Chế độ đánh địa chỉ theo chỉ số được sử dụng rộng rãi trongviệc truy cập các 
phân tử dữ liệu của bảng trong không gian ROM chương trình của 8051. Lệnh được 
dùng cho mục đích này là “Move A, @ A + DPTR”. Thanh ghi 16 bit DPTR là thanh 
ghi A được dùng để tạo ra địa chỉ của phân tử dữ liệu được lưu cất trong ROM trên 
chíp. Do các phân tử dữ liệu được cất trong không gian mã (chương trình) của ROM 
trên chip của 8051, nó phải dùng lệnh Move thay cho lệnh Mov (chủ C ở cuối lệnh là 
chỉ mà lệnh Code). Trong lệnh này thì nội dung của A được bổ xung vào thanh ghi 
16 bit DPTR để tạo ra địa chỉ 16 bit của dữ liệu cần thiết. Xét ví dụ 5.6. 
Ví dụ 5.6: 
Giả sử từ “VSA” được lưu trong ROM có đĩa chỉ bắt đầu từ 200H và chương 
trình được ghi vào ROM bắt đầu từ địa chỉ 0. Hãy phân tích cách chương trình hoạt 
động và hãy phát biểu xem từ “VSA” sau chương trình này được cất vào đâu? 
Lời giải: 
ORG 0000H ; Bắt đầu đốt ROM tại địa chỉ 00H 
MOV DPTR, #200H ; Địa chỉ bẳng trình bày DPTR = 200H 
CLA A ; Xoá thanh ghi A (A = 0) 
MOVC A, @A + DPTR ; Lấy ký tự từ không gian nhớ chương trình 
MOV R0, A ; Cất nó vào trong R0 
INC DPTR ; DPTR = 201, chỉ đến ký tự kế tiếp 
CLR A ; Xoá thanh ghi A 
MOVC A, @A + DPTR ; Lấy ký tự kế tiếp 
MOV R1, A ; Cất nó vào trong R1 
INC DPTR ; DPTR = 202 con trỏ chỉ đến ký tự sau đó 
CLA A ; Xoá thanh ghi A 
MOVC A, @A + DPTR ; Nhận ký tự kế tiếp 
MOV R2, A ; Cắt nó vào R2 
 HERE: SJMP HERE ; Dừng lại ở đây. 
 ; Dữ liệu được đốt trong không gian mã lệnh tại địa chỉ 200H 
ORG 200H 
 MYDATA: DB “VSA” 
 END ; Kết thúc chương trình 
ở trong chương trình nói trên thì các vị trí ngăn nhớ ROM chương trình 200H 
- 2002H có các nội dung sau: 
200 = (‘U’); 201= (‘S’) và 202 = (‘A’). 
Chúng ta bắt đầu với DPTR = 200H và A = 0.Lệnh “MOVC A, @ A + DPTR 
chuyền nội dung của vị trí nhớ 200H trong ROM (200H + 0 = 200H) vào A. 
Thanh ghi A chứa giá trị 55H là giá trị mà ASC của ký tự “U”. ký tự này được 
cất vào R0. Kế đó, DPTR được tăng lên tạo thành DPTR = 201H. A lại được xoá về 
0 để lấy nội dung của vị trí nhớ kế tiếp trong ROM là 201H chưa ký tự “S”. Sau khi 
chương trình này chạy ta có R0 = 55H, R1 = 53H và R2 = 41H là các mã ASCII của 
các ký tự “U”, “S” và “A”. 
Ví dụ 5.7: 
Giả sử không gian ROM bắt đầu từ địa chỉ 250H có chứa “America”, hãy viết 
chương trình để truyền các byte vào các vị trí ngăn nhớ RAM bắt đầu từ địa chỉ 40H. 
Lời giải 
 ; (a) Phương pháp này sử dụng một bộ đếm 
ORG 000 
MOV DPTR, # MYDATA ; Nạp con trỏ ROM 
MOV R0, #40H ; Nạp con trỏ RAM 
MOV R2, #7 ; Nạp bộ đếm 
 BACK: CLR A ; Xoá thanh ghi A 
MOVC A, @A + DPTR ;Chuyển dữ liệu từ khong gian mã 
MOV R0, A ;Cất nó vào ngăn nhớ RAM 
INC DPTR ; Tăng con trỏ ROM 
INC R0 ; Tăng con trỏ RAM 
DJNZ R2, BACK ; Lặp lại cho đếnkhi bộ đếm = 0 
 HERE: SJMP HERE 
 ;-------------- -- không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H 
 MYDATA: DB “AMER1CA” 
 END 
 ;(b) phương pháp này sử dụng ký tự null để kết thúc chuỗi 
ORG 000 
MOV DPTR, #MYDATA ; Nạp con trỏ ROM 
MOV R0, #40 ; Nạp con trỏ RAM 
 BACK: CLR A S ; Xoá thanh ghi A(A=0) 
MOVC A, @A + DPTR ; Chuyển dữ liệu từ không gian mã 
JZ HERE ; Thoát ra nếu có ký tự Null 
MOV DPTR, #MYDATA ; Cất nó vào ngădn nhớ của RAM 
INC @R0, A ; Tăng con trỏ ROM 
INC R0 ; Tăng con trỏ RAM 
SJM BACK ; Lặp lại 
 HERE: SJMP HERE 
 ;------------------ không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H 
 MYADTA: DB “AMER1CA”, 0 ; Ký tự Null để kết thúc chuỗi END 
Lưu ý đến cách ta sử dụng lệnh JZ để phát hiện ký tự NOLL khi kết thúc 
chuỗi 
5.2.8 Bảng xắp xếp và sử dụng chế độ đánh địa chỉ theo chỉ số. 
Bảng xắp xế là khái niệm được sử dụng rất rộng rãi trong lập trình các bộ vi 
xử lý. Nó cho phép truy cập các phần từ của một bảng thường xuyên được sử dụng 
với thao tác cực tiểu. Như một ví dụ, hãy giả thiết rằng đối với một ứng dụng nhất 
định ta cần x2 giá trị trong phạm vi 0 đến 9. Ta có thể sử dụng một bảng xắp xếp thay 
cho việc tính toán nó. Điều này được chỉ ra trong ví dụ 5.8. 
Ví dụ 5.8 
Hãy viết một chương trình để lấy x giá trị cống P1 và gửi giá trị x2 tới cổng 
P2 liên tục. 
Lời giải: 
ORG 000 
MOV DPTR, #300 H ; Nạp địa chỉ bảng xắp xêlps 
MOV A, #0FFH ; Nạp A giá trị FFH 
MOV P1, A ; Đặt cổng P1 là đầu vào 
BACK: MOV A, P1 ; Lấy giá trị X từ P1 
MOVC A, @A + DPTR ; Lấy giá trị X từ bảng XSDQ-TABLE 
MOV P2, A ; Xuất nó ra cổng P2 
SJMP BACK ; Lặp lại 
ORG 300H 
 XSQR - TABLE: 
DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 
END 
Lưu ý bảng lệnh đầu tiên có thể thay bằng “MOV DPTR, #XSQR - TABLE”. 
Ví dụ 5.9: 
Trả lời các câu hỏi sau cho ví dụ 5.8. 
a) Hãy chỉ ra nội dung các vị trí 300 - 309H của ROM 
b) Tại vị trí nào của ROM có giá trị 6 và giá trị bào nhiêu 
c) Giả sử P1 có giá trị là 9 thì giá trị P2 là bao nhiêu (ở dạng nhị phân)? 
Lời giải: 
a) Các giá trị trong các ngăn nhớ 300H - 309H của ROM là: 
300 = (00) 301 = (01) 302 = (04) 303 = (09) 
304 = (10) 4 ´ 4 = 16 = 10 in hex 
305 = (19) 5 ´ 5 = 25 = 19 in hex 
306 = (24) 6 ´ 6 = 36 = 24H 
307 = (31) 308 = (40) 309 = (51) 
b) vị trí chứa giá trị 306H và giá trị là 24H 
c) 01010001B là giá trị nhị phân của 51H và 81 (92 = 81) 
Ngoài việc sử dụng DPTR để truy cập không gian bộ nhớ ROM chương trình 
thì nó còn có thể được sử dụng để truy cập bộ nhớ ngoài nối với 8051 (chương 14). 
Một thanh ghi khác nữa được dùng trong chế độ đánh địa chỉ theo chỉ số là bộ 
đếm chương trình (AppendixA). 
Trong nhiều ví dụ trên đây thì lệnh MOV đã được sử dụng để đảm bảo đính 
rõ ràng, mặc dù ta có thể sử dụng bất kỳ lệnh nào khác chừng nào nó hỗ trợ cho chế 
độ đánh địa chỉ. Ví dụ lệnh “ADD A, @R0” sẽ cộng nội dung ngăn nhớ cho RO chỉ 
đến vào nội dung của thanh ghi A. 

File đính kèm:

  • pdfVi_dieu_khien_8051_ Assembly_05_CheDoanhDiaChi.pdf