Các phần của chương trình được sắp xếp theo trình tự sau :
Các phép gán
Các lệnh khởi động( thiết lập timer, ngắt, nạp các giá trị ban
đầu )
Thân chính của chương trình
Cácchương trình con
Các định nghĩa hằng dữ liệu( DB vàDW )
10 trang |
Chia sẻ: thienmai908 | Lượt xem: 1343 | Lượt tải: 0
Nội dung tài liệu Lập trình hợp ngữ và tóm tắt tập lệnh, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 16
CHƯƠNG III : LẬP TRÌNH HỢP NGỮ VÀ TÓM TẮT TẬP LỆNH
I. LẬP TRÌNH HỢP NGỮ :
Hợp ngữ ( assembly language ) là ngôn ngữ của máy tính có vị trí ở
giữa ngôn ngữ máy và ngôn ngữ cấp cao.Các ngôn ngữ cấp cao như
Pascal,C sử dụng các từ và các phát biểu dễ hiểu hơn. Ngôn ngữ máy (
machine language ) là ngôn ngữ ở dạng số nhị phân của máy tính. Một
chương trình viết bằng ngôn ngữ máy là một chuỗi các byte nhị phân biểu
diễn các lệnh mà máy tính thực thi được.
Hợp ngữ thay thế các mã nhị phân của ngôn ngữ máy bằng các mã gợi
nhớ giúp ta dễ nhớ và dễ lập trình hơn.
Ex : lệnh cộng có mã nhị phân là “10110011” được hợp ngữ thay thế
bằng mã gợi nhớ ADD
Một chương trình viết bằng hợp ngữ không thể được thực thi trực tiếp
.Sau khi được viết xong chương trình này phải được dịch thành ngôn ngữ
máy.
Một chương trình viết bằng hợp ngữ là chương trình viết dưới dạng
các ký hiệu, các mã gợi nhớ … trong đó mỗi phát biểu tương ứng với một
lệnh của ngôn ngữ máy.
Mỗi dòng lệnh được chia thành các trường cách biệt nhau bởi khoãng
trắng hoặc Tab. Khuôn dạng tổng quát của mỗi dòng lệnh như sau:
[ label : ] mnemonic [ operand ][,operand ][, … ] [;comment]
Label: nhãn
Mnemonic : mã gợi nhớ
Operand : toán hạng
Comment : chú thích
a. Trường nhãn :
Nhãn là một loại ký hiệu và được nhận dạng bằng dấu “:” ( kết
thúc nhãn). Nhãn phải được bắt đầu bằng một ký tự chữ, dấu hỏi “?”,dấu
nối dưới “_” và tiếp theo phải là các ký tự chữ,các số, dấu “?”,dấu “_”.
Nhãn có thể dài tối đa là 31 ký tự ở dạng chữ thường hoặc chữ in. 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ử hoặc các ký hiệu tiền định nghĩa ).
b. Trường mã gợi nhớ :
Mã gợi nhớ là các ký hiệu biểu diễn cho các lệnh . Trường mã
gợi nhớ của lệnh theo sau trường nhãn .
Ex : MOV,ANL,SETB ….
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 17
c. Trường toán hạng :
Trường toán hạng theo sau trường mã gợi nhớ. Trường này
chứa địa chỉ hoặc dữ liệu mà lệnh sẽ sử dụng. Một nhãn có thể được dùng
để biểu thị địa chỉ của dữ liệu .Các khả năng của trường toán hạng phụ
thuộc vào thao tác. Có thao tác không có toán hạng (ex: lệnh RET,NOP..)
trong khi các thao tác khác cho phép nhiều toán hạng cách nhau bởi dấu
phẩy.
d. Trường chú thích :
Các ghi chú dùng để làm rõ chương trình được đặt trong trường
chú thích ở cuối dòng lệnh. Các chú thích đượ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 “ ; “ . Các chương trình con và các phần có kích thước lớn của
chương trình thường bắt đầu bởi một khối chú thích bao gồm nhiều dòng
chú thích để giải thích các đặt trưng của chương trình.
II. TÓM TẮT TẬP LỆNH :
Cũng như các bộ vi xử lý 8 bit các lệnh của 8051 có các opcode 8 bit ,
do vậy số lệnh có thể lên đến 256 lệnh ( thực tế có 255 lệnh ,1 lệnh không
được định nghĩa ). Ngoài opcode một số lệnh còn có thêm 1 hoặc 2 byte nữa
cho dữ liệu hoặc địa chỉ . Tập lệnh có 139 lệnh 1 byte , 92 lệnh 2 byte và 24
lệnh 3 byte .
1. 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ý , bộ vi điều khiển . Các kiểu định địa chỉ cho phép ta xác
định rõ nguồn và đích của dữ liệu theo nhiều cách khác nhau phụ thuộc vào
tình huống lập trình ,có 8 kiểu định địa chỉ :
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 )
1.1. ĐỊNH ĐỊA CHỈ THANH GHI :
Kiểu định địa chỉ thanh ghi đựơc ký hiệu là Rn, trong đó n có giá trị từ
0-7, A, DPTR, PC, C và cặp thanh ghi AB.
Ex : ADD A,R7
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 18
Có 4 dãy thanh ghi nhưng ở một thời điểm chỉ có một dãy tích cực. Các dãy
thanh ghi chiếm 32 byte đầu tiên của RAM dữ liệu trên chip ( 00H-1FH ).
Để chọn dãy thanh ghi tích cực ta tác động lên các bit RS1,RS0 của từ trạng
thái chương trình PSW. Khi hệ thống được reset thì dãy thanh ghi 0 mặc
định được tích cực.
1.2. ĐỊNH ĐỊA CHỈ TRỰC TIẾP :
Kiểu định địa chỉ trực tiếp được sử dụng để truy xuất các biến nhớ
hoặc các thanh ghi trên chip.
Ex : MOV A,55H
MOV P1,A ( P1 có địa chỉ 90H )
1.3. ĐỊNH ĐỊA CHỈ GIÁN TIẾP :
Kiểu định địa chỉ gián tiếp được nhận biết nhờ vào ký tự @ đặt trước
R0 hoặc R1. Các thanh ghi R0 và R1 có thể hoạt động như là các con trỏ và
nội dung của chúng chỉ ra địa chỉ trong RAM nơi mà dữ liệu được đọc hay
ghi.Ta cần đến kiểu định địa chỉ gián tiếp khi ta duyệt các vị trí liên tiếp
trong bộ nhớ.
Ex : Thực hiện việc xóa tuần tự RAM nội từ địa chỉ 60H-7FH
MOV R0,#60H
LOOP: MOV @R0,#0
INC R0
CJNE R0,#80H,LOOP
( tiếp tục )
1.4. ĐỊNH ĐỊA CHỈ TỨC THỜI :
Khi toán hạng nguồn là một hằng số thay vì là một biến ,hằng số này
có thể đưa vào lệnh và đây là byte dữ liệu tức thời. Các toán hạng tức thời
được nhận biết nhờ vào ký tự # đặt trước chúng. Toán hạng này có thể là
một hằng số học,một biến hoặc một biểu thức số học sử dụng các hằng số .
Ex : MOV A,#12
MOV DPTR,#8000H
1.5. ĐỊNH ĐỊA CHỈ TƯƠNG ĐỐI :
Kiểu định địa chỉ tương đối chỉ được sử dụng cho các lệnh nhảy .Một
địa chỉ tương đối( còn được gọi là offset ) là một giá trị 8 bit có dấu .Giá trị
này được cộng với bộ đếm chương trình để tạo ra địa chỉ của lệnh tiếp theo
cần được thực thi.
Ex : SJMP THERE
DJNE …
CJNE …
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 19
Định địa chỉ tương đối có điểm lợi là cung cấp cho chúng ta mã không phụ
thuộc vào vị trí , nhưng lại có điểm bất lợi là các đích nhảy bị giới hạn trong
tầm -128 byte đến 127 byte.
1.6. ĐỊNH ĐỊA CHỈ TUYỆT ĐỐI :
Kiểu định địa chỉ tuyệt đối chỉ được sử dụng với các lệnh ACALL và
AJMP. Đây là các lệnh 2 byte 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 . Để không bị giới hạn ta có thể sử
dụng lệnh LCALL, LJMP.
Ex : LOOP:
LCALL GIAI_MA
LJMP LOOP
1.7. ĐỊNH ĐỊA CHỈ DÀI :
Kiểu định địa chỉ dài chỉ được dùng cho các lệnh LCALL và LJMP
các lệnh 3 byte này chứa địa chỉ đích 16 bit . Lợi ích của lệnh này là sử dụng
hết toàn bộ không gian nhớ chương trình 64K, nhưng lại có điểm bất lợi là
lệnh dài đến 3 byte.
1.8. ĐỊNH ĐỊA CHỈ CHỈ SỐ :
Kiểu định địa chỉ chỉ số sử dụng một thanh ghi nền ( hoặc bộ đếm
chương trình hoặc con trỏ dữ liệu ) và một offset ( thanh chứa A ) tạo thành
dạng địa chỉ hiệu dụng cho lệnh JMP hoặc lệnh MOVC.
Ex: MOVC A,@A+
JMP @A+DPTR
2. CÁC LOẠI LỆNH :
Các lệnh của 8051 được chia làm 5 nhóm:
Nhóm lệnh số học
Nhóm lệnh logic
Nhóm lệnh di chuyển dữ liệu
Nhóm lệnh xử lý bit
Nhóm lệnh rẽ nhánh
Ghi chú :
Rn : địa chỉ thanh ghi R0-R7
direct : địa chỉ 8 bit trong RAM nội ( 00H-0FH )
@Ri : địa chỉ gián tiếp sử dụng thanh ghi R0 hoặc R1
source : toán hạng nguồn - có thể là Rn,direct hoặc @Ri
destination : toán hạng đích – có thể là Rn,direct hoặc @Ri
#data : hằng số 8 bit ( Binary,Decimal,Hexa)
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 20
#data 16 : hằng số 16 bit
bit : địa chỉ trực tiếp của một bit
rel : địa chỉ tương đối ( offset ) 8 bit ex : nhãn
addr11 : địa chỉ 11 bit trong trang hiện hành
addr16 : địa chỉ 16 bit
2.1. CÁC LỆNH SỐ HỌC :
ADD A,source : cộng toán hạng nguồn với A
ADD A,#data
ADDC A,source : cộng toán hạng nguồn với A và cờ nhớ
ADDC A,#data
SUBB A,source : trừ bớt A bởi toán hạng nguồn và số mượn ( cờ
nhớ )
SUBB A,#data
INC A : tăng thanh ghi A một đơn vị
INC source
DEC A : giảm thanh ghi A một đơn vị
INC DPTR : tăng thanh ghi DPTR một đơn vị
MUL AB : nhân A với B
DIV AB : chia A bởi B ( A chứa thương số,B chứa số dư )
DA A : hiệu chỉnh thập phân thanh ghi A
2.2. CÁC LỆNH LOGIC :
ANL A,source : AND
ANL A,#data
ANL direct,A
ANL direct,#data
ORL A,source : OR
ORL A,#data
ORL direct,A
ORL direct,#data
XRL A,source : XOR
XRL A,#data
XRL direct,A
XRL direct,#data
CLR A : xóa thanh ghi A
CPL A : lấy bù A
RL A : quay trái A (MSB=>LSB)
RLC A : quay trái A với cờ C
RR A : quay phải A ( LSB=>MSB)
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 21
RRC A : quay phải A với cờ C
SWAP A : hoán đổi hai nibble ( hai nữa 4 bit )
2.3. CÁC LỆNH DI CHUYỂN DỮ LIỆU :
MOV A,source : di chuyển toán hạng nguồn đến toán hạng
đích
MOV A,#data
MOV dest,A
MOV dest,source
MOV dest,#data
MOV DPTR,#data16
MOVC A,@A+DPTR : di chuyển từ bộ nhớ chương trình
MOVC A,@A+PC
MOVX A,@Ri : di chuyển từ bộ nhớ dữ liệu
MOVX A,@DPTR
MOVX @Ri,A
MOVX @DPTR,A
PUSH direct : cất vào stack
POP direct : lấy ra từ stack
XCH A,source : trao đổi các byte
XCHD A,@Ri : trao đổi các digit thấp
2.4. CÁC LỆNH THAO TÁC TRÊN BIT :
CLR C : xóa bit
CLR bit : set bit bằng 1
SETB C
SETB bit
CPL C : lấy bù bit
CPL bit
ANL C,bit : AND bit với C
ANL C,/bit : AND NOT bit với C
ORL C,bit : OR bit với C
ORL C,/bit : OR NOT bit với C
MOV C,bit : di chuyển bit đến bit
MOV bit,C
JC rel : nhảy nếu C bằng 1
JNC rel : nhảy nếu C bằng 0
JB bit,rel : nhảy nếu bit bằng 1
JNB bit,rel : nhảy nếu bit bằng 0
JBC bit,rel : nhảy nếu bit bằng 1 rồi xóa bit
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 22
2.5. CÁC LỆNH RẼ NHÁNH :
ACALL addr11 : gọi chương trình con
LCALL addr16
RET : quay về từ chương trình con
RETI : quay về từ trình phục vụ ngắt
AJMP addr11 : nhảy
LJMP addr16
SJMP rel
JMP @A+DPTR
JZ rel : nhảy nếu A bằng 0
JNZ rel : nhảy nếu A khác 0
CJNE A,direct,rel : so sánh và nhảy
CJNE A,#data,rel
CJNE Rn,#data,rel
DJNZ Rn,rel : giảm và nhảy nếu khác không
DJNZ direct,rel
NOP : không làm gì
III. CẤU TRÚC CHƯƠNG TRÌNH :
1. TỔ CHỨC CHƯƠNG TRÌNH :
Các phần của chương trình được sắp xếp theo trình tự sau :
Các phép gán
Các lệnh khởi động ( thiết lập timer, ngắt , nạp các giá trị ban
đầu … )
Thân chính của chương trình
Các chương trình con
Các định nghĩa hằng dữ liệu ( DB và DW )
Gán :
Việc định nghĩa các hằng số bằng phát biểu gán làm cho
chương trình dễ đọc và bảo trì hơn. Các hằng số được dùng trong suốt
chương trình bằng cách thay thế các giá trị bằng các ký hiệu đã được gán.
Khi chương trình được dịch thì các giá trị tương ứng được thay thế cho
các ký hiệu.
Chương trình con :
Khi các chương trình trở nên lớn, ta phải chia nhỏ các thao tác
lớn và phức tạp thành các thao nhỏ và đơn giản. Các thao tác nhỏ và đơn
giản này được lập trình thành các chương trình con. Các chương trình
con được bắt đầu bằng một nhãn và kết thúc bằng lệnh RET hoặc RETI.
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 23
Các chỉ dẫn :
Các chỉ dẫn là các lệnh đối với trình dịch hợp ngữ.
ORG : chỉ dẫn ORG dùng để thiết lập một gốc mới của chương
trình cho các phát biểu theo sau.
Ex : ORG 0000H
ORG 0030H
END : là chỉ dẫn thông báo cho trình dịch hợp ngữ biết đã kết thúc
chương trình nguồn. END là phát biểu cuối cùng của chương trình.
EQU ( equate ) : chỉ dẫn EQU gán giá trị số cho tên của ký hiệu
được định nghĩa.
Ex : N27 EQU 27
HERE EQU $
DATA EQU 50H
BIT : chỉ dẫn BIT gán giá trị bit vào tên của ký hiệu.
Ex : MOTOR BIT P0.0
DB : chỉ dẫn DB dùng để gán một hằng số vào bộ nhớ chương
trình, các biểu thức theo sau có thể là một chuỗi của một hay nhiều
giá trị byte. Chỉ dẫn DB cho phép chuỗi ký tự (đặt trong hai dấu
nháy đơn ) dài hơn hai ký tự, mỗi ký tự trong chuỗi được biến đổi
thành mã ASCII . Nếu có một nhãn được nhãn được dùng, nhãn
được gán địa chỉ của byte đầu tiên.
Ex : SQUARES: DB 0,1,4,9,16,25
MESSAGE: ‘ LAC HONG UNIVERSITY ‘,0
; chuỗi ký tự kế thúc bởi 0
2. LƯU ĐỒ THUẬT GIẢI :
Lưu đồ thuật giải là các cộng cụ thường dùng cho các giai đoạn khởi
đầu của lập trình hợp ngữ. Lưu đồ thuật giải là công cụ trực quan giúp ta dễ
dàng trình bày và hiểu chương trình hợp ngữ một cách hệ thống. Lưu đồ
thuật giải cho phép một yêu cầu được mô tả dưới dạng “điều gì phải được
thực hiện “ hơn là “thực hiện điều đó bằng cách nào”. Các ký hiệu thường
dùng nhất cho việc lập lưu đồ bao gồm :
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 24
: khối quyết định ,khối này thường đặt ra các câu hỏi cho
các câu trả lời có ( Yes ) hay không ( No ).
: mũi tên chỉ đường đi của chương trình
: khối xử lý
: khối xuất/nhập
: điểm bắt đầu hoặc kết thúc chương trình
: chương trình con
: kết nối qua trang
Bài giảng Vi điều khiển
Biên soạn: Ths Lê Hoàng Anh
Trang 25
Ex : Hãy viết một chương trình xóa các thanh ghi trong RAM nội từ địa chỉ
50H-60H.
Chương trình :
MOV R0,#50H
MOV A,#0
LOOP:
MOV @R0,A
INC R0
CJNE R0,#61H,LOOP
END
Ex : Hãy viết chương trình kiểm tra một nút nhấn S liên tục , nếu nút nhấn
được tác động thì cho phép đèn D sáng và kết thúc chương trình.
Ex : Hãy viết chương trình cho một ổ khóa mật mã gồm 8 công tắc được kết
nối vào port 0, chương trình sẽ kiểm tra nếu mã nhập vào giống với mã mặc
định (00001111) thì cho phép mở khóa K và kết thúc chương trình, khóa K
được kết nối vào chân P1.0 ( quy ước 0: khóa , 1: mở khóa ) .
Begin
Xóa dữ liệu
60H = 0 ?
END
Yes
No
Các file đính kèm theo tài liệu này:
- Chuong_3.pdf