Giáo trình Vi điều khiển 8051 Assembly - Chương 2: Lập trình hợp ngữ 8051

Các thanh ghi được sử dụng rộng rãi nhất của 8051 là A (thanh ghi tích luỹ), B, R0 -

R7, DPTR (con trỏ dữ liệu) và PC (bộ đếm chương trình). Tất cả các dữ liệu trên đều

là thanh g hi 8 bit trừ DPTR và PC là 16 bit. Thanh ghi tích luỹ A được sử dụng cho

tất cả mọi phép toán số học và lô-gíc. Để hiểu sử dụng các thanh ghi này ta sẽ giới

thiệu chúng trong các ví dụ với các lệnh đơn giản là ADD và MOV.

pdf19 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 5818 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình Vi điều khiển 8051 Assembly - Chương 2: Lập trình hợp ngữ 8051, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ể lưu dữ liệu nhận vào CPU qua 
các cổng vào-ra. 
2.7.2 Các băng thanh ghi trong 8051. 
Như đã nói ở trước, tổng cộng 32 byte RAM được dành riêng cho các băng thanh ghi 
và ngăn xếp. 32 byte này được chia ra thành 4 băng các thanh ghi trong đó mỗi băng 
có 8 thanh ghi từ R0 đến R7. Các ngăn nhớ RAM số 0, R1 là ngăn nhớ RAM số 1, 
R2 là ngăn nhớ RAM số 2 v.v... Băng thứ hai của các thanh ghi R0 đến R7 bắt đầu từ 
thanh nhớ RAM số 2 cho đến ngăn nhớ RAM số 0FH. Băng thứ ba bắt đầu từ ngăn 
nhớ 10H đến 17H và cuối cùng từ ngăn nhớ 18H đến 1FH là dùng cho băng các 
thanh ghi R0 đến R7 thứ tư. 
R
0 - R
7 
R
0 - R
7 
R
0 - R
7 
R
0 - R
7 
RAM đánh địa 
chỉ theo bit 
RAM băng nhớ 
(Seratch Pad) 
Hình 2.5: Ngăn xếp các thanh nhớ RAM trong 8051. 
00 07 08 0F10 1718 1F 20 2F 30 7F 
Băng0 ... Băng3 
R7 
R6 
R5 
R4 
R3 
R2 
R1 
7 
6 
5 
4 
3 
2 
1 
R0 0 
R7 
R6 
R5 
R4 
R3 
R2 
R1 
F 
E 
D 
C 
B 
A 
9 
R0 8 
R7 
R6 
R5 
R4 
R3 
R2 
R1 
17 
16 
15 
14 
13 
12 
11 
R0 10 
R7 
R6 
R5 
R4 
R3 
R2 
R1 
1F 
1E 
1D 
1C 
1B 
1A 
19 
R0 18 
Bank 0 Bank 1 Bank 2 Bank 3 
Hình 2.6: Các băng thanh ghi của 8051 và địa chỉ của chúng. 
Như ta có thể nhìn thấy từ hình 2.5 băng 1 sử dụng cùng không gian RAM như ngăn 
xếp. Đây là một vấn đề chính trong lập trình 8051. Chúng ta phải hoặc là không sử 
dụng băng 1 hoặc là phải đánh một không gian khác của RAM cho ngăn xếp. 
Ví dụ 2.5: 
Hãy phát biểu các nội dung của các ngăn nhớ RAM sau đoạn chương trình sau: 
 MOV R0, #99H ; Nạp R0 giá trị 99H 
 MOV R1, #85H ; Nạp R1 giá trị 85H 
 MOV R2, #3FH ; Nạp R2 giá trị 3FH 
 MOV R7, #63H ; Nạp R7giá trị 63H 
