6.2.1 Các chỉ thị trong assemblerAssembler làm việc trên các file nguồn chứa đựng các lệnh gợi nhớ mnemonic, các nhãn label và các chỉ thị directive.. Lệnh gợi nhớ và chỉ thị thường kèm
Trang 1GIẢNG VIÊN: THS PHẠM THẾ DUY
ĐIÊÊN THOẠI/EMAIL: 0903661501 DUYPT@PTITHCM.EDU.VN
HỌC VIÊÊN CÔNG NGHÊÊ BƯU CHÍNH VIỄN THÔNG
LÂÊP TRÌNH HỢP NGỮ
AVR
Trang 36.1 GIỚI THIỆU TẬP LỆNH AVR
Ký hiệu các toán hạng (operand)
Rd : Các thanh ghi R0 – R31 hoặc R16 – R31 (tuỳ thuộc lệnh).
Trang 4CÁC LỆNH SỐ HỌC VÀ LOGIC
Gợi nhớ Toán hạng Mô tả Thực hiện Cờ Clock
• SBIW Rd, K - 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
•
Trang 5• RJMP k Nhảy tương đối PC ← PC + k + 1 None 2
None 3
• 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
• 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
• BRBCs, k Rẽ nhánh khi cờ trạng thái=0 if (SREG(s) = 0) then PC←PC+k + 1 None 1 / 2
CÁC LỆNH RẼ NHÁNH
Trang 6• 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
CÁC LỆNH RẼ NHÁNH
Trang 7• MOV Rd, Rr Chép thanh ghi Rd ← Rr None 1
• 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 và tăng Rd ← (Y), Y ← Y + 1 None 2
• LD Rd, -Y Giảm và nạp gián tiếp Y← Y - 1, Rd ← (Y)
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
CÁC LỆNH TRUYỀN DỮ LIỆU
Trang 8• 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 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
• 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
CÁC LỆNH TRUYỀN DỮ LIỆU
Trang 9• 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 Rd(3 0) Rd(7 4) Rd(3 0) Rd(7 4) None 1
• BSET s Lập cờ SREG(s) ← 1 SREG(s) 1
• 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
Trang 10• SEI Cho phép ngắt tổng I ← 1 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
CÁC LỆNH KIỂM TRA BIT
Trang 126.2.1 Các chỉ thị trong assembler
Assembler làm việc trên các file nguồn chứa đựng các lệnh gợi nhớ (mnemonic), các nhãn (label) và các chỉ thị (directive) Lệnh gợi nhớ và chỉ thị thường kèm theo các toán hạng (operand).
Một dòng mã (code) không được hơn 120 ký tự.
Một dòng nhập vào có thể ở 1 trong 4 dạng sau:
Trang 136.2.1 Các chỉ thị trong assembler (tt)
Ví dụ : đoạn chương trình nhỏ
; Doan chuong trinh vi du
label: .EQU var1=100 ; Đặt var1 = 100 ; Đặt var1 = 100
Trang 15Chỉ thị Mô tả
6.2.1 Các chỉ thị trong assembler (tt)
Trang 16table: BYTE tab_size ; reserve tab_size bytes
.CSEG
Trang 176.2.2 Cú pháp các chỉ thị của assembler (tt)
• Cú pháp:
• Chỉ thị DB: để đặt trước bộ nhớ trong bộ nhớ chương trình hoặc bộ nhớ EEPROM.
eeconst: DB 0xff
Trang 18• Chỉ thị DEF: đặt ký hiệu cho các thanh ghi
• Cú pháp:
.DEF Symbol = Register
• Ví dụ:
.DEF temp = R16 DEF ior = R0
.CSEG
ldi temp, 0xf0 ; Load 0xf0 into temp register
in ior, 0x3f ; Read SREG into ior register eor temp, ior ; Exclusive or temp and ior 6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 196.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 20• Chỉ thị DW: Định nghĩa các từ hằng trong bộ nhớ chương trình hoặc
eevar: DW 0xffff
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 21• Chỉ thị ENMACRO: Kết thúc macro
• Cú pháp:
.ENDMACRO
• Ví dụ:
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 22.EQU porta = io_offset + 2
• Chỉ thị ESEG: Xác định bắt đầu của đoạn dữ liệu EEPROM
.ESEG
DSEG ; Start data segment
vartab: BYTE 4 ; Reserve 4 bytes in SRAM
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 24• Chỉ thị LIST: Mở file thống kê
• Cú pháp:
.LIST
• Ví dụ:
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 25• Chỉ thị LISTMAC: Chỉ thị này báo cho assembler biết khi macro được gọi, sự khai triển macro được cho thấy trong file thống kê được tạo bởi assembler
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 26• Chỉ thị MACRO: Bắt đầu macro
• Cú pháp:
.MACRO macroname
• Ví dụ:
• Chỉ thị NOLIST: Tắt việc phát file thống kê
• Cú pháp:
.NOLIST
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 27• Chỉ thị ORG: Đặt giá trị đếm
• Cú pháp:
.ORG expression
• Ví dụ:
variable: BYTE 1 ; Reserve a byte at SRAM adr.67H
eevar: DW 0xfeff ; Initialize one word CSEG
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 28• Chỉ thị SET: Bắt đầu macro
• Cú pháp:
.SET label = expression
• Ví dụ:
.SET io_offset = 0x23 SET porta = io_offset + 2
6.2.2 Cú pháp các chỉ thị của assembler (tt)
Trang 296.2.3 Các biểu thức trong assembler
Biểu thức có thể bao hàm các toán hạng (operand), các toán tử (operator) và các hàm (function)
Trang 30 Hàm:
Các dạng của hàm:
•
6.2.3 Các biểu thức trong assembler
Trang 31Toán tử Ký hiệu Độ ưu tiên Mô tả
thức bằng 0, kết quả =0 nếu biểu thức khác 0.
ldi r16, !0xf0 ; Load r16 with 0x00
trong biểu thức.
ldi r16, ~0xf0 ; Load r16 with 0x0f
ldi r16,-2 ; Load -2(0xfe) in r16
ldi r30,label*2 ; Load r30 with label*2
6.2.3 Các biểu thức trong assembler
Trang 32Toán tử Ký hiệu Độ ưu tiên Mô tả
biểu thức.
ldi r30,label/2 ; Load r30 with label/2
ldi r30,c1+c2 ; Load r30 with c1+c2
ldi r17,c1-c2 ;Load r17 with c1-c2
vị trí.
ldi r17,1<<bitmask ;Load r17 with 1 shifted left bitmask times
6.2.3 Các biểu thức trong assembler
Trang 33Toán tử Ký hiệu Độ ưu tiên Mô tả
số vị trí.
ldi r17, c1>>c2
6.2.3 Các biểu thức trong assembler
Trang 34Toán tử Ký hiệu Độ ưu tiên Mô tả
thức.
ldi r18,High(c1&c2) ;Load r18 with an expression
thức khác 0, ngược lại kết quả = 0 ldi r18,Low(c1&&c2)
hai biểu thức khác 0, ngược lại kết quả = 0.
6.2.3 Các biểu thức trong assembler