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
Trang 1CHƯƠ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
Trang 22.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
Trang 3trì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
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
SUBI Rd, K Trừ giá trị tức thời Rd ← Rd - K 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
CBR Rd,K Xóa bit trong thanh ghi Rd ← Rd and ($FFh - K) Z,N,V 1
Trang 4CLR Rd Xóa thanh ghi Rd ← Rd xor Rd Z,N,V 1
(1)
2.4.2 CÁC LỆNH RẼ NHÁNH
RCALL k Gọi chương trình con t đối PC ← PC + k + 1 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
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
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
Trang 5LD 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 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
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 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 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
PUSH Rr Nạp thanh ghi vào đỉnh stack STACK ← Rr 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
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
BLD Rd, b Bit load from T to Register Rd(b) ← T None 1 SEC Lập CF C ← 1 C 1
SEN Lập NF N ← 1 N 1
SEZ Lập ZF Z ← 1 Z 1
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
SEV Lập cờ tràn bù 2 V ← 1 V 1
SET Lập T trong SREG T ← 1 T 1
Trang 6SEH Lập cờ HF trong SREG H ←1 H 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
EXIT Thoát ra từ file
INCLUDE Đọc file nguồn từ một filt List khác
NOLIST Tắt tính năng tạo file List
ORG Định địa chỉ cho đọan chương trình
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
.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
Trang 72.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ụ:
vartab: BYTE 4 ; Tạo biến vartab 4 bytes trong SRAM
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
Trang 8MCU 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ụ:
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
.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
Trang 92.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
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ụ:
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
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
; 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,
Trang 10tuy 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
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ụ:
.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