MOV R5, #12H ; Nạp R5 giá trị12H 
Lời giải: 
Sau khi thực hiện chương trình trên ta có: 
Ngăn nhớ 0 của RAM có giá trị 99H 
Ngăn nhớ 1 của RAM có giá trị 85H 
Ngăn nhớ 2 của RAM có giá trị 3FH 
Ngăn nhớ 7 của RAM có giá trị 63H 
Ngăn nhớ 5 của RAM có giá trị 12H 
2.6.3 Băng thanh ghi mặc định. 
Nếu các ngăn nhớ 00 đến 1F được dành riêng cho bốn băng thanh ghi, vậy băng 
thanh ghi R0 đến R7 nào ta phải truy cập tới khi 8051 được cấp nguồn? Câu trả lời là 
các băng thanh ghi 0. Đó là các ngăn nhớ RAM số 0, 1, 2, 3, 4, 5, 6 và 7 được truy 
cập với tên R0, R1, R2, R3, R4, R5, R6 và R7 khi lập trình 8051. Nó dễ dàng hơn 
nhiều khi tham chiếu các ngăn nhớ RAM này ơví các tên R0, R1 v.v... hơn là số vị 
trí của các ngăn nhớ. Ví dụ 2.6 làm rõ khái niệm này. 
Ví dụ 2.6: 
Hãy viết lại chương trình ở ví dụ 2.5 sử dụng các địa chỉ RAM thay tên các thanh 
ghi. 
Lời giải: 
Đây được gọi là chế độ đánh địa chỉ trực tiếp và sử dụng địa chỉ các vị trí ngăn nhớ 
RAM đối với địa chỉ đích. Xem chi tiết ở chương 5 về chế độ đánh địa chỉ. 
 MOV 00, #99H ; Nạp thanh ghi R0 giá trị 99H 
 MOV 01, #85H ; Nạp thanh ghi R1 giá trị 85H 
 MOV 02, #3FH ; Nạp thanh ghi R2 giá trị 3FH 
 MOV 07, #63H ; Nạp thanh ghi R7giá trị 63H 
MOV 05, #12H ; Nạp thanh ghi R5 giá trị12H 
2.6.4 Chuyển mạch các băng thanh ghi như thế nào? 
Như đã nói ở trên, băng thanh ghi 0 là mặc định khi 8051 được cấp nguồn. Chúng ta 
có thể chuyển mạch sang các băng thanh ghi khác bằng cách sử dụng bit D3 và D4 
của thanh ghi PSW như chỉ ra theo bảng 2.2. 
Bảng 2.2: Bit lựa chọn các băng thanh ghi RS0 và RS1. 
 RS1 (PSW.4) RS0 (PSW.3) 
Băng 0 0 0 
Băng 1 0 1 
Băng 2 1 0 
Băng 3 1 1 
Bit D3 và D4 của thanh ghi PSW thường được tham chiếu như là PSW.3 và PSW.4 vì 
chúng có thể được truy cập bằng các lệnh đánh địa chỉ theo bit như SETB và CLR. 
Ví dụ “SETB PSW.3” sẽ thiết lập PSW.3 và chọn băng thanh ghi 1. Xem ví dụ 2.7 
dưới đây. 
Ví dụ 2.7: 
Hãy phát biểu nội dung các ngăn nhớ RAM sau đoạn chương trình dưới đây: 
 SETB PSW.4 ; Chọn băng thanh ghi 4 
 MOV R0, #99H ; Nạp thanh ghi R0 giá trị 99H 
 MOV R1, #85H ; Nạp thanh ghi R1 giá trị 85H 
 MOV R2, #3FH ; Nạp thanh ghi R2 giá trị 3FH 
 MOV R7, #63H ; Nạp thanh ghi R7giá trị 63H 
