Xem mẫu
- Lập trình hợp ngữ cho bộ
VĐK 8051
Bài 3
Bộ môn TĐ
Khoa KTĐK
- Các chủ đề
• Mã máy
• Cá chế độ đị h đị chỉ của
Các hế định địa hỉ ủ
8051
• Các lệnh Jump, Loop, Call
• Chương trình con
g
• Các vòng lặp tạo thời gian giữ
chậm đơn giản
- Mã đối tượng của 8051
• Trình hợp dịch sẽ chuyển mã hợp ngữ
sang mã máy/mã đối tượng
• Mã đối tượng là một dãy dài các lệnh của
máy
á
• Mỗi lệnh của máy có thể là một hoặc nhiều
byte
• Mỗi lệnh của máy có thể là giá trị nhị phân
y g
và được viết dưới dạng ký hiệu của số Hex
- Mã đối tượng của 8051
• Trình hợp dịch
cung cấp một
tệp .lst trong khi
hợp dịch
p
• Lệnh được dịch
sang mã máy
g y
theo từng dòng
đã viết
- Mã đối tượng của 8051
- Các chế độ định địa chỉ của 8051
• CPU có thể truy cập dữ liệu theo một số cách
sau
– Dữ liệu xác định trực tiếp trong câu lệnh
ế
– Sử dụng các chế độ định địa chỉ khác nhau để lưu giữ
dữ liệu vào bộ nhớ mã lệnh và bộ nhớ dữ liệu
• Có 5 chế độ định địa chỉ
ế
– Tức thời
– Thanh ghi
– Trực tiếp
– Gián tiếp qua thanh ghi
– chỉ số
hỉ ố
- 1. Chế độ định địa chỉ tức thời
• Toán hạng (dữ liệu) được xác định trực tiếp trong
câu lệnh (mã lệnh)
( )
• Toán hạng là một hằng số, nhận được trong khi
hợp dịch
• Trước dữ liệu tức thời phải có dấu “#”
ấ
• Ví dụ:
- 2.Chế độ định địa chỉ qua thanh ghi
• Bao gồm các thanh ghi được sử dụng để lưu dữ liệu
• Đưa toán hạng trong thanh ghi và chuyển nó vào thanh
ghi đã chỉ ra trong câu lệnh
• Thanh ghi nguồn và đích phải phù hợp về kích thước
• Do đó không thể có lệnh chuyển từ một thanh ghi bất kỳ
tới một thanh ghi
ới ộ h h hi
– Mov R4, R7 ; không hợp lệ
– Kiểm tra danh sách lệnh trước khi sử dụng
– Hợp dịch sẽ gây lỗi trong các trường hợp (…)
- 3.Chế độ định địa chỉ trực tiếp
• Th hiệ với các dữ liệu được lưu giữ trong RAM và các
Thực hiện ới á liệ đ l iữ à á
thanh ghi
– Mọi vị trí bộ nhớ có thể truy cập được thông qua các địa chỉ
– T
Tương t với các thiết bị ngoại vi (SFR) các th h ghi, các cổng
tự ới á i i (SFR), á thanh hi á ổ
ở 8051
• Sử dụng trực tiếp địa chỉ của toán hạng trong lệnh
– Mov a, 40H
a ; A ← mem[40H] (không có dấu # trước 40H)
• Địa chỉ thanh ghi là địa chỉ trực tiếp
– Mov A, 4H ; 4H là địa chỉ của R4
– Mov A R4
A, ; giống lệnh trước nhưng có sự khác nhau về
; mã lệnh
• Mọi thanh ghi và SFR đều có địa chỉ
• Ngăn xếp ở 8051 chỉ sử dụng trong các chế độ định địa
chỉ trực tiếp
- 4.Chế độ gián tiếp qua thanh ghi
ế ế
• Thanh ghi được sử dụng như là con trỏ
– Thanh ghi lưu địa chỉ của dữ liệu
• Chỉ có R0, R1 và DPTR có thể được sử dụng cho mục
đích này
• R0 và R1 có thể được sử dụng cho bộ nhớ trong (256
byte bao gồm cả SFR) hoặc từ 00H tới FFH của bộ nhớ
ngoài
– Mov A, @R0 ; A←internal_mem[R0]
– Mov @R1, A ; A←internal_mem[R1]
– Movx A @R0
A, ; A←external_mem[R0]
A←external mem[R0]
• DPTR có thể được sử dụng cho bộ nhớ ngoài, cho cả bộ
nhớ
– Movx A, @DPTR ; A←external_mem[DPTR]
A A←external mem[DPTR]
– Movx @DPTR, A ; ngược lại
- 5.Chế độ định địa chỉ chỉ số
• Sử dụng một thanh ghi để lưu con trỏ cơ
sở và một thanh ghi lưu giá trị offset
• Địa chỉ thực là sum=base+offset
– Chuyển byte mã lệnh có liên quan tới DPTR
vào A. Địa chỉ thực là DPTR +A
• Movc A, @A+DPTR ;A← ext_code_mem[(A+PC)]
• Được sử dụng phổ biến để truy cập các dữ
liệu của bảng, các mảng dữ liệu, tạo tham
số … trong bộ nhớ chương trình (ROM)
ố
- Ví dụ về chế độ định địa chỉ chỉ số
• Lập trình để đọc giá trị x từ P1 và gửi x2 tới P2
ORG 0 ; assembler directive
mov DPTR #LUT ; 300H i th LUT address
DPTR, is the dd
mov A, #0FFH
mov P1, A ; program the p P1 to input data
p g port p
Again: mov A, P1 ; read x
movc A, @A+DPTR ; get x2 from LUT
mov P2 A ; output x2 to P2
P2,
sjmp again ; for (1) loop
ORG 300H ;Look-up Table starts at 0x0300
LUT:
LUT DB 0 1, 4, 9, 16, 25, 36, 49, 64, 81
0, 1 4 9 16 25 36 49 64
- Lệnh điều khiển chương trình
• Rẽ nhánh không điều kiện
– Ajmp addr11 ; nhảy tuyệt đối
– Ljmp addr16
j p ; nhảy dài ( byte = 1byte code + 2byte địa chỉ đích)
y (3 y y y )
– Sjmp rel ; nhảy ngắn tới địa chỉ thực
– Jmp @A+DPTR ; nhảy gián tiếp
• Rẽ nhánh có điều kiện
– Jz jnz rel
Jz, ; nhảy ngắn có điều kiện tới địa chỉ thực
– Djnz rel ; giảm và nhảy nếu khác 0
– Cjne rel ; so sánh và nhảy nếu không bằng nhau
• Gọi chương trình con
– Acall addr11 ; gọi chương trình con tuyệt đối
ố
– Lcall addr16 ; gọi chương trình con dài
– Ret ; trở về từ lệnh gọi chương trình con
– Reti ; trở về từ ISV
- Rẽ nhánh của chương trình - Địa
chỉ đích
• Địa chỉ đích có thể là:
– Tuyệt đối: một địa chỉ vật lý đầy đủ
• Addr16: địa chỉ 16 bit, địa chỉ bất kỳ trong 64K
ấ
• Addr11: địa chỉ 11 bit, địa chỉ bất kỳ trong 2K
– Thực: địa chỉ thực (tăng hoặc giảm) -128 byte tới 127
byte
b t từ vị t í mã lệnh hiệ t i
ị trí ã lệ h hiện tại
• Tính địa chỉ đích để nhảy
– PC của lệnh kế tiếp + địa chỉ thực
ệ p ị ự
– Đối với nhảy lùi, bỏ qua cờ nhớ
• PC=15H, SJMP 0FEH
• Địa chỉ là 15+FE = 13H
ị
• Về cơ bản nhảy tới lệnh kế tiếp trừ 2 (so với lệnh hiện thời)
- Các lệnh nhảy có điều kiện
• jz, jnz: điều kiện là A==0
– Kiểm tra để biết A có bằng 0
– Jz nhảy nếu A=0 và jnz nhẩy nếu A≠0
• djnz: giảm 1 và nhảy nếu không bằng 0
– dinz Rn, rel
– djnz direct, rel
direct
• jnc: điều kiện là cờ nhớ CY
– jc rel
– Jnc rel
• Cjne: so sánh và nhảy nếu không bằng nhau
– Cjne A, direct, rel
– Cjne Rn #data, rel
Rn, #data
– cjne @Rn, #data, rel
- Vòng lặp sử dụng lệnh djnz
• Cộng 3 vào A 10 lần
mov A, #0 ; xoá A
mov R2 #10 ; R2 ← 10
R2,
AGAIN: add A, #03 ; cộng 3 vào thanh ghi A
djnz R2, AGAIN ; lặp lại cho đến khi R2==0
mov R5 A ; l
R5, lưu kết quả vào R5
ả à
• Lặp với vòng lặp sử dụng djnz
mov R3, #100
loop1: mov R2, #10 ; lặp lại 1000 lần
loop2: nop ; không thực hiện
djnz R2, loop2 ; lặp lại loop2 cho đến khi R2==0
j , p ặp ạ p
djnz R3, loop1 ; lặp lại loop1 cho đến khi R3==0
- Các lệnh nhảy không điều kiện
• LJMP addr16
– Lệnh nhảy dài Nhảy tới địa chỉ đich 2 byte
dài.
– Lệnh 3 byte
• SJMP rel
l
– Nhảy tới địa chỉ thực từ PC+127 tới PC-128
– Nhảy tới PC+127 (00H – 7FH)
– Nhảy tới PC-128 (80H - FFH)
- Các lệnh gọi
• Chương trình con
g
– Có thể sử dụng lại các đoạn lệnh
• LCALL addr16
– Lệnh gọ dài. Đây là lệnh 3 byte
ệ gọi y ệ y
– Gọi bất kỳ một chương trình con nằm trong không gian mã lệnh
64K
– PC được lưu trong ngăn xếp
• ACALL addr11
– Lệnh 2 byte
– Gọi bất kỳ một chương trình con trong không gian mã lệnh 2K
– Giống ội dung của LCALL
Giố nội d ủ
– Tiết kiệm bộ nhớ ROM cho các thiết bị có bộ nhớ ROM nhỏ hơn
64K
• RET
– Trở về từ vị trí gọi chương trình con, Nạp lại PC từ ngăn xếp
- Chu
Ch kỳ má
máy
• Số chu kỳ clock cần sử dụng để thực hiện
một lệnh
• Với 8051, một chu kỳ lệnh cần ít nhất 12
chu kỳ clock
• Thời gian trên một chu kỳ máy
– Tmc=số clock trên chu kỳ máy/ tần số clock
ỳ y
– Với 8051 sử dụng tần số clock là 11.0592MHz
• Tmc=12/11.0592 = 1,085µs
• Thời gian để thực hiện một lệnh
– Tinstr=chu kỳ máy cần thực hiện một lệnh * Tmc
– Với lệnh trống, chu kỳ máy =1. Do đó
• Tinstr = 1*1.085 =1,085µs
- Các vòng lặp giữ chậm đơn giản
• Tìm thời gian giữ chậm của chương trình con
DELAY: mov R3, #200 ; 1 chu kỳ máy
HERE: djnz R3, HERE ; 2 chu kỳ máy
RET ; 1 chu kỳ máy
• Tính
– Tổng số chu kỳ máy =200*2+1+1=402
– Thời gian =402*1 085µs (clk=11 0592)
=402 1,085µs (clk=11.0592)
= 436,17µs
• Tương tự như vậy, thời gian giữ chậm có thể
nhận được bất kỳ với cách tổ chức các vòng lặp
ấ ổ
tương ứng
• Để có thời gian giữ chậm lâu hơn sử dụng các
hơn,
bộ định thời
nguon tai.lieu . vn