Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 10

CẤU TRÚC MỘT CHƯƠNG

TRÌNH ASSEMBLY
ATMEGA324

haiphu@hcmut.edu.vn
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) 011001000000000000001100100
CPI R24,0x16
{ 101000110010000000000000011
LDI R18,0x34
DDRA = 0x01; 001001010001100100000000000
CPC R25,R18
while(1) 000110010010100011001000000
BRLT PC-0x04
{ 000000001100100101000110010
IN R25,0x02
for(int i=0;i<=13333;i++); 000000000000011001001010001
LDI R24,0x01
PORTA = PORTA ^ 0x01; 100100
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Ỉ

Trình biên dịch bỏ qua trường này. Tuy nhiên nó có


chức năng chú thích cho người viết / tham khảo
chương trình để dễ hiểu khi đọc

NHÃN: TỪ GỢI NHỚ [TOÁN HẠNG 1][,TOÁN HẠNG 2] [,…] ;CHÚ THÍCH

KÝ HIỆU LỆNH, HOẶC CHỈ DẪN cho trình biên dịch

Theo sau từ gợi nhớ, có thể là NHÃN (các lệnh rẽ


nhánh) hoặc các THANH GHI / GIÁ TRỊ tức thời
(các lệnh tính toán)
Có thể KHÔNG CÓ trường này đối với 1 số lệnh
như NOP, RET, RETI, …
haiphu@hcmut.edu.vn
TỪ GỌI NHỚ
Có thể là LỆNH hoặc CHỈ DẪN cho trình biên dị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
- .ORG: Đặt vị trí bắt đầu bộ đếm cho Segment
.DSEG ;khai báo segment DATA
.ORG 0x120 ;đặt địa chỉ SRAM bắt đầu ở $120

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
- .MESSAGE: dùng để xuất 1 chuỗi khi biên dịch
.IFDEF DEBUG
.MESSAGE "Debug mode"
.ENDIF

- .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

.CSEG ; Start code segment


SUBI16 0x1234,r16,r17 ; Sub.0x1234 from r17:r16

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

- Trừ LDI R17,0xFF-0xF0 ;R17=0x0F=15


Các toán tử * Nhân LDI R18,10*5 ;R18=0x32=50
SỐ HỌC / Chia LDI R19,255/5 ;R19=0x33=51

% Chia lấy dư (modulo) LDI R20,8%6 ;R20=0x2=2

& AND LDI R20,0x0F&0x75 ;R20=0x05

Các toán tử | OR LDI R22,0xF0|0x75 ;R22=0xF5

LOGIC ^ XOR LDI R24,~0x0F ;R24=0xF0

~ NOT LDI R25, 0x0F ^0x75 ;R25=0x7A

<< Dịch trái LDI R20, 0b01010101<<1 ;R20=0b10101010

>> Dịch phải LDI R22, 0b01010101>>2 ;R22=0b00010101


Các toán tử
ĐẶC BIỆT HIGH Lấy byte cao LDI R24,HIGH(0xFFEE) ;R24=0xFF

LOW Lấy byte thấp LDI R25,LOW(0xFFEE) ;R25=0xEE

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

!= Khác LDI R20,5!=4


Các toán tử < Nhỏ hơn LDI R20,'X'<'Z'
QUAN HỆ <= Nhỏ hơn hoặc bằng LDI R20,'X'<= 'X'

> Lớn hơn LDI R20,'$'>0

>= Lớn hơn hoặc bằng LDI R20,100 >= 50

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

You might also like