MOV R5, #12H ; Nạp thanh ghi R5 giá trị12H 
Lời giải: 
Theo mặc định PSW.3 = 0 và PSW.4 = 0. Do vậy, lệnh “SETB PSW.4” sẽ bật bit RS1 
= 1 và RS0 = 0, bằng lệnh như vậy băng thanh ghi R0 đến R7 số 2 được chọn. Băng 
2 sử dụng các ngăn nhớ từ 10H đến 17H. Nên sau khi thực hiện đoạn chương trình 
trên ta có nội dung các ngăn nhớ như sau: 
Ngăn nhớ vị trí 10H có giá trị 99H 
Ngăn nhớ vị trí 11H có giá trị 85H 
Ngăn nhớ vị trí 12H có giá trị 3FH 
Ngăn nhớ vị trí 17H có giá trị 63H 
Ngăn nhớ vị trí 15H có giá trị 12H 
2.6.5 Ngăn xếp trong 8051. 
Ngăn xếp là một vùng bộ nhớ RAM được CPU sử dụng để lưu thông tin tạm thời. 
Thông tin này có thể là dự liệu, có thể là địa cỉ CPU cần không gian lưu trữ này vì số 
các thanh ghi bị hạn chế. 
2.6.6 Cách truy cập các ngăn xếp trong 8051. 
Nếu ngăn xếp là một vùng của bộ nhớ RAM thì phải có các thanh ghi trong CPU chỉ 
đến nó. Thanh được dùng để chỉ đến ngăn xếp được gọi là thanh ghi con trỏ ngăn 
xếp SP (Stack Pointer). Con trỏ ngăn xếp trong 8051 chỉ rộng 8 bit có nghĩa là nó chỉ 
có thể có thể được các địa chỉ từ 00 đến FFH. 
Khi 8051 được cấp nguồn thì SP chứa giá trị 07 có nghĩa là ngăn nhớ 08 của RAM là 
ngăn nhớ đầu tiên được dùng cho ngăn xếp trong 8051. Việc lưu lại một thanh ghi 
PCU trong ngăn xếp được gọi là một lần cất vào PUSH và việc nạp nội dung của 
ngăn xếp trở lại thanh ghi CPU được gọi là lấy ra POP. Hay nói cách khác là một 
thanh ghi được cất vào ngăn xếp để lưu cất và được lấy ra từ ngăn xếp để dùng tiếp 
công việc của SP là rất nghiêm ngặt mỗi khi thao tác cất vào (PUSH) và lấy ra (POP) 
được thực thi. Để biết ngăn xếp làm việc như thế nào hãy xét các lệnh PUSH và POP 
dưới đây. 
2.6.7 Cất thanh ghi vào ngăn xếp. 
Trong 8051 thì con trỏ ngăn xếp chỉ đến ngăn nhớ sử dụng cuối cùng của ngăn xếp. 
Khi ta cất dữ liệu vào ngăn xếp thì con trỏ ngăn xếp SP được tăng lên 1. Lưu ý rằng 
điều này đối với các bộ vi xử lý khác nhau là khác nhau, đáng chú ý là các bộ vi xử 
lý ´ 86 là SP giảm xuống khi cất dữ liệu vào ngăn xếp. Xét ví dụ 2.8 dưới đây, ta 
thấy rằng mỗi khi lệnh PUSH được thực hiện thì nội dung của thanh ghi được cất vào 
ngăn xếp và SP được tăng lên 1. Lưu ý là đối với mỗi byte của dữ liệu được cất vào 
ngăn xếp thì SP được tăng lên 1 lần. Cũng lưu ý rằng để cất các thanh ghi vào ngăn 
xếp ta phải sử dụng địa chỉ RAM của chúng. Ví dụ lệnh “PUSH 1” là cất thanh ghi 
R1 vào ngăn xếp. 
Ví dụ 2.8: 
Hãy biểu diễn ngăn xếp và con trỏ ngăn xếp đối với đoạn chương trình sau đây. Giả 
thiết vùng ngăn xếp là mặc định. 
 MOV R6, #25H 
 MOV R1, #12H 
 MOV R4, #0F3H 
 PUSH 6 
 PUSH 1 
 PUSH 4 
Lời giải: 
 Sau PUSH 6 Sau PUSP 1 Sau PUSH 4 
0B 0B 0B 0B 
0A 0A 0A 0A F3 
09 09 09 12 09 12 
08 08 25 08 25 08 25 
Bắt đầu SP = 07 SP = 08 SP = 09 SP = 0A 
2.6.8 Lấy nôi dung thanh ghi ra từ ngăn xếp. 
Việc lấy nội dung ra từ ngăn xếp trở lai thanh ghi đã cho là qúa trình ngược với các 
nội dung thanh ghi vào ngăn xếp. Với mỗi lần lấy ra thì byte trên đỉnh ngăn xếp 
được sao chép vào thanh ghi được xác định bởi lệnh và con trỏ ngăn xếp được giảm 
xuống 1. Ví dụ 2.9 minh hoạ lệnh lấy nội dung ra khỏi ngăn xếp. 
Ví dụ 2.9: 
Khảo sát ngăn xếp và hãy trình bày nội dung của các thanh ghi và SP sau khi thực 
hiện đoạn chương trình sau đây: 
 POP 3 ; Lấy ngăn xếp trở lại R3 
 POP 5 ; Lấy ngăn xếp trở lại R5 
 POP 2 ; Lấy ngăn xếp trở lại R2 
Lời giải: 
 Sau POP3 Sau POP 5 Sau POP 2 
