Tải bản đầy đủ (.pdf) (13 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (392.68 KB, 13 trang )

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
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 ; Bắt đầu đoạn dữ liệu.
.ORG 0x67 ; Lập địa chỉ bắt đầu trong SRAM là 67H
variable:.BYTE 1 ; Khai báo biến 1 byte trong SRAM tại địa chỉ 67H
.ESEG ; Bắt đầu đọan EEPROM
.ORG 0x20 ; Lập địa chỉ bắt đầu tại EEPROM là 20H
eevar: .DW 0xfeff ; Tạo giá trị feffH tại địa chỉ 20H và 21H.
.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 đó.
Cú pháp: .SET label = expression
Ví dụ:
.SET io_offset = 0x23
.SET porta = io_offset + 2
.CSEG ; Start code segment
clr r2 ; Clear register 2
out porta,r2 ; Write to Port A

2.6 Các mô tả trong 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á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 expression
trả về các bit 0-15 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 ; Load r16 with 0x00
2.6.3.2 Bitwise Not Ký hiệu: ~
Mô tả: Logic đảo trạng thái tất cả các bit.
Ưu tiên: 14
Ví dụ: ldi r16,~0xf0 ; Load r16 with 0x0f
2.6.3.3 Unary Minus Ký hiệu: -

Mô tả: Lấy giá trị âm số học.
Ưu tiên: 14
Ví dụ: ldi r16,-2 ; Load -2(0xfe) in r16
2.6.3.4 Multiplication Ký hiệu: *
Mô tả: Nhân nhị phân.
Ưu tiên: 13
Ví dụ: ldi r30,label*2 ; Load r30 with label*2
2.6.3.5 Division Ký hiệu: /
Mô tả: Chia nhị phân.
Ưu tiên: 13
Ví dụ: ldi r30,label/2 ; Load r30 with label/2
2.6.3.6 Addition Ký hiệu: +
Mô tả: Cộng nhị phân
Ưu tiên: 12
Ví dụ: ldi r30,c1+c2 ; Load r30 with c1+c2
2.6.3.7 Subtraction Ký hiệu: -
Mô tả: Trừ nhị phân.
Ưu tiên: 12
Ví dụ: ldi r17,c1-c2 ;Load r17 with c1-c2
2.6.3.8 Shift left Ký hiệu: <<
Mô tả: Dịch trái toán hạng.
Ưu tiên: 11
Ví dụ: ldi r17,1<<bitmask ;Load r17 with 1 shifted
;left bitmask times
2.6.3.9 Shift right Ký hiệu: >>
Mô tả: Dịch phải toán hạng.
Ưu tiên: 11
Ví dụ: ldi r17,c1>>c2 ;Load r17 with c1 shifted
;right c2 times
2.6.3.10 Less than Ký hiệu: <

Mô tả: Trả về 1 nếu nhỏ hơn, bằng 0 nếu ngược lại.
Ưu tiên: 10
Ví dụ: ori r18,bitmask*(c1<c2)+1 ;Or r18 with
;an expression
2.6.3.11 Less or Equal Ký hiệu: <=
Mô tả: Trả về 1 nếu nhỏ hơn hoặc bằng, 0 nếu ngược lại.
Ưu tiên: 10
Ví dụ: ori r18,bitmask*(c1<=c2)+1 ;Or r18 with
;an expression

2.6.3.12 Greater than Ký hiệu: >
Mô tả: trả về 1 nếu lớn hơn,0 nếu ngược lại.
Ưu tiên: 10
Ví dụ: ori r18,bitmask*(c1>c2)+1 ;Or r18 with
;an expression
2.6.3.13 Greater or Equal Ký hiệu: >=
Mô tả: trả về 1 nếu lớn hơn hoặc bằng, 0 nếu ngược lại.
Ưu tiên: 10
Ví dụ: ori r18,bitmask*(c1>=c2)+1 ;Or r18 with
;an expression
4.6.3.14 Equal Ký hiệu: ==
Mô tả: trả về 1 nếu bằng, 0 nếu không bằng.
Ưu tiên: 9
Ví dụ: andi r19,bitmask*(c1==c2)+1 ;And r19 with
;an expression
2.6.3.15 Not Equal Ký hiệu: !=
Mô tả: Trả về 1 nếu không bằng, 0 nếu ngược lại.
Ưu tiên: 9
Ví dụ: .SET flag=(c1!=c2) ;Set flag to 1 or 0
4.6.3.16 Bitwise And Ký hiệu: &

Mô tả: Trả về kết quả logic AND giữa hai toán hạng.
Ưu tiên: 8
Ví dụ: ldi r18,High(c1&c2) ;Load r18 with an expression
2.6.3.17 Bitwise Xor Ký hiệu: ^
Mô tả: Trả về logic OR giữa hai toán hạng.
Ưu tiên: 7
Ví dụ: ldi r18,Low(c1^c2) ;Load r18 with an expression
2.6.3.18 Bitwise Or Ký hiệu: |
Mô tả: Trả về logic OR giữa hai toán hạng.
Ưu tiên: 6
Ví dụ: ldi r18,Low(c1|c2) ;Load r18 with an expression
2.6.3.19 Logical And Ký hiệu: &&
Mô tả: Trả về 1 nếu cả hai toán hạng khác 0, bằng 0 nếu ngược lại.
Ưu tiên: 5
Ví dụ: ldi r18,Low(c1&&c2) ;Load r18 with an expression
2.6.3.20 Logical Or Ký hiệu: ||
Mô tả: Trả về 1 nếu 1 trong hai toán hạng bằng 0, bằng 0 nếu
ngược lại.
Ưu tiên: 4
Ví dụ: ldi r18,Low(c1||c2) ;Load r18 with an expression



×