Xem mẫu

  1. Lập trình hợp ngữ cho bộ VĐK 8051 Bài 3 Bộ môn TĐ Khoa KTĐK
  2. 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
  3. 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
  4. 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
  5. Mã đối tượng của 8051
  6. 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ỉ ố
  7. 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ụ:
  8. 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 (…)
  9. 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
  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 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
  11. 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) ố
  12. 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
  13. 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
  14. 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)
  15. 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
  16. 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
  17. 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)
  18. 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
  19. 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
  20. 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