0B 54 0B 0B 0B 
0A F9 0A F9 0A 0A 
09 76 09 76 09 76 09 
08 6C 08 6C 08 6C 08 6C 
Bắt đầu SP = 0B SP = 0A SP = 09 SP = 08 
2.6.9 Giới hạn trên của ngăn xếp. 
Như đã nói ở trên, các ngăn nhớ 08 đến 1FH của RAM trong 8051 có thể được dùng 
làm ngăn nhớ 20H đến 2FH của RAM được dự phòng cho bộ nhớ đánh địa chỉ được 
theo bit và không thể dùng trước cho ngăn xếp. Nếu trong một chương trình đã cho 
ta cần ngăn xếp nhiều hơn 24 byte (08 đến 1FH = 24 byte) thì ta có thể đổi SP chỉ 
đến các ngăn nhớ 30 đến 7FH. Điều này được thực hiển bởi lẹnh “MOV SP, #XX”. 
2.6.10 Lệnh gọi CALL và ngăn xếp. 
Ngoài việc sử dụng ngăn xếp để lưu cất các thanh ghi thì CPU cũng sử dụng ngăn 
xếp để lưu cất tam thời địa chỉ của lệnh đứng ngay dưới lệnh CALL. Điều này chính 
là để PCU biết chỗ nào để quay trở về thực hiện tiếp các lệnh sau khi chọn chương 
trình con. Chi tiết về lệnh gọi CALL được trình bỳ ở chương 3. 
2.6.11 Xung đột ngăn xếp và băng thanh ghi số 1. 
Như ta đa nói ở trên thì thanh ghi con trỏ ngăn xếp có thể chỉ đến vị trí RAM hiện 
thời dành cho ngăn xếp. Khi dữ liệu được lưu cất cào ngăn xếp thì SP được tăng lên 
và ngược lại khi dữ liệu được lấy ra từ ngăn xếp thì SP giảm xuống. Lý do là PS được 
tăng lên sau khi PUSH là phải biết lấy chắc chắn rằng ngăn xếp đang tăng lên đến vị 
trí ngăn nhớ 7FH của RAM từ địa chỉ thấp nhất đến địa chỉ cao nhất. Nếu con trỏ 
ngăn xếp đã được giảm sau các lệnh PUSH thì ta nên sử dụng các ngăn nhớ 7, 6, 5 
v.v... của RAM thuộc các thanh ghi R7 đến R0 của băng 0, băng thanh ghi mặc định. 
Việc tăng này của con trỏ ngăn xếp đối với các lệnh PUSH cũng đảm bảo rằng ngăn 
xếp sẽ không với tới ngăn nhớ 0 của RAM (đáy của RAM) và do vậy sẽ nhảy ra khỏi 
không gian dành cho ngăn xếp. Tuy nhiên có vấn đề nảy sinh với thiết lập mặc định 
của ngăn xếp. Ví dụ SP = 07 khi 8051 được bật nguồn nên RAM và cũng thuộc về 
thanh ghi R0 củ băng thanh ghi số 1. Hay nói cách khác băng thanh ghi số 1 và ngăn 
xếp đang dùng chung một không gian của bộ nhớ RAM. Nếu chương trình đã cho 
cần sử dụng các băng thanh ghi số 1 và số 2 ta có thể đặt lại vùng nhớ RAM cho 
ngăn xếp. Ví dụ, ta có thể cấp vị trí ngăn nhớ 60H của RAM và cao hơn cho ngăn 
xếp trong ví dụ 2.10. 
Ví dụ 2.10: 
Biểu diễn ngăn xếp và con trỏ ngăn xếp đối với các lệnh sau: 
 MOV SP, #5FH ; Đặt ngăn nhớ từ 60H của RAM cho ngăn xếp 
 MOV R2, #25H 
 MOV R1, #12H 
 MOV R4, #0F3H 
 PUSH 2 
 PUSH 1 
PUSH 4 
Lời giải: 
 Sau PUSH 2 Sau PUSP 3 Sau PUSH 4 
63 63 63 63 
62 62 62 62 F3 
61 61 61 12 61 12 
60 60 25 60 25 60 25 
Bắt đầuSP=5F SP = 60 SP = 61 SP = 62 

File đính kèm:

  • pdfVi_dieu_khien_8051_ Assembly_02_LapHopNgu.pdf