Lưu đồ chương trình- Các khối cơ bản dùng trong lưu đồ chương trình:... Khuôn dạng của một chương trình hợp ngữb... Khuôn dạng của một chương trình hợp ngữc... Khuôn dạng của một c
Trang 1Đại Học Giao Thông Vận Tải Tp.HCM
Giảng viên: TS NGUYỄN HỮU CHÂN THÀNH
Chương 3: Lập trình 8051
Khoa Điện – Điện Tử Viễn Thông
Học phần: Vi Xử Lý
Trang 2Chương 3 bao gồm 4 nội dung:
1 Các khái niệm cơ bản về lập trình cho VXL và VĐK
2 Các kiểu định địa chỉ.
3 Tập lệnh.
4 Các kỹ thuật lập trình.
Trang 3I Các khái niệm cơ bản về lập trình cho VXL và VĐK
Trang 41 Chương trình
Tất cả các họ vi xử lý khác nhau có thể thực hiện được mọi công việc mà ta có thể thấy trong cuộc sống, từ điều khiển các quá trình phức tạp, truyền thông, trò chơi điện tử… Một câu hỏi đặt ra là: vậy thì cái gì đặc trưng cho bộ vi xử lý để nó có thể thực hiện chức năng riêng biệt của vi xử lý Đó
chính là phần mềm (software), hay chương trình.
Trang 5- Có nhiều loại ngôn ngữ lập trình:
+ Ngôn ngữ máy (machine language)
Mã nhị phânMã bát phân hoặc thập lục phân+ Hợp ngữ (assembly language) [cần có assembler – trình dịch hợp ngữ]
Mã kí hiệu+ Ngôn ngữ cấp cao [cần có compiler – trình biên dịch]
Pascal, Fortran, Basic, C, C++, …
Trang 62 Lưu đồ chương trình
- Bước đầu tiên của việc lập trình là xác định rõ ràng mục
đích của chương trình và trình tự cần thiết để đạt mục đích đó Một trong những công cụ quan trọng trong việc phát
triển chương trình là lưu đồ chương trình.
- Lưu đồ chương trình là biểu diễn bằng hình ảnh thứ tự các thao tác cần làm để giải quyết một vấn để cụ thể Lưu đồ
chương trình không phụ thuộc ngôn ngữ lập trình hoặc loại
vi xử lý cụ thể nào Lưu đồ chương trình chỉ phụ thuộc vào
Trang 72 Lưu đồ chương trình
- Các khối cơ bản dùng trong lưu đồ chương trình:
Trang 82 Lưu đồ chương trình
- Rất nhiều người lập trình khi mới bắt đầu với việc lập trình
thường không thích sử dụng lưu đồ chương trình vì nghĩ rằng việc vẽ lưu đồ là tốn thời gian Điều này chỉ đúng với các chương trình ngắn và đơn giản, nhưng trường hợp chương trình dài hơn thì nếu không có lưu đồ sẽ rất dễ bị rối rắm Lưu đồ chương trình giúp sắp xếp các ý tưởng và lời giải của từng vấn đề riêng biệt Sau khi hoàn thành lưu đồ, ta có thể trao đổi với người khác về ý tưởng của mình Có lưu đồ chương trình thì dù sau một thời gian dài ta vẫn có thể quay lại với chương trình của mình một cách dễ dàng mà không bị “lạc” trong các dòng lệnh
Trang 93 Khuôn dạng của một chương trình hợp ngữ
Một chương trình hợp ngữ có thể bao gồm:
- Các lệnh (instruction) của vi xử lý/vi điều khiển
- Các chỉ dẫn (directive) của trình dịch hợp ngữ
- Các điều khiển (control) của trình dịch hợp ngữ
- Các chú thích (comment)Các lệnh là các mã gợi nhớ quen thuộc và sẽ được dịch ra mã máy
tương ứng với vi xử lý/vi điều khiển Các chỉ dẫn của trình dịch hợp ngữ là các lệnh của trình dịch hợp ngữ dùng để định nghĩa cấu trúc
chương trình, các ký hiệu, dữ liệu, các hằng số… Các điều khiển của trình dịch hợp ngữ thiết lập các chế độ trình dịch hợp ngữ và các luồng hợp dịch trực tiếp Các chú thích giúp cho chương trình dễ đọc bằng cách đưa ra các giải thích về mục đích và hoạt động của các chuỗi
lệnh
Trang 103 Khuôn dạng của một chương trình hợp ngữ
Các dòng chứa các lệnh và các chỉ dẫn phải được viết theo các qui luật mà trình dịch hợp ngữ hiểu được Mỗi dòng được chia thành các trường cách biệt nhau bởi khoảng trắng hay khoảng tab Khuôn dạng tổng quát của mỗi dòng như sau:
Tên (Nhãn) Mã gợi nhớ Các toán hạng Chú thích
trong đó chỉ có trường mã gợi nhớ là bắt buộc Với trình dịch hợp ngữ ASM51, trường mã gợi nhớ không cần ở trên cùng một dòng với trường nhãn Tuy nhiên, trường toán hạng phải ở trên cùng một dòng với trường mã gợi nhớ Có thể viết các dòng này bằng chữ hoa hay chữ thường và chúng sẽ được coi là tương đương vì trình dịch hợp ngữ
Trang 113 Khuôn dạng của một chương trình hợp ngữ
theo phải là các ký tự chữ, các ký số, dấu ‘?’ hay dấu ‘_’ Các tên và nhãn không được trùng với các từ khóa (các mã gợi nhớ, các chỉ dẫn, các toán tử hay các ký hiệu định nghĩa trước) Nói
chung, ta cứ đặt các tên bình thường và có ý nghĩa là sẽ ít bị lỗi Một nhãn được kết thúc bằng dấu ‘:’.
Trang 123 Khuôn dạng của một chương trình hợp ngữ
b Trường mã gợi nhớ
Trường này chứa mã gợi nhớ (mnemonic) cho biết chức
năng của lệnh (ví dụ như ADD, MOV, DIV, MUL, INC…) hay chỉ dẫn của trình dịch hợp ngữ (ví dụ như ORG, END, EQU, DB…) Các chỉ dẫn không được dịch ra mã máy.
Trang 133 Khuôn dạng của một chương trình hợp ngữ
c Trường toán hạng (operand)
Trường này chứa địa chỉ hay dữ liệu mà lệnh sẽ sử dụng
Tùy theo từng loại lệnh mà có thể có 0, 1, 2 hay 3 toán hạng Các toán hạng cách nhau bởi dấu phẩy.
Trang 143 Khuôn dạng của một chương trình hợp ngữ
d Trường chú thích (comment)
Các chú thích để làm rõ chương trình được đặt trong trường chú thích ở cuối dòng lệnh Điều này giúp cho người đọc
chương trình dễ hiểu các thao tác của chương trình hơn Các chú thích cần phải được bắt đầu bằng dấu ‘;’ Các chú thích có thể chiếm nhiều dòng riêng và cũng phải bắt đầu bằng
dấu chấm ‘;’.
Trang 153 Khuôn dạng của một chương trình hợp ngữ
Khi ta viết chương trình bằng kí tự của bảng chữ cái, ta gọi đây là dạng mnemonic (mã gợi nhớ) Vi xử lý/vi điều khiển không hiểu được các chữ cái này Chúng đòi hỏi các lệnh phải được viết dưới dạng đặc biệt gọi là object code (mã đối tượng, mã lệnh) Mnemonic được dùng trong chương trình gốc dưới dạng source code (mã nguồn) do người lập trình viết bằng hợp ngữ hoặc (ngôn ngữ lập trình khác) Còn object code là ngôn ngữ chỉ bao gồm các số 1 và 0, đây là ngôn ngữ mà vi xử lý/vi điều khiển sẽ làm việc được Vi xử lý/vi điều khiển đọc object code từ bộ nhớ dưới dạng các byte và biên dịch các dữ liệu thành lệnh cần thực thi.
Trang 163 Khuôn dạng của một chương trình hợp ngữ
Một số chỉ dẫn của trình dịch hợp ngữ thường dùng:
ORG
Dạng: ORG bieuthuc
Chỉ dẫn ORG thay đổi nội dung bộ đếm chương trình theo giá trị của
bieuthuc để thiết lập nơi bắt đầu mới của chương trình cho các phát
biểu theo sau nó
END
Dạng: ENDEND là phát biểu cuối cùng của chương trình nguồn Nhãn không
Trang 173 Khuôn dạng của một chương trình hợp ngữ
Một số chỉ dẫn của trình dịch hợp ngữ thường dùng:
EQU
Dạng: kyhieu EQU bieuthuc
Chỉ dẫn EQU gán giá trị của bieuthuc cho kyhieu Kyhieu phải là tên
hợp lệ
DB
Dạng: nhan: DB bieuthuc{, bieuthuc][…]
Chỉ dẫn DB thường được dùng để định nghĩa các giá trị byte tương
ứng với các bieuthuc trong bộ nhớ chương trình bắt đầu từ địa chỉ
tương ứng với nhan
Trang 184 Biên dịch chương trình
- Chương trình phải được chuyển sang thành dạng object
code trước khi vi xử lý/vi điều khiển có thể thực hiện
chương trình Quá trình chuyển từ chương trình dạng source code sang object code gọi là biên dịch/hợp dịch
(assembling).
- Sau đó ta nạp object code này vào bộ nhớ vi xử lý/vi điều khiển và vi xử lý/vi điều khiển chạy chương trình
Trang 194 Biên dịch chương trình
- Việc chuyển đổi mnemonic sang object code thường thực
hiện bằng máy tính Trước hết ta dùng một chương trình gọi
là editor để viết và lưu mã nguồn vào bộ nhớ Ta có thể sử dụng editor quen thuộc của Window như Notepad hoặc trong môi trường DOS ta sử dụng lệnh edit trong Norton
Commandor Sau đó ta cho chạy chương trình biên dịch gọi
là assembler, chương trình này sẽ lấy mã lệnh trong bộ nhớ
và biên dịch sang tập tin dưới dạng object code Cuối cùng,
ta dùng một chương khác để nạp object code từ bộ nhớ của máy tính vào bộ nhớ của vi xử lý/vi điều khiển.
Trang 205 Nạp chương trình vào bộ nhớ
- Khi vi xử lý/vi điều khiển được cấp nguồn điện lần đầu hay
được khởi động lại bằng cách kích hoạt vào chân RST thì vi xử lý/vi điều khiển thực hiện một số lệnh bên trong Một trong các lệnh đó là xuất một địa chỉ đặc biệt lên bus địa chỉ và đọc opcode đầu tiên tại địa chỉ đó Đối với Z80, 8080,
8085 và họ MCS-51 thì đó là địa chỉ 0000H Do đó, opcode đầu tiên của chương trình cần thực hiện phải được đặt ở vị trí 0000H trong bộ nhớ chương trình và khi viết chương
trình nên sử dụng chỉ dẫn ORG 0000H ở dòng đầu tiên của
chương trình chính để báo cho trình dịch hợp ngữ biết
Trang 215 Nạp chương trình vào bộ nhớ
- Chương trình được nạp vào bộ nhớ thực chất chỉ là các số
nhị phân hay hex Trong các số này, có số sẽ là opcode, có
số sẽ là dữ liệu được sử dụng bởi các lệnh Việc nhầm lẫn thứ tự lệnh sẽ dẫn đến các kết quả không lường trước được Phương pháp duy nhất để phân biệt giữa opcode và dữ liệu là cần phải biết địa chỉ chính xác của opcode đầu tiên trong chương trình và nạp chương trình đúng vị trí và theo thứ tự.
Trang 22II Các kiểu định địa chỉ
Trang 23II Các kiểu định địa chỉ
Các kiểu định địa chỉ là phần cần thiết cho toàn bộ tập lệnh của mỗi một bộ vi xử lý hay vi điều khiển Các kiểu định địa chỉ cho phép xác định rõ nguồn và đích của dữ liệu theo nhiều cách khác nhau mà vi xử lý hay vi điều khiển sử dụng trong quá trình thực thi lệnh
Có 8 kiểu định địa chỉ đối với họ MCS-51:
- Thanh ghi (register)
- Trực tiếp (direct)
- Gián tiếp (indirect)
- Tức thời (immediate)
- Tương đối (relative)
- Tuyệt đối (absolute)
- Dài (long)
- Chỉ số (index)
Trang 241 Định địa chỉ thanh ghi
-Trong lệnh truy xuất đến các thanh ghi R0 R7 của bank thanh ghi
tích cực Các lệnh này được mã hóa dài 1 byte, trong đó dùng 3 bit thấp nhất để chỉ thanh ghi được truy xuất
- Ngoài ra, trong lệnh cũng có thể truy xuất đến các thanh ghi đặc biệt như: thanh ghi tích lũy (ký hiệu A), con trỏ dữ liệu (ký hiệu DPTR), bộ đếm chương trình (ký hiệu PC), cờ nhớ (ký hiệu C) và cặp thanh ghi AB (ký hiệu AB) Các lệnh này không cần các bit địa chỉ, bản thân opcode của lệnh đã chỉ ra thanh ghi được dùng
Ví dụ: INC R1 ; tăng nội dung thanh ghi R1 lên 1
INC A ; tăng nội dung thanh ghi A lên 1
Trang 252 Định địa chỉ trực tiếp
- Dùng để truy xuất các ô nhớ trong RAM nội (địa chỉ từ 00H 7FH) hay các thanh ghi chức năng đặc biệt (địa chỉ từ 80H FFH) Một byte được thêm vào tiếp theo opcode để xác định địa chỉ OpcodeĐịa chỉ trực tiếp
- Trình dịch hợp ngữ cho phép sử dụng tên các thanh ghi chức năng đặc biệt (thay cho địa chỉ)
Trang 262 Định địa chỉ trực tiếp
Ví dụ:
INC ACC ; tăng nội dung thanh ghi A lên 1
Lệnh này cùng chức năng với lệnh INC A ở trên
nhưng khác kiểu định địa chỉ các byte mã lệnh
khác nhau
MOV P0,A ; chuyển nội dung của thanh ghi A
vào Port 0 ( MOV 80H,A)
INC 30H ; tăng nội dung ô nhớ 30H lên 1
Nội dung 30H ban đầu là #06H, sau lệnh trên
Trang 273 Định địa chỉ gián tiếp
- Trong lệnh dùng các thanh ghi R0 và R1 làm con trỏ để chỉ
ra địa chỉ ô nhớ trong RAM nội mà lệnh tác động đến Bit thấp nhất trong mã lệnh sẽ xác định thanh ghi nào được
dùng.
- Quy ước: dùng dấu @ trước R0 và R1 cho kiểu định địa chỉ này.
Trang 283 Định địa chỉ gián tiếp
INC @R1 ; tăng nội dung ô nhớ được trỏ bởi R1
(R1) = 30H, (30H) = 53H
Trang 293 Định địa chỉ gián tiếp
- Kiểu định địa chỉ này
thường dùng khi truy xuất tới
một vùng nhớ liên tiếp.
Ví dụ: Các bước sau được
thực hiện để xóa 50 ô nhớ
trong RAM nội bắt đầu từ địa
chỉ 30H:
Trang 304 Định địa chỉ tức thời
- Các dữ liệu tức thời được dùng trực tiếp trong lệnh có thể là một hằng số, một ký số, một biểu thức toán học… Trình dịch hợp ngữ sẽ tự động tính toán và thay thế dữ liệu tức thời vào mã lệnh
-Quy ước: dùng dấu # trước các toán hạng tức thời
Ví dụ: MOV A,#7 ; nạp giá trị 7 vào thanh ghi A, (A) = #7H
MOV A,#7+8 ; nạp giá trị 15 vào thanh ghi A, (A) = #0FHMOV A,#‘B’ ; nạp giá trị 66 (mã ASCII của ký tự B) vào
Trang 315 Định địa chỉ tương đối
- Được dùng trong các lệnh nhảy ngắn.
- Một địa chỉ tương đối (hay còn gọi là offset) là một giá trị
8 bit có dấu (từ –128 đến +127) cho biết độ lệch từ vị trí
lệnh theo ngay sau lệnh nhảy đến đích Giá trị này được
cộng thêm vào thanh ghi bộ đếm chương trình (PC) để tạo
ra địa chỉ của lệnh tiếp theo cần được thực thi.
Trang 325 Định địa chỉ tương đối
Trang 335 Định địa chỉ tương đối
-Thông thường các đích nhảy được xác định bằng các nhãn và trình
dịch hợp ngữ sẽ xác định offset tương đối tương ứng.
Ví dụ: Nếu nhãn THERE được đặt ở địa chỉ 1040H và lệnh:
SJMP THEREở trong bộ nhớ chương trình tại địa chỉ 1000H và 1001H địa chỉ của lệnh kế tiếp sẽ là 1000H + 02H = 1002H, nên offset tương đối sẽ là: offset = 1040H – 1002H = 3EH Trình dịch hợp ngữ sẽ gán offset tương đối là 3EH cho byte 2 của lệnh SJMP THERE
- Có ưu điểm là không phụ thuộc vào vị trí nhưng bị giới hạn về tầm nhảy
Trang 346 Định địa chỉ tuyệt đối
- Chỉ dùng trong các lệnh AJMP và ACALL
- Cho phép rẽ nhánh chương trình trong trang 2K hiện hành của bộ nhớ chương trình (tức tầm nhảy của lệnh là trong trang 2K hiện hành của bộ nhớ chương trình)
-11 bit thấp của địa chỉ đích, trong đó 3 bit cao (A8 A10) được đưa
vào cùng với opcode tạo thành byte thứ 1 của lệnh và 8 bit thấp (A0 A7) tạo thành byte thứ 2 của lệnh 5 bit cao của địa chỉ đích là 5 bit cao hiện hành của bộ đếm chương trình (PC) lệnh theo ngay sau lệnh rẽ nhánh và đích đến phải ở trong cùng 1 trang 2K
Trang 356 Định địa chỉ tuyệt đối
Kiểu định địa chỉ này có tầm nhảy bị hạn chế và cung cấp mã phụ thuộc vị trí
Trang 366 Định địa chỉ tuyệt đối
Ví dụ: Nếu nhãn THERE đặt tại địa chỉ 0F46H và lệnh:
AJMP THERE
ở trong bộ nhớ tại địa chỉ 0900H và 0901H lệnh theo ngay sau lệnh nhảy bắt đầu ở địa chỉ 0902H sẽ có 5 bit cao địa chỉ trùng với địa chỉ nhãn THERE là 00001
Mã hoá lệnh:
Trang 377 Định địa chỉ dài
- Chỉ dùng trong các lệnh LCALL và LJMP.
- Đây là các lệnh rẽ nhánh 3 byte, với 2 byte sau (byte 2 và byte 3) là địa chỉ đích của lệnh (16 bit).
- Ưu điểm là có thể sử dụng toàn bộ vùng nhớ chương trình 64K, nhưng lệnh lại dài đến 3 byte và phụ thuộc vào vị trí.
Trang 388 Định địa chỉ chỉ số
- Dùng một địa chỉ nền (chứa trong thanh ghi PC hay DPTR)
và một offset (chứa trong thanh ghi A) để tạo địa chỉ được tác động cho các lệnh JMP hoặc MOVC.
(Địa chỉ được tác động) = (PC) hoặc (DPTR) + (A)
- Thường dùng khi truy xuất dữ liệu trong một bảng dữ liệu đã được định nghĩa trước Khi đó, thanh ghi PC hay DPTR sẽ giữ địa chỉ đầu bảng và thanh ghi A giữ địa chỉ offset của
Trang 398 Định địa chỉ chỉ số
Ví dụ: Bảng các giá trị bình
phương của số nguyên (0^2, 1^2,
2^2, 3^2, 4^2).
Nếu DPTR chứa địa chỉ đầu bảng
(tương ứng nhãn TABLE) và (A)
= #3, thì sau khi thực hiện lệnh:
MOVC A, @A+DPTR (A) = 09H = 3^2.
Trang 40III Tập lệnh