1. Trang chủ
  2. » Luận Văn - Báo Cáo

tập lệnh và lệnh trình Assembly cho AVR

13 2.2K 10

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR tập lệnh và lệnh trình Assembly cho AVR

CHƯƠNG 2: TẬP LỆNH VÀ LẬP TRÌNH ASSEMBLY CHO AVR. 2.1 . Giới thiệu. Trong phần này sẽ giới thiệu các lậnh trình hợp ngữ và sử dụng trình hợp dịch của Atmel để thực hiện các chương trình chạy trên MCU AVR AT90S. Việc lập trình hợp ngữ không thực sự dễ dàng như các ngôn ngữ cấp cao khác, tuy nhiên nó rất hữu dụng cho các sinh viên mới học lần đầu về vi xử lý, do các lệnh hợp ngữ thường gắn liền với các hoạt động bên trong của vi xử lý. Để thực hiện các chương trình viết bằng hợp ngữ trước hết cần phải có chương trình hợp dịch. Chương trình hợp dịch sẽ đổi chương trình hợp ngữ (assembly) thành chương trình mã đối tượng (Object flie), file Object có thể sử dụng cho các chương trình mô phỏng AVR của Atmel. Chương trình hợp dịch còn tạo ra file mã nạp ROM và file EEPROM có thể trực tiếp vào bộ nhớ chương trình của AVR. Chương trình hợp dịch AVR của Atmel tạo ra mã chương trình với định vị địa chỉ cố định, nên không cần đến các chương trình liên kết (Link). Chương trình hợp dịch ARV của Atmel chạy dưới Windows, ngoài ra cũng có version chương trình chạy dưới DOS. Version Windows của Atmel có các trợ giúp Online cho hầu hết các ứng dụng của nó. Trong phần này chỉ mô tả tập lệnh họ AVR một cách sơ lược, mô tả chi tiết cho từng lệnh có thể xem trong phần phụ lục. Hình 2.1: Màn hình soạn thảo và báo lỗi của trình hợp dịch AVR. 2.2. Tham khảo nhanh về trình hợp dịch AVR của Atmel. 2.2.1. Bắt đầu với chương trình. Để bắt đầu với AVR Assembler, có thể chọn từ thanh menu hoặc nhấp chuột vào biểu tượng trên thanh toolbar, mở file “tutor1.asm”. Thao tác trên sẽ nạp chương trình hợp ngữ lên cửa sổ soạn thảo của chương trình hợp dịch. Có thể xem khung chương trình hợp ngữ trong file tutor1.asm, không nên thực hiện các thay đổi trong file này để sử dụng nó cho các lần sau. 2.2.2. Hợp dịch chương trình đầu tiên. Sau khi xem xong chương trình, chọn Assemble trong menu. Trên màn hình sẽ xuất hiện cửa sổ Message, cửa sổ này chứa các thông báo lỗi. Chọn “Window từ Menu để tiên theo dõi các thông báo lỗi khi hợp dịch. Màn hình của chương trình hợp dịch như trên hình 2.1. 2.2.3. Tìm và sửa lỗi. Trên màn hìh thông báo lỗi có thể thấy mô tả về các lỗi trong chương trình. Để tìm và sửa các lỗi đưa con trỏ tới thông báo lỗi đầu tiên (thông báo lỗi trên dòng 54) và nhấn chuột trái, khi đó trên của sổ soạn thảo dòng 54 sẽ được nhuộm đỏ. Thông báo lỗi chỉ thị chỉ có thể gán các thanh ghi R0 – R31 có thể gán làm biến, vì họ AVR chỉ có 32 thanh ghi đa năng nhưng trong dòng 54 đã sử dụng R32 (hình 2.2). Hình 2.2: Sửa lỗi trong màn hình hợp dịch AVR. Double click vào dòng báo lỗi trên của sổ lỗi, con trỏ trên màn hình sọan thảo sẽ nằm ở đầu dòng chứa lỗi. Sửa lỗi bằng cách thay R32 thành R19 sau đó tiếp tục nhấp chuột vào lỗi kế tiếp trong màn hình lỗi. 2.2.4. Hợp dịch lại. Có thể lần lượt sửa các lỗi trong chương trình bằng cách nhấp chuột vào màn hình lỗi hoặc có thể hợp dịch lại chương trình nhiều lần, khi tất cả các lỗi đã sửa xong, màn hình lỗi sẽ thông báo quá trình hợp dịch thành công. 2.3. Tập tin nguồn hợp ngữ. Chương trình hợp dịch thực hiện việc hợp dịch các chương trình hợp ngữ gọi là các chương trình nguồn. Chương trình nguồn chứac các mã gợi nhớ, các nhãn và các chỉ thị hợp dịch (directives). Các lệnh gợi nhớ và các chỉ thị hợp dịch thường có các tóan hạng. Một hàng lệnh dài nhất giới hạn trong 120 ký tự. Mỗi dòng lệnh có thể bắt đầu bằng một nhãn, nhãn là chuỗi các ký tự và kết thúc bằng dấu “:”. Nhãn được sử dụng làm đích đến cho các lệnh rẽ nhánh hoặc tên các biến trong bộ nhớ chương trình hoặc bộ nhớ RAM. Một dòng lệnh có thể bắt đầu bằng 4 dạng sau: 1. [Nhãn] Chỉ thị hợp dịch [Toán hạng] [Chú thích] ([label:] directive [operands] [Comment]) 2. [Nhãn:] Lệnh [Toán hạng] [Chú thích] ([label:] instruction [operands] [Comment]) 3. Chú thích (Comment) 4. Dòng trống (Empty line) Một chú thích có dạng như sau: ; [Text] Các thành phần trong dấu ngoặc vuông [] có thể không sử dụng trong một số trường hợp. Chương trình hợp dịch sẽ bỏ qua các lới chú thích nằm sau dấu “;”. Ví dụ: label: .EQU var1=100 ; Chỉ dẫn gán var1 là giá trị 100 .EQU var2=200 ; Chỉ dẫn gán var2 là 200 test: rjmp test ; Lệnh nhảy lặp không thoát ; Dòng chỉ ghi lời chú thích. ; Dòng chú thích khác. Chú ý: Không nên đạt các nhãn các chỉ dẫn hợp dịch và các lệnh trên cùng một cột. 2.4. Mô tả tập lệnh của AVR. Các lệnh việt trong các chương trình nguồn được cho trong tận lệnh. Sau đây là bảng tổng kết các lệnh với các tham số của chúng. 2.4.1. CÁC LỆNH SỐ HỌC VÀ LOGIC. Gợi nhớ Toán hạng Mô tả Thực hiện Cờ Clock ADD Rd, Rr Cộng không nhớ Rd ←Rd + Rr Z,C,N,V,H 1 ADC Rd, Rr Cộng có nhớ Rd ← Rd + Rr + C Z,C,N,V,H 1 ADIW Rd, K Cộng giá trị tức thời vào 1 từ Rd+1:Rd ← Rd+1:Rd + K Z,C,N,V 2 SUB Rd, Rr Trừ không nhớ Rd ← Rd - Rr Z,C,N,V,H 1 SUBI Rd, K Trừ giá trị tức thời Rd ← Rd - K Z,C,N,V,H 1 SBC Rd, Rr Trừ có cờ nhớ Rd ← Rd - Rr - C Z,C,N,V,H 1 SBCI Rd, K Trừ tức thời có nhớ Rd ← Rd - K - C Z,C,N,V,H 1 SBIW Rd, K Trừ tức thời theo từ Rd+1:Rd ← Rd+1:Rd - K Z,C,N,V 2 AND Rd, Rr Logic AND Rd ← Rd AND Rr Z,N,V 1 ANDI Rd, K AND với số tức thời Rd ← Rd AND K Z,N,V 1 OR Rd, Rr Logical OR Rd ← Rd OR Rr Z,N,V 1 ORI Rd, K OR với số tức thời Rd ← Rd OR K Z,N,V 1 EOR Rd, Rr Exclusive OR Rd ← Rd XOR Rr Z,N,V 1 COM Rd Bù 1 Rd ← $FF - Rd Z,C,N,V 1 NEG Rd Bù 2 Rd ← $00 - Rd Z,C,N,V,H 1 SBR Rd,K Lập bit trong thanh ghi Rd ← Rd v K Z,N,V 1 CBR Rd,K Xóa bit trong thanh ghi Rd ← Rd and ($FFh - K) Z,N,V 1 INC Rd Tăng Rd ← Rd + 1 Z,N,V 1 DEC Rd Giảm Rd ← Rd - 1 Z,N,V 1 TST Rd Kiểm tra zero hoặc âm Rd ← Rd and Rd Z,N,V 1 CLR Rd Xóa thanh ghi Rd ← Rd xor Rd Z,N,V 1 SER Rd Lập thanh ghi Rd ← $FF None 1 MUL Rd,Rr Nhân không dấu R1, R0 ← Rd x Rr C 2 (1) 2.4.2. CÁC LỆNH RẼ NHÁNH. RJMP k Nhảy tương đối PC ← PC + k + 1 None 2 IJMP nhảy gián tiếp (Z) PC ← Z None 2 JMP k Nhảy không điều kiện PC ← k None 3 RCALL k Gọi chương trình con t. đối PC ← PC + k + 1 None 3 ICALL Gọi gián tiếp (Z) PC ← Z None 3 CALL k Gọi chương trình con PC ← k None 4 RET Quay về từ chương trình con PC ← STACK None 4 RETI Quay về từ ngắt PC ← STACK I 4 CPSE Rd,Rr So sánh và 0 nhảy khi bằng if (Rd = Rr) PC ← PC + 2 or 3 None 1 / 2 / 3 CP Rd,Rr So sánh Rd - Rr Z,C,N,V,H 1 CPC Rd,Rr So sánh có cờ nhớ Rd - Rr - C Z,C,N,V,H 1 CPI Rd,K So sánh với số tức thời Rd - K Z,C,N,V,H 1 SBRC Rr, b 0 nhảy khi bit = 0 (Skip) if (Rr(b)=0) PC ← PC + 2or3 None 1 / 2 / 3 SBRS Rr, b 0 nhảy nếu bit = 1 if (Rr(b)=1) PC ← PC + 2or3 None 1 / 2 / 3 SBIC P, b 0 nhảy nếu bit I/O = 0 if(I/O(P,b)=0) PC←PC+2or3 None 1 / 2 / 3 SBIS P, b 0 nhảy nếu bit I/O= 1 if(I/O(P,b)=1) PC ← PC+2or3 None 1 / 2 / 3 BRBS s, k Rẽ nhánh khi cờ trạng thái=1 if (SREG(s) = 1)then PC←PC+k + 1 None 1 / 2 BRBC s, k Rẽ nhánh khi cờ trạng thái=0 if (SREG(s) = 0) then PC←PC+k + 1 None 1 / 2 BREQ k Rẽ nhánh nếu bằng if (Z = 1) then PC← PC + k + 1 None 1 / 2 BRNE k Rẽ nhánh nếu không bằng if (Z = 0) then PC← PC + k + 1 None 1 / 2 BRCS k Rẽ nhánh nếu CF=1 if (C = 1) then PC← PC + k + 1 None 1 / 2 BRCC k Rẽ nhánh nếu CF=0 if (C = 0) then PC← PC + k + 1 None 1 / 2 BRSH k Rẽ nhánh nếu > hoặc = if (C = 0) then PC ← PC + k + 1 None 1 / 2 BRLO k Rẽ nhánh nếu nhỏ hơn if (C = 1) then PC ← PC + k + 1 None 1 / 2 BRMI k Rẽ nhánh nếu âm if (N = 1) then PC ← PC + k + 1 None 1 / 2 BRPL k Rẽ nhánh nếu dương if (N = 0) then PC ← PC + k + 1 None 1 / 2 BRGE k Rẽ nhánh > hoặc =, có dấu if (NxorV= 0) then PC←PC+ k + 1 None 1 / 2 BRLT k Rẽ nhánh < hoặc =, có dấu if (NxorV= 1) then PC← PC + k + 1 None 1 / 2 BRHS k Rẽ nhánh nếu HF = 1 if (H = 1) then PC ← PC + k + 1 None 1 / 2 BRHC k Rẽ nhánh nếu HF = 0 if (H = 0) then PC ← PC + k + 1 None 1 / 2 BRTS k Rẽ nhánh nếu TF = 1 if (T = 1) then PC ← PC + k + 1 None 1 / 2 BRTC k Rẽ nhánh nếu TF = 0 if (T = 0) then PC ← PC + k + 1 None 1 / 2 BRVS k Rẽ nhánh nếu OF = 1 if (V = 1) then PC ← PC + k + 1 None 1 / 2 BRVC k Rẽ nhánh nếu OF = 0 if (V = 0) then PC ← PC + k + 1 None 1 / 2 BRIE k Rẽ nhánh nếu IF = 1 if (I = 1) then PC ← PC + k + 1 None 1 / 2 BRID k Rẽ nhánh nếu IF = 1 if (I = 0) then PC ← PC + k + 1 None 1 / 2 2.4.3. CÁC LỆNH TRUYỀN DỮ LIỆU. MOV Rd, Rr Chép thanh ghi Rd ← Rr None 1 LDI Rd, K Nạp giá trị tức thời Rd ← K None 1 LDS Rd, k Nạp trực tiếp từ SRAM Rd ← (k) None 3 LD Rd, X Nạp gián tiếp Rd ← (X) None 2 LD Rd, X+ Nạp gián tiếp và tăng Rd ← (X), X ← X + 1 None 2 LD Rd, -X Giảm và nạp gián tiếp X ← X - 1, Rd ← (X) None 2 LD Rd, Y Nạp gián tiếp Rd ← (Y) None 2 LD Rd, Y+ Nạp gián tiếp và tăng Rd ← (Y), Y ← Y + 1 None 2 LD Rd, -Y Giảm và nạp gián tiếp ← Y - 1, Rd ← (Y) None 2 LDD Rd,Y+q Nạp gián tiếp với độ dời Rd ← (Y + q) None 2 LD Rd, Z Nạp gián tiếp Rd ← (Z) None 2 LD Rd, Z+ Nạp gián tiếp và giảm Rd ← (Z), Z ← Z+1 None 2 LD Rd, -Z Giảm và nạp gián tiếp Z ← Z - 1, Rd ← (Z) None 2 LDD Rd, Z+q Nạp gián tiếp với độ dời Rd ← (Z + q) None 2 STS k, Rr Lưu trức tiếp vào SRAM (k) ← Rr None 3 ST X, Rr Lưu gián tiếp (X) ← Rr None 2 ST X+, Rr Lưu gián tiếp và giảm (X) ← Rr, X ← X + 1 None 2 ST -X, Rr Giảm và lưu gián tiếp X ← X - 1, (X) ← Rr None 2 ST Y, Rr Lưu gián tiếp (Y) ← Rr None 2 ST Y+, Rr Lưu gián tiếp và tăng (Y) ← Rr, Y ← Y + 1 None 2 ST -Y, Rr Giảm và lưu gián tiếp Y ← Y - 1, (Y) ← Rr None 2 STD Y+q,Rr Lưu gián tiếp với độ dời (Y + q) ← Rr None 2 ST Z, Rr Lưu gián tiếp (Z) ← Rr None 2 ST Z+, Rr Lưu gián tiếp và tăng (Z)← Rr, Z ← Z + 1 None 2 ST -Z, Rr Giảm và lưu gián tiếp Z ← Z - 1, (Z) ← Rr None 2 STD Z+q,Rr Lưu gián tiếp với độ dời (Z + q)← Rr None 2 LPM Nạp từ bộ nhớ chương trình R0 ← (Z) None 3 IN Rd, P Đọc cổng vào ra Rd ← P None 1 OUT P, Rr Ghi cổng vào ra P ← Rr None 1 PUSH Rr Nạp thanh ghi vào đỉnh stack STACK ← Rr None 2 POP Rd Lấy đỉnh stack ra thanh ghi Rd ← STACK None 2 2.4.4. CÁC LỆNH VỀ BIT VÀ KIỂM TRA BIT. LSL Rd Dịch trái logic Rd(n+1) ← Rd(n),Rd(0) ← 0,C ← Rd(7) Z,C,N,V,H 1 LSR Rd Dịch phải logic Rd(n) ← Rd(n+1),Rd(7) ← 0,C ← Rd(0) Z,C,N,V 1 ROL Rd Quay trái qua CF Rd(0) ← C,Rd(n+1) ← Rd(n),C ← Rd(7) Z,C,N,V,H 1 ROR Rd Quay phải qua CF Rd(7) ← C,Rd(n) ← Rd(n+1),C ← Rd(0) Z,C,N,V 1 ASR Rd Dịch phải số học Rd(n) ← Rd(n+1), n=0 6 Z,C,N,V 1 SWAP Rd Chuyển đổi Nibbles None 1 BSET s Lập cờ SREG(s) ← 1 SREG(s) 1 BCLR s Xóa cờ SREG(s) ← 0 SREG(s) 1 SBI P, b Lập bit I/O I/O(P, b) ← 1 None 2 CBI P, b Clear Bit in I/O Register I/O(P, b) ← 0 None 2 BST Rr, b Bit Store from Register to T T ← Rr(b) T 1 BLD Rd, b Bit load from T to Register Rd(b) ← T None 1 SEC Lập CF C ← 1 C 1 CLC Xóa CF C ← 0 C 1 SEN Lập NF N ← 1 N 1 CLN Clear Negative Flag N ← 0 N 1 SEZ Lập ZF Z ← 1 Z 1 CLZ Xóa ZF Z ← 0 Z 1 SEI Cho phép ngắt tổng I ← 1 I 1 CLI Cấm ngắt cổng I ← 0 I 1 SES Lập cờ kiểm tra dấu S ← 1 S 1 CLS Xóa cờ kiểm tra dấu S ← 0 S 1 SEV Lập cờ tràn bù 2 V ← 1 V 1 CLV Xóa cờ tràn bù 2 V ← 0 V 1 SET Lập T trong SREG T ← 1 T 1 CLT Xóa T trong SREG T ← 0 T 1 SEH Lập cờ HF trong SREG H ←1 H 1 CLH Xóa cờ HF trong SREG H ← 0 H 1 NOP Không họat động None 1 SLEEP Ngủ None 1 WDR Watchdog Reset None 1 Trong tập lệnh trên các ký hiệu toán hạng như sau: Rd: R0-R31 hoặc R16-R31 (tùy thuộc vào từng lệnh) Rr: R0-R31 b: Hằng số 0-7 s: Hằng số 0-7 P: Hằng số 0-31/63 K: Hằng số 0-255 k: Là hằng số với giá trị tùy thuộc vào từng lệnh. q: Hằng số 0-63. 2.5. Các chỉ thị hợp dịch. Các trình hợp dịch luôn hỗ trợ một số chỉ thị hợp dịch, các chỉ thị hợp dịch không được dịch trục tiếp thành mã máy mà chúng thường sử dụng để định vị trí cho bộ nhớ chương trình, định nghĩa các macro khởi động bộ nhớ …. Các chỉ thị của trình hợp dịch AVR bao gồm: Chỉ thị Mô tả BYTE Tạo một biến Byte CSEG Định đoạn mã lệnh DB Định nghĩa hằng số byte trong bộ nhớ. DEF Định nghĩa tên cho một thanh ghi DSEG Định đọan dữ liệu DW Định nghĩa hằng số 1 từ trong bộ nhớ. ENDMACRO Kết thúc macro EQU Gán tên cho một giá trị thường sử dụng. ESEG Định đoạn EEPROM. EXIT Thoát ra từ file. INCLUDE Đọc file nguồn từ một filt List khác. MACRO Bắt đầu Macro NOLIST Tắt tính năng tạo file List ORG Định địa chỉ cho đọan chương trình. SET Lập một nhãn 2.5.1. BYTE - Reserve bytes to a variable Chỉ thị BYTE tạo ra tài nguyên bộ nhớ trong SRAM cho chương trình. Để truy cập tới vị trí này cần có một tên (label) đi trước chỉ thị BYTE. Chỉ thị này có một tham số là số byte được tạo ra trong bộ nhớ cho chương trình. Chỉ thị này chỉ có thể sử dụng trong đọan bộ nhớ dữ liệu, và chỉ thị này không chỉ định địa chỉ bắt đầu của vùng nhớ. Cú pháp: LABEL: .BYTE expression Ví dụ: .DSEG .CSEG var1: .BYTE 1 ; tạo biến var1 chứa 1 byte table: .BYTE tab_size ; Tạo biến table với tab_size byte. ldi r30,low(var1) ; Nạp địa chỉ thấp biến var1cho Z ldi r31,high(var1) ; Nạp địa chỉ cao của var1. cho Z ld r1,Z ; Nạp VAR1 vào r1. 2.5.2. CSEG – Code Segment Chỉ thị CSEG định nghĩa địa chỉ bắt đầu của đọan lệnh. Một chương trình hợp ngữ có thể bao gồm một số đọan lệnh và sẽ được tạo thành một đọan lệnh sau khi hợp dịch.Chỉ thị BYTE không thể sử dụng trong đọan lệnh. Đọan lệnh có bộ đếm lệnh 1 từ, chỉ thị ORG có thể chỉ định vị trí của đọan lệnh và các hằng số tại các vị trí cụ thể trong bộ nhớ. Chỉ thi CSEG không có tham số. Cú pháp: .CSEG Ví dụ: .DSEG ; Khai báo bắt đầu đọan dữ liệu vartab: .BYTE 4 ; Tạo biến vartab 4 bytes trong SRAM .CSEG ; Khai báo bắt đầu đọan mã lệnh. const: .DW 2 ; Tạo hằng số 0x0002 trong vùng nhớ chương trìn. mov r1,r0 ; Lệnh chương trình. 2.5.3. DB-định nghĩa hằng số trong bộ nhớ chương trình hoặc trong EEPROM. Chỉ thị DB khai báo tài nguyên bộ nhớ trong vùng nhớ chương trình hoặc trong EEPROM. Các vị trí này có thể truy cập bằng tên đặt trước DB. Chỉ thị DB có thể có nhiều tham số phía sau, và nó cần ít nhất 1 tham số. Chỉ thị này cần đặt trong đọan chương trình hoặc EEPROM. Các tham số của DB cách nhau bằng dấu phẩy, mỗi một tham số có giá trị trong khỏang -128 đến 255. Khi tham số là số âm nó sẽ được lưu trữ dưới dạng số bù 2. Khi chỉ thị DB sử dụng trong bộ nhớ chương trình, nếu có nhiều hơn 1 tham số thì các tham số sẽ được lưu theo từng từ (16 bit) đặt trong một ô nhớ chương trình 16 bit. Khi các tham số là một số lẻ thì tham số cuối cùng (1 byte) sẽ được đặt riêng trong một ô nhớ 16 bit, ngay cả khi lệnh kế tiếp của chương trình là một lệnh DB khác. Cú pháp: LABEL: .DB expressionlist Ví dụ: .CSEG .ESEG consts: .DB 0, 255, 0b01010101, -128, 0xaa eeconst:.DB 0xff 2.5.4. DEF – Đặt tên cho một thanh ghi. Chi thị DEF cho phép truy cập tới các thanh ghi bằng tên dễ nhớ hơn do người lập trình tự đặt. Tên này sẽ có thể sử dụng cho toàn bộ phần chương trình còn lại, mọt thanh ghi có thể gán nhiều tên khác nhau trong nhiều đọan của chương trình. Cú pháp .DEF Symbol=Register Ví dụ: .DEF temp=R16 .DEF ior=R0 .CSEG ldi temp,0xf0 ; Nạp giá trị 0xf0 vào thanh ghi temp. in ior,0x3f ; Đọc SREG vào thanh ghi ior. eor temp,ior ; Xor temp và ior 2.5.5. DEVICE – Định nghĩa loại MCU cho chương trình. Chỉ thị DEVICE cho phép người sử dụng chỉ thị cho chương trình hợp dịch biết các thế hệ MCU AVR mà chương trình sẽ thực hiện. Khi sử dụng chỉ thị này chương trình hợp dịch sẽ thông báo các lệnh không hỗ trợ cho một thế hệ MCU nào đó hoặc khi chương trình lớn quá dung lượng bộ nhớ của MCU. Nếu chỉ thị DEVICE không sử dụng trong chương trình nguồn,chương trình hợp dịch xem như tất cả các lệnh đều được hỗ trợ và không có thông báo quá dung lượng bộ nhớ. Cú pháp: .DEVICE AT90S1200 | AT90S2313 | AT90S4414 | AT90S8515 Ví dụ: .DEVICE AT90S1200 ; Chương trình viết cho AT90S1200 .CSEG push r30 ; Lệnh này sẽ tạo ra thông báo lỗi vì AT90S1200 không có lệnh này. 2.5.6 DSEG – Đoạn dữ liệu. Chỉ thị DSEG định nghĩa bắt đầu của đọan dữ liệu. Trong một chương trình hợp ngữ có thể khai báo một số đoạn dữ liệu và chúng sẽ được trình hợp dịch gom thành 1 đọan khi hợp dịch. Đọan dữ liệu thông thường chứa các chỉ thị BYTE (và các tên). Đọan lệnh có bộ đếm địa chỉ riêng có độ lớn 1 byte. Chỉ thị ORG sẽ định địa chỉ bắt đầu cho đọan dữ liệu trong không gian bộ nhớ. Chỉ thị này không có tham số. Cú pháp: .DSEG Ví dụ: .DSEG ; Bắt đầu đoạn dữ liệu var1:.BYTE 1 ; tạo biến var1 chứa 1 byte table:.BYTE tab_size ; tạo biến table chứa tab_size byte .CSEG Ldi r30,low(var1) ; Nạp phần thấp thanh ghi Z. Ldi r31,high(var1) ; Nạp phần cao thanh ghi Z Ld r1,Z ; Nạp biến var1 và thanh ghi r1 2.5.7 DW-Define constant word(s) in program memory or E2PROM memory Chỉ thị DW khai báo vùng nhớ trong bộ nhớ chương trình hoặc EEPROM.Có thể sử dụng tên đặt trước chỉ thị DW để truy cập tới vùng nhớ này. Chỉ thị DW sẽ có nhiều tham số khai báo phía sau (ít nhất 1 tham số). Chỉ thị này chỉ sử dụng trong đọan lệnh hoặc đọan EEPROM. Các tham số của chỉ thị sẽ cách nhau bằng dấu phẩy,mỗi giá trị nằm trong khỏang -32768 đến 65535. Nếu tham số âm, trong bộ nhớ nó sẽ được lưu dưới dạng số bù 2. Cú pháp: LABEL: .DW expressionlist Ví dụ: .CSEG .ESEG varlist:.DW 0,0xffff,0b1001110001010101,-32768,65535 eevar: .DW 0xffff 2.5.8 ENDMACRO - End macro Chỉ thị ENDMACRO định nghĩa điểm kết thúc một Macro. Chỉ thị này không có tham số. Cú pháp: .ENDMACRO Ví dụ: .MACRO SUBI16 ; Bắt đầu Macro subi r16,low(@0) ; trừ byte thấp sbci r17,high(@0) ; trừ byte cao .ENDMACRO ; Kết thúc Macro. 2.5.9 EQU - Set a symbol equal to an expression Chỉ thị EQU gán tên cho một giá trị nào đó, giá trị đã gán là hằng số không thể thay đổi được và nó chỉ có ý nghĩ trong chương trình nguồn, trong chương trình mã máy nó được thay bằng giá trị, nó không có ô nhớ để lưu trữ. Cú pháp: .EQU label = expression Ví dụ: .EQU io_offset = 0x23 .EQU porta = io_offset + 2 .CSEG ; Bắt đầu đọan lệnh clr r2 ; Xóa r2 out porta,r2 ; Ghi cổng A. 2.5.10 ESEG – đoạn EEPROM. Chỉ thị ESEG định nghĩa bắt đầu đoạn EEPROM. Một chương trình có thể khai báo nhiểu đọan EEPROM, trình hợp dịch sẽ tự gom thành 1 đọan. Chỉ thị BYTE không sử dụng được trong vùng nhớ này. Đoạn EEPROM có bộ đếm địa chỉ 1byte riêng. Chỉ thị ORG có thể sử dụng chỉ thị địa chỉ cụ thể cho đọan EEPROM. Cú pháp: .ESEG Ví dụ: .DSEG ; Bắt đầu đọan dữ liệu vartab: .BYTE 4 ; Khai báo biến 4 byte trong SRAM .ESEG eevar: .DW 0xff0f ; Khởi động 1 từ bằng 0xff0f trong EEPROM. .CSEG ; Bắt đầu đoạn lệnh const: .DW 2 ; Ghi giá trị 0x0002 vào bộ nhớ chương trình mov r1,r0 ; Lệnh chương trình 2.5.11. EXIT – Thóat khỏi file. Chỉ thị EXIT chỉ thị chi trình hợp dịch ngưng hợp dịch file tại vị trí này. Nếu không có EXIT chương trình sẽ được dịch cho tới kết thúc file. Nếu sử dụng EXIT trong một file included, hợp dịch sẽ tiếp tục từ dòng lệnh chứa chỉ thị INCLUDE trong file chứa chủ thị này. Cú pháp: EXIT Ví dụ: .EXIT 2.5.12 INCLUDE – Hợp dịch thêm một file khác. Chỉ thị INCLUDE chỉ thị trình hợp dịch bắt đầu đọc từ một file khác. Trình hợp dịch sau đó sẽ dịch file được chỉ định cho đến khi kết thúc file đó (EOF) hoặc gặp phải chỉ thị EXIT. Một file Include cũng có thể chứa chỉ thị INCLUDE. Cú pháp: .INCLUDE “filename” Ví dụ: .EQU sreg=0x3f ; Thanh ghi trạng thái .EQU sphigh=0x3e ; SP phần cao .EQU splow=0x3d ; SP phần thấp ; incdemo.asm .INCLUDE “iodefs.asm” ; Định nghĩa biên dịch file iodefs.asm in r0,sreg ; Đọc SREG 2.5.13 LIST - Turn the listfile generation on Chỉ thị LIST chỉ thị trình biên dịch tạo ra list file. Listfile bao gồm mã nguồn hợp ngữ kèm theo mã máy của nó và địa chỉ của lệnh sẽ nằm trong bộ nhớ. Việc tạo ra listfile là mặc định khi hợp dịch, tuy nhiên cũng có thể sử dụng LIST cùng với chỉ thị NOLIST để tạo ra từng phần list của file nguồn. Cú pháp: .LIST Ví dụ: .NOLIST ; Không cho phép tạo đọan List. .INCLUDE “macro.inc” ; Includefile sẽ không list trong listfile .INCLUDE “const.def” ; .LIST ; cho phép tạo list trở lại. 2.5.14 LISTMAC - Turn macro expansion on Chỉ thị LISTMAC thông báo cho trình hợp dịch có lệnh gọi Macro và cần tạo thêm phần list cho macro thêm vào listfile. Nếu không có chỉ dẫn này chỉ có trong listfile chỉ có lệnh gọi macro và các tham số của nó. Cú pháp: .LISTMAC Ví dụ: .MACRO MACX ; Định nghĩa một macro add r0,@0 ; Lệnh trong macro eor r1,@1 ; Lệnh trong macro .ENDMACRO ; Chỉ thị kết thúc macro .LISTMAC ; Cho phép thêm phần list lệnh macro trog listfile MACX r2,r1 ; Gọi macro 2.5.15 MACRO – Bắt đầu macro Chỉ thị MACRO thông báo cho trình hợp dịch biết điểmbắt đầu của macro,chỉ thị này cần cung cấp tên Macro. Khi tên của Macro được gọi trong chương trình, các lệnh trong macro sẽ được thực hiện. Một macro có thể khai báo 10 tham số @0 - @9, khi gọi macro cần cung cấp các tham số tuần tự cách nhau bằng dấu phẩy. Một macro sẽ kết thúc bằng chỉ thị ENDMACRO. Cú pháp: .MACRO macroname Ví dụ: .MACRO SUBI16 ; Bắt đầu Macro subi @1,low(@0) ; trừ byte thấp sbci @2,high(@0) ; trừ byte cao .ENDMACRO ; Kết thúc macro .CSEG ; bắt đầu đoạn lệnh SUBI16 0x1234,r16,r17 ; trừ .0x1234 từ r17:r16 2.5.16 NOLIST – Tắt chức năng tạo listfile. Chỉ thị NOLIST thông báo cho trình hợp dịch tắt chức năng tạo list. Mặc định chương trình biên dịch luôn tạo ra listfile, chỉ thị NOLIST có thể sử dụng chung với chỉ thị LIST để tạo ra các đọan list cần thiết trong chương trình. Cú pháp: .NOLIST Ví dụ: .NOLIST ; Không cho phép tạo list .INCLUDE “macro.inc” ; included files không thể hiện tring listfile .INCLUDE “const.def” ; .LIST ; Cho phép tạo list trở lại. 2.5.17 ORG – Lập điểm địa chỉ bắt đầu cho chương trình. Chỉ thị ORG thiết lập địa chỉ tuyệt đối cụ thể cho một đọan chương trình, giá trị địa chỉ thiết lập sẽ làthamsố của lệnh. Khi ORG sử dụng trong đoạn dữ liệu, giá trị bộ đếm địa chỉ SRAM sẽ được chọn, nếu ORG sử dụng trong đoạn lệnh, giá trị bộ đếm chương trình sẽ được lập, ORG cũng có thể sử dụng thiết lập địa chỉ trong đoạn EEPROM. Nếu phía trước chỉ thị ORG là một nhãn, nhãn này sẽ được gán giá trị bằng giá trị địa chỉ đã được khởi động. Giá trị mặc định khi bắt đầu chương trình của bộ đếm [...]... 0x20 ; Lập địa chỉ bắt đầu tại EEPROM là 20H ; Tạo giá trị feffH tại địa chỉ 20H và 21H eevar: DW 0xfeff CSG ORG 0x10 ; Lập địa chỉ bắt đầu cho đoạn lệnh này là 10H Mov r0,r1 ; Lệnh của chương trình 2.5.18 SET – Gán giá trị cho một nhãn Chỉ thị SET sẽ gán một giá trị cho một nhãn, nhãn này có thể sử dụng làm tham số cho các lệnh sau Một nhãn được gán giá trị bằng chỉ thị SET có thể gán giá trị khác sau...vùng EEPROM và vùng lệnh là 0,vùng SRAM là 32 (do các thanh ghi chiếm các địa chỉ từ 0 – 31) Chú ý các bộ đếm địa chỉ vùng EEPROM và SRAM một byte, còn bộ đếm chương trình là một từ Cú pháp: ORG expression Ví dụ: DSEG ORG 0x67 variable:.BYTE 1 ESEG ; Bắt đầu đoạn dữ liệu ; Lập địa chỉ bắt... chương trình hợp ngừ (Expressions ) Các mô tả trong các chương trình hợp ngữ có thể là các toán hạng, các phép toán hoặc các hàm, tất cả đầu là 32 bit 2.6.1 Các toán hạng (Operands) Chương trình hợp ngữ có thể sử dụng các toán hạng sau: Các nhãn sẽ lấy giá trị địa chỉ tại nơi chúng xuất hiện Các biến định nghĩa bằng chỉ thị SET Các hằng định nghĩa bằng chỉ thị EQU Các hằng số nguyên có thể cho dưới... của expression trả về các bit 0-15 của expression trả về các bit 16-21của expression trả về 2^expression trả về phần nguyên log2(expression) 2.6.3 Các phép toán (Operators) Chương trình hợp dịch hỗ trợ các phép tính toán, trình tự ưu tiên của chúng theo thứ tự mô tả dưới đây: 2.6.3.1 Logical Not Ký hiệu: ! Mô tả: trả về 1 nếu kết quả bằng 0, trả về 0 nếu kết quả khác 0 Ưu tiên: 14 Ví dụ: ldi r16,!0xf0... định nghĩa bằng chỉ thị EQU Các hằng số nguyên có thể cho dưới các dạng: a) Thập phân mặc định: 10, 255 b) Hexadecimal : 0x0a, $0a, 0xff, $ff c) Binary: 0b00001010, 0b11111111 – giá trị của bộ đếm chương trình 2.6.2 Các hàm (Functions ) Có thể sử dụng các hàm sau đây: trả về byte thấp của expression trả về byte cao của expression tương đương hàm HIGH trả về byte thứ 3 của expression trả về byte thứ 4 của

Ngày đăng: 25/04/2015, 01:24

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w