Professional Documents
Culture Documents
C4 New
C4 New
TRÌNH ASSEMBLY
ATMEGA324
Từ ngôn ngữ C đến ngôn ngữ máy
LDI R24,0x01
OUT 0x01,R24
LDI R24,0x00
LDI R25,0x00
RJMP PC+0x0002
#include<avr/io.h>
ADIW R24,0x01
int main(void) 01100100000000000000110010
CPI R24,0x16
{ 01010001100100000000000000
LDI R18,0x34
DDRA = 0x01; 11001001010001100100000000
CPC R25,R18
while(1) 00000011001001010001100100
BRLT PC-0x04
{ 00000000000011001001010001
IN R25,0x02
for(int i=0;i<=13333;i++); 10010000000000000011001001
LDI R24,0x01
PORTA = PORTA ^ 0x01; 010001100100
EOR R24,R25
}
OUT 0x02,R24
}
RJMP PC-0x000C
MOVW R28,R24
CALL 0x00000069
CALL 0x00000068
MOVW R24,R28
haiphu@hcmut.edu.vn
CẤU TRÚC 1 DÒNG LỆNH
Hàm ý địa chỉ của câu lệnh theo sau, Các lệnh JMP
hoặc CALL có THỂ SỬ DỤNG NHÃN THAY CHO ĐỊA CHỈ
NHÃN: TỪ GỢI NHỚ [TOÁN HẠNG 1][,TOÁN HẠNG 2] [,…] ;CHÚ THÍCH
* LỆNH: Trình biên dịch biên dịch ra mã máy để có thể nạp vào MCU. Ví dụ như ADD,
JMP, CALL, …
* CHỈ DẪN: Trình biên dịch KHÔNG biên dịch ra mã máy. Đều bắt đầu bằng “.”. Tuy
nhiên CÓ CHỨC NĂNG CHỈ DẪN CHO TRÌNH BIÊN DỊCH THỰC HIỆN NHỮNG CHỨC NĂNG
CỤ THỂ. Ví dụ:
- .INCLUDE: chỉ dẫn này yêu cầu trình biên dịch thêm nội dung của một file cần thiết
.INCLUDE “Chuong4.asm”
- .[C|D|E]SEG : bắt đầu cho một segment [CODE (ROM)|DATA (RAM)|EEPROM],
Chương trình không khai báo segment thì mặc định là segment CODE
.DSEG ;khai báo segment DATA
.CSEG ;khai báo segment CODE
haiphu@hcmut.edu.vn
TỪ GỌI NHỚ
* CHỈ DẪN:
- .BYTE : định nghĩa một số byte bộ nhớ trong SRAM hoặc EEPROM. Chỉ dẫn này phải theo
sau một nhãn và có tham số kèm theo
.ESEG ;bắt đầu segment EEPROM
VAR2: .BYTE 5 ;dành 5 byte trong EEPROM cho biến VAR2
- .EQU: Gán một giá trị hằng số cho một tên ký hiệu
.EQU COUNTER = 0xA0
- .SET: Giống với .EQU nhưng cho phép gán lại giá trị
- .D[B|W|D|Q]: Định nghĩa một hoặc nhiều dữ liệu theo [Byte, 2Byte (1word), 2word,
4word) cố định trong bộ nhớ chương trình (Flash ROM) hoặc EEPROM
.ORG 0x110
DATA5: .DB 'Y’
DATA6: .DB '2','0','0','5'
DATA1: .DW 0x1234,0x1122
haiphu@hcmut.edu.vn
TỪ GỌI NHỚ
* CHỈ DẪN:
- .DEF: dùng để định nghĩa cho ký hiệu là một thanh ghi
.DEF SUM = R22
- .UNDEF: Xóa để định nghĩa cho ký hiệu là một thanh ghi đã được định nghĩa trước đó
.UNDEF SUM
- .IF: theo sau là 1 điều kiện. Nếu điều kiện đúng sẽ thực hiện cho tới khi gặp ENDIF. Ngược
lại nếu điều kiện sai sẽ bỏ qua các lệnh cho tới khi gặp ENDIF
.IF 0x02>0x01
.MESSAGE “2 lớn hơn 1"
.ELSE
.MESSAGE “2 nhỏ hơn hoặc bằng 1"
.ENDIF
haiphu@hcmut.edu.vn
TỪ GỌI NHỚ
* CHỈ DẪN:
- .IFDEF, .IFNDEF: theo sau là một ký hiệu. Ký hiệu này có thể được định nghĩa EQU hoặc
SET và không được dùng chỉ dẫn DEF cho ký hiệu này. Đối với IFDEF nếu ký hiệu được
định nghĩa sẽ thực hiện các chỉ dẫn cho tới khi gặp ENDIF. Tương tự với IFNDEF
.EQU ABC = 0
.IFDEF ABC
.MESSAGE "ABC được định nghĩa"
.ENDIF
- .MACRO: dùng để thay thế một đoạn chương trình bằng 1 ký hiệu
.MACRO SUBI16 ; Start macro definition
subi @1,low(@0) ; Subtract low byte
sbci @2,high(@0) ; Subtract high byte
.ENDMACRO ; End macro definition
haiphu@hcmut.edu.vn
CÁC TOÁN TỬ VÀ BIỂU THỨC VỚI CÁC TOÁN HẠNG LÀ
HẰNG SỐ
* Định dạng dữ liệu: Có 4 cách để biểu diễn dữ liệu trong AVR: số nhị
phân(binary), thập lục phân(hex), thập phân(decimal) hoặc mã ASCII.
Hex: Có 2 cách để biểu diễn: dùng ký hiệu 0x hoặc dấu $
VD: LDI R16,0x99 Hoặc LDI R16,$99
Binary: Sử dụng ký hiệu 0b.
VD: LDI R16,0b10011001 ; R16 = 10011001B = 99H
Decimal: không sử dụng ký hiệu kèm theo
VD: SUBI R17,2 ; R17=R17- 2
ASCII: ký tự được đặt trong 2 dấu nháy đơn ’ ’
VD: LDI R22,’2’ ; R22=32
haiphu@hcmut.edu.vn
CÁC TOÁN TỬ VÀ BIỂU THỨC VỚI CÁC TOÁN HẠNG LÀ
HẰNG SỐ
* Các toán tử: KÝ HIỆU PHÉP TOÁN VÍ DỤ
+ Cộng LDI R16,10+0x2A ;R16=0x34=52
haiphu@hcmut.edu.vn
CÁC TOÁN TỬ VÀ BIỂU THỨC VỚI CÁC TOÁN HẠNG LÀ
HẰNG SỐ
* Các toán tử: KÝ HIỆU PHÉP TOÁN VÍ DỤ
== Bằng LDI R20,5==5
Khi sử dụng toán tử QUAN HỆ giữa 2 toán hạng, kết quả trả về là ĐÚNG(01H)
hoặc SAI(00H)
haiphu@hcmut.edu.vn