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 •
Trang 1Lập trình hợp ngữ cho bộ
VĐK 8051
Bài 3
Bộ môn TĐ Khoa KTĐK
Trang 3Mã đố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
Trang 4Mã đối tượng của 8051
Trang 5Mã đối tượng của 8051
Trang 6Cá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
Trang 82.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ỳ
ới ộ h h hi
tới một thanh ghi
– Mov R4, R7 ; không hợp lệ
– Kiểm tra danh sách lệnh trước khi sử dụng 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 (…)
Trang 93.Chế độ định địa chỉ trực tiếp
• Thực hiện với các dữ liệu được lưu giữ trong RAM và các thanh ghi
– Mọi vị trí bộ nhớ có thể truy cập được thông qua các địa chỉ
T t ới á thiết bị i i (SFR) á th h hi á ổ
– Tương tự với các thiết bị ngoại vi (SFR), các thanh ghi, các cổng
ở 8051
• Sử dụng trực tiếp địa chỉ của toán hạng trong lệnh
Mov a 40H ; A ← mem[40H] (không có dấu # trước 40H)
– Mov a, 40H ; 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 ; giống lệnh trước nhưng có sự khác nhau về
– Mov A, R4 ; 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 địaNgăn xếp ở 8051 chỉ sử dụng trong các chế độ định địa chỉ trực tiếp
Trang 10ế ế
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 Movx A, @R0 ; 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] Movx A, @DPTR ; A←external_mem[DPTR]
– Movx @DPTR, A ; ngược lại
Trang 115.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 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)
Trang 12Ví 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
ORG 300H ;Look-up Table starts at 0x0300
LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
Trang 13Lệ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 (3 byte = 1byte code + 2byte địa chỉ đích) y ( 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 ; nhảy ngắn có điều kiện tới địa chỉ thực
– Jz, jnz rel ; nhảy ngắn có điều kiện tới địa chỉ thực
• 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
– Reti Reti ; trở về từ ISV ; trở về từ ISV
Trang 14Rẽ 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
b t từ ị t í ã lệ h hiệ 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)
Trang 15Cá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
– 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
• Cjne: so sánh và nhảy nếu không bằng nhau
– Cjne A, direct, rel
– Cjne Rn #data rel
– cjne @Rn, #data, rel
Trang 16djnz R2, AGAIN ; lặp lại cho đến khi R2==0
R5 A l kết ả à R5
mov R5, A ; 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
Trang 17Cá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
– Lệnh nhảy dài Nhảy tới địa chỉ đich 2 byte
Trang 18Các lệnh gọi
• Chương trình cong
– Có thể sử dụng lại các đoạn lệnh
• LCALL addr16
– Lệnh gọi dài Đây là lệnh 3 byte ệ gọ 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ố ội d ủ LCALL
– Giống nội dung của LCALL
– 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
Trang 19• 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
Trang 20Cá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
RET ; 1 chu kỳ máy
• Để có thời gian giữ chậm lâu hơn sử dụng các
• Để có thời gian giữ chậm lâu hơn, sử dụng các
bộ định thời
Trang 21Ví dụ về tạo thời gian trễ
• Thời gian thực hiện vòng lặp L3:
acall DELAY CPL A
• Thời gian thực hiện lệnh C1 và C2 ở dầu và cuối L2:
T3 = 3*240*1,085
CPL A sjmp Start DELAY: ; giu cham 1s
mov R5, #4 L1: mov R6, #240 ; C0
• Tổng thời gian do L2, L3 thực hiện
• L1 thực hiện lại L2, L3 4 lần:
T5 = 4* T4
DJNZ R7, L3 DJNZ R6, L2 ; C2 DJNZ R5, L1 ; C3 RET
END