Chương9 TÓM TẮT TẬP LỆNH I – GIỚI THIỆU: Chương trình được xây dựng nên từ tập lệnh, tuân theo cú pháp và cấu trúc logic. Một họ vi xử lý luôn đi kèm theo tập lệnh của nó. Chương này gới thiệu tập lệnh của họ MCs-51, việc đònh vò và một vài ví dụ về các tình huống gặp phải khi lập trình. Chương này không bàn về kỹ thuật lập trình cũng như về trình biên dòch. Tập lệnh họ vi điều khiển MCx-51 tối ưu cho các điều khiển ứng dụng 8 bit. Nó cung cấp các cách đònh vò nhanh, gọn thuận tiện cho việc truy xuất dữ liệu 8 bit trong vùng RAM nội. Tập lệnh cũng đưa ra một số lệnh thao tác trên bit thuận tiện cho việc điều khiển và các hệ thống logic có yêu cầu xử lý luận lý. Là một xử lý 8 bit, các lệnh của 8051 là mã 8 bit. Do đó tập lệnh có tối đa 256 lệnh. Trong đó 255 lệnh được đònh nghóa. Trong một lệnh, ngoài mã lệnh (1 byte) ra còn có thể có dữ liệu và đòa chỉ. Trong tập lệnh 8051 có 139 lệnh 1 byte, 92 lệnh 2 byte và 24 lệnh 3 byte. Phần phụ lục sẽ mô tả đầy đủ về mỗi mã, về mã gợi nhớ, số byte lệnh, số chu kỳ hành lệnh. II – CÁC MODE ĐỊNH VỊ (ADDRESSING MODE) Khi lệnh thao tác trên dữ liệu, một câu hỏi được đặt ra là “dữ liệu ở đâu?”. Để trả lời câu hỏi này ta xem xét qua các mode đònh vò của 8051. Đònh vò dữ liệu là một phần quan trọng trong tập lệnh. Chúng xác đònh dữ liệu nguồn và đích theo những cách khác nhau tùy theo cách lập trình. Trong phần này ta sẽ lhảo sát kỹ từng mode đònh vò và cho mỗi loại một ví dụ. Có 8 mode đònh vò: Thanh ghi Trực tiếp Gián tiếp Tức thời (Immediate) Tương đối Xa Chỉ số Đònh vò bằng thanh ghi: Người lâp trình truy xuất dữ liệu chứa trong các thanh ghi từ R0 đến R7 thông qua tên gọi của chúng. Đòa chỉ của 8 thanh ghi này được giải mã thông qua bit thấp nhất của chúng. Do đó mã lệnh và toán hạng đòa chỉ được gom chung vào 1 byte. Opcode 5-bit n n n Ví dụ lệnh sau cộng nội dung R7 vào thanh ghi tích luỹ: ADD A, R7; Mã lệnh là 001011111B. Trong đó 5 bit cao 00101 chỉ mã lệnh 3 bit thấp 111 chỉ thanh ghi R7. Một vài lệnh xác đònh trực tiếp trên thanh ghi như thanh ghi tích luỹ, con trỏ dữ liệu …do đó không cần đến các bit đòa chỉ. Bản thân mã lệnh đã mô tả thanh ghi. Đònh vò trực tiếp : Đònh vò trực tiếp có thể truy xuất bất kỳ byte nào trong vùng nhớ nội hoặc các thanh ghi chức năng. Một byte được thêm vào mã lệnh để xác đònh vò trí thanh ghi được dùng. Opcode 8-bit Direct Adress 8- bit Tùy thuộc vào bit cao nhất của byte đòa chỉ trực tiếp, một trong hai vùng nhớ sẽ được chọn. Khi bit 7 của đòa chỉ trực tiếp bằng 0: đòa chỉ trực tiếp có giá trò từ 0 đến 127 (00H – 0FH) và 128 bytes thấp của on chip RAM được tham khảo đến, Tất cả các I/O port, thanh ghi chức năng. Thanh ghi điều khiển, thanh ghi trạng thái có đòa chỉ từ 128 đến 255 (80H-FFh). Khi bit 7=1 byte đòa chỉ trực tiếp nằm trong giới hạn này, tương ứng với thanh ghi chức năng sẽ được truy xuất. Ví dụ port 0 và port 1 có đòa chỉ tương ứng là 80H và 90H. Ta không cần phải biết đòa chỉ của những thanh ghi này, trình biên dòch luôn hiểu các mã gợi nhớ ngắn gọn của nó như P0, P1, TMOD… Đònh vò gián tiếp: Làm thế nào để nhận dạng một biến, nếu đòa chỉ của nó được xác đònh, tính toán, thay đổi khi chương trình đang chạy. Vấn đề này được đặt ra khi thao tác các vò trí nhớ liên tục, chuỗi số, hay xâu ký tự. Thanh ghi và đòa chỉ trực tiếp không thể dùng vì toán hạng đòa chỉ phải được nhân biết trong thời gian biên dòch. Để giải quyết vấn đề trên 8051 sử dụng đòa chỉ gián tiếp. R1 và R0 được coi như những con trỏ. Nội dung của chúng chỉ đến một đòa chỉ nào đó trong RAM khi đọc hoặc ghi dữ liệu. Bit thấp nhất trong byte mã lệnh xác đònh thanh ghi nào (R0 hay R1) được dùng làm con trỏ. Ngôn ngữ assembly của 8051 dùng ký hiệu @ đặt trước R0 hay R1 để mô tả đònh vò gián tiếp. Ví dụ, nếu R1 chứa 40H và tại vò trí 40H trong bộ nhớ nội chứa giá trò 55H, lệnh: MOV A, @R1; Chuyển giá trò 55H vào thanh ghi tích luỹ. Opcode 7-bit i Đònh vò gián tiếp trở nên quan trọng khi phải thao tác từng byte bộ nhớ nội một cách liên tục. Ví dụ những lệnh sau sẽ xóa vùng RAM từ đòa chỉ 60H đến 70H: MOV R0, #60H; MOV @R0, #0; LOOP: INC R0; CJNE R0, #80H, LOOP; Lệnh đầu tiên khởi động thanh ghi với đòa chỉ đầu tiên của khối bộ nhớ. Lệnh thứ hai dùng lệnh gián tiếp để chuyển giá trò 00H vào vò trí được trỏ bởi R0. Lệnh thứ 3 tăng giá trò con trỏ đến đòa chỉ tiếp theo. Và lệnh cuối kiểm tra xem con trỏ đến cuối khối chưa. Lệnh kiểm tra dùng giá trò 80H chứ không phải giá trò 7FH vì việc xảy ra sau việc dòch chuyển gián tiếp. Như vậy chắc chắn cuối cùng sẽ được ghi trước khi kết thúc. Đònh vò tức thời : Khi một toán hạng nguồn là một hằng số không phải là một biến. Hằng số có thể được gom vào trong lệnh như một dữ liệu tức thời. Byte được thêm vào sẽ chứa giá trò. Trong ngôn ngữ assembly toán hạng tức thời được đặt trước bằng ký hiệu số (#). Toán hạng có thể là một hằng số, ký hiệu hoặc toán tử. Trình biên dòch sẽ tính toán giá trò và gán dữ liệu tức thời vào lệnh. Tất cả các lệnh dùng đònh vò tức thời đều sử dụng hằng dữ liệu 8 bit. Ngoại trừ khi khởi động thanh ghi con trỏ dữ liệu (DPTR) MOV DPTR, #40000H; Là một lệnh 3 bytes nạp số 16 bit vào thanh ghi con trỏ. Opcode Immediate data Đònh vò tương đối: Đònh vò tương đối chỉ dùng trong các lệnh jump. Đòa chỉ tương đối (offset) là một số 8 bit có dấu được cộng vào thanh ghi đếm chương trình để chỉ ra đòa chỉ của lệnh tiếp theo phải thi hành. Vì offset là một số 8 bit có dấu nên tầm nhảy chỉ giới hạn trong khoảng cách +127 và –128 vò trí. Trước khi cộng, thanh ghi đếm chương trình tăng lên đến đòa chỉ sau lệnh jump. Vì vậy, đòa chỉ mới là tương đối so với đòa chỉ lệnh kế tiếp chứ không phải đòa chỉ lệnh jump. Thông thường chi tiết này không liên quan đến người lập trình, khi mà đích nhảy đến được mô tả bằng một nhãn. Trình biên dòch sẽ đònh giá trò offset tương đối tương ứng. Ví dụ nếu nhãn THERE được đặt tại lệnh có đòa chỉ 1040H và lệnh SJMP THERE Ở tại vò trí 1000H và 1001H. Trình biên dòch sẽ gán giá trò offset tương đối là 3EH tại byte thứ hai của lệnh. Đònh vò tuyệt đối: Đònh vò tuyệt đối chỉ dùng đối với các lệnh ACALL, AJMP. Lệnh 2 byte này cho phép rẽ nhánh trong phạm vi 2Kbytes bộ nhớ. 5bit cao của đòa chỉ đích là 5 bit cao hiện thời trong thanh ghi đếm chương trìng. Vì vậy lệnh theo sau lệnh rẽ nhánh và lệnh kết thúc rẽ nhánh kết thuác nằm trong phạm vi 2Kbytes. Addr 10 – Addr8 Opcode 5-bit Relative offsetOpcode Addr7 - Addr0 Đònh vò xa: Đònh vò xa chỉ sử dụng cho các lệnh LCALL và LMP. Các lệnh 3-byte này có đòa chỉ đích là số 16-bit đặt trong byte 2 và byte 3. Điều thuận tiện là toàn bộ vùng mã lệnh đều có thể được sử dụng. Nhưng một điều bất tiện là lệnh 3-byte quá dài và phụ thuộc vò trí (position-dependent). Phụ thuộc vò trí là một điệu bất tiện bởi vì chương trình không thể thi hành tại một đòa chỉ khác. Opcode Addr15 – Addr8 Addr7 – Addr0 Đònh vò chỉ số : Đònh vò chỉ số dùng một thanh ghi cơ sở (PC hoặc DPTR) và một thanh ghi làm offset (ACC) tạo ra một đòa chỉ sẽ bò tác động bởi các lệnh JMP hoặc MOVC. Thanh ghi nền offset đòa chỉ tác động PC or DPTR + ACC = Các ví dụ được cung cấp trong phụ lục cho các lệnh: MOVC A, @A+ <thanh ghi nền> JMP @A+DPTR . tác trên dữ liệu, một câu hỏi được đặt ra là “dữ liệu ở đâu?”. Để trả lời câu hỏi này ta xem xét qua các mode đònh vò của 8051. Đònh vò dữ liệu là một. lệnh (1 byte) ra còn có thể có dữ liệu và đòa chỉ. Trong tập lệnh 8051 có 1 39 lệnh 1 byte, 92 lệnh 2 byte và 24 lệnh 3 byte. Phần phụ lục sẽ mô tả đầy đủ