You are on page 1of 39

ME4169: MicroProcessor

Lecturer: PhD. Dang Thai Viet


Mechatronics Department, School of Mechanical Engineering, HUST
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

3.1 Thanh ghi trong AVR

• CPU sử dụng các thanh ghi để lưu trữ dữ liệu tạm thời. Để lập trình bằng ngôn ngữ Assembly,
chúng ta phải hiểu các thanh ghi và kiến trúc của một CPU nhất định và vai trò của chúng trong
việc xử lý dữ liệu.

• Bộ vi điều khiển AVR có nhiều thanh ghi cho các phép toán số học và logic. Phần lớn các thanh
ghi AVR là các thanh ghi 8 bit.

• Các phạm vi này từ MSB (bit quan trọng nhất) D7 tới LSB (bit có ý nghĩa nhỏ nhất) D0 (hình 1).

Hình 1. Thanh ghi 8 bit

3
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

3.1 Thanh ghi trong AVR

• Trong AVR có 32 thanh ghi đa năng, từ R0–R31 và nằm ở vị trí thấp


nhất của địa chỉ bộ nhớ.

• Các thanh ghi mục đích chung trong AVR giống như bộ tích lũy trong
các bộ vi xử lý khác, được sử dụng bởi tất cả các lệnh số học và logic.

• Trong ví dụ phân tích về 2 tệp lệnh đơn giản: LDI và ADD.

Hình 2. 32 thanh ghi đa năng của AVR


4
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Lệnh LDI
• Lệnh LDI sao chép dữ liệu 8 bit vào thanh ghi cho mục đích chung. Định dạng câu lệnh:

• K là giá trị 8 bit có thể là 0–255 ở dạng thập phân hoặc 00–FF ở dạng hex và Rd là R16 đến R31
(bất kỳ thanh ghi nào trong số 16 thanh ghi mục đích chung phía trên). Lệnh sau tải thanh ghi R20
với giá trị 0x25 (25 ở dạng hex):

• Lưu ý: không thể tải giá trị vào các thanh ghi từ R0 đến R25 bằng lệnh LDI.

5
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Lệnh ADD
• Định dạng câu lệnh ADD:

• Lệnh ADD yêu cầu CPU cộng giá trị của Rr vào Rd và đưa kết quả trở lại thanh ghi Rd:

• Thanh ghi mục đích chung (GPRs) và ALU vị trí và quan hệ được biểu diễn trong hình 3.

6
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

Hình 3. GPRs và ALU trong vi điều khiển AVR


7
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

3.2 Bộ nhớ của AVR

• Trong bộ vi điều khiển AVR có hai loại


không gian bộ nhớ: không gian bộ nhớ
mã và không gian bộ nhớ dữ liệu (hình
4).

• Bộ nhớ dữ liệu bao gồm ba phần: GPR


(các thanh ghi đa năng), bộ nhớ I/O và
SRAM dữ liệu nội bộ.

Hình 4. Bộ nhớ của bộ vi điều khiển AVR


8
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Thanh ghi mục đích chung (GPR)

• GPR sử dụng 32 byte dung lượng bộ nhớ dữ liệu. Chúng luôn lấy vị trí địa chỉ $00–$1F trong
bộ nhớ dữ liệu không gian, bất kể số chip AVR (hình 3).

❖ Bộ nhớ I/O (SFR)

• Bộ nhớ I/O được dành riêng cho các chức năng cụ thể như thanh ghi trạng thái bộ timer, giao
tiếp nối tiếp, cổng I/O, ADC, …

• Bộ nhớ I/O AVR là được tạo thành từ các thanh ghi 8 bit. Số lượng vị trí trong bộ nhớ dữ liệu
được dành riêng cho bộ nhớ I/O phụ thuộc vào số chân và chức năng ngoại vi được hỗ trợ bởi
loại chip AVR

9
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

• Tất cả các AVR đều có ít nhất 64 byte vị


trí bộ nhớ I/O (bộ nhớ I/O tiêu chuẩn).

• Trong các AVR có hơn 32 chân I/O (ví


dụ: ATmega64, ATmega128 và
ATmega256) cũng có bộ nhớ mở rộng
I/O (hình 5).

Hình 5. Bộ nhớ mở rộng I/O


10
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Dữ liệu nội bộ SRAM


• Dữ liệu nội bộ SRAM được sử dụng rộng rãi để lưu trữ dữ liệu và tham số bởi các lập trình viên
AVR và trình biên dịch C.

• Mỗi vị trí của SRAM có thể được truy cập trực tiếp bằng địa chỉ của nó..
• Mỗi vị trí rộng 8 bit và có thể được sử dụng để lưu trữ bất kỳ dữ liệu nào chúng ta muốn miễn là
dữ liệu đó là 8 bit. Bảng 1. Kích cỡ bộ nhớ của các chip AVR

11
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

3.3 Sử dụng tệp lệnh với bộ nhớ dữ liệu


❖ Lệnh LDS (Load trực tiếp từ không gian dữ liệu )

• Lệnh LDS yêu cầu CPU tải (sao chép) một byte từ một địa chỉ trong bộ nhớ dữ liệu tới GPR.

• Sau khi lệnh này được thực thi, GPR sẽ có cùng giá trị với vị trí trong bộ nhớ dữ liệu.
• Lệnh sau tải R5 với nội dung của vị trí 0x200. 0x200 nằm trong SRAM (hình 5).

12
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

• Chương trình sau thêm nội dung của vị trí 0x300 vào vị trí 0x302.

Bảng 2. Nội dung thay đổi từ vị trí 0x300 và 0x302

Hình 6. Quá trình thêm nội dung từ vị trí 0x300 và 0x302


13
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Lệnh STS (Lưu (store) trực tiếp từ không gian dữ liệu)

• Lệnh STS yêu cầu CPU lưu trữ (sao chép) nội dung của GPR đến một vị trí địa chỉ trong không
gian bộ nhớ dữ liệu.

• Chương trình sau đây trước tiên tải thanh ghi R16 có giá trị 0x55, sau đó di chuyển giá trị này
xung quanh các thanh ghi I/O của cổng B, C và D.

14
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Lệnh IN (IN từ vị trí I/O)

• Lệnh IN yêu cầu CPU tải một byte


từ thanh ghi I/O vào GPR.

15
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Lệnh IN (IN từ vị trí I/O)

• Trong lệnh IN, các thanh ghi I/O


được tham chiếu bằng địa chỉ I/O
của chúng.

- tải R19 với vị trí $10 (R19 = PIND).

16
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ So sánh lệnh IN và LDS

• CPU thực thi lệnh IN nhanh hơn LDS. Lệnh IN kéo dài 1 chu kỳ máy, trong khi LDS kéo dài 2
chu kỳ máy.
• IN là lệnh 2 byte, trong khi LDS là lệnh 4 byte. Lệnh IN chiếm ít bộ nhớ mã hơn.

• Khi sử dụng lệnh IN, chúng ta có thể sử dụng tên của các thanh ghi I/O thay vì địa chỉ.

• Lệnh IN có sẵn trong tất cả các AVR, trong khi LDS thì không được triển khai ở một số AVR.

▪ Sử dụng lệnh IN chúng ta chỉ có thể truy cập vào I/O tiêu chuẩn bộ nhớ. Lệnh LDS truy cập tất
cả các phần của bộ nhớ dữ liệu.

17
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ LỆNH OUT (OUT đến vị trí I/O)

• Lệnh OUT yêu cầu CPU lưu GPR vào thanh ghi I/O.

• Chúng ta không thể sao chép một giá trị tức thời vào thanh ghi I/O cũng như vào vị trí SRAM.

18
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ LỆNH MOVE

• Lệnh MOV được sử dụng để sao chép dữ liệu giữa các thanh ghi GPR của R0–R31.

• Chương trình sau thêm 0x19 vào nội dung của vị trí 0x220 và lưu trữ kết quả ở vị trí 0x221.

19
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ LỆNH INC

• Lệnh INC tăng nội dung của Rd lên 1.

❖ LỆNH SUB

• Lệnh SUB báo cho CPU trừ giá trị của Rr khỏi Rd và đưa nội dung về Rd.

20
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

• Các lệnh trong Bảng 2 hoạt động trên hai thanh ghi GPR nguồn (Rr) và đích (Rd) sau đó đặt kết
quả vào thanh ghi đích (Rd).
• Các lệnh trong Bảng 3 hoạt động trên một thanh ghi GPR và đặt kết quả sau đó đặt kết quả vào
thanh ghi GPR đó.
Bảng 2. Lệnh ALU sử dụng 2 GPR

21
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ LỆNH DEC

• Lệnh DEC giảm nội dung của Rd đi 1.

Bảng 3. Một số hướng dẫn sử dụng GPR làm toán hạng

22
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ LỆNH COM

• Lệnh COM bổ sung (đảo ngược) nội dung của Rd và đặt kết quả trở lại nội dung vào Rd.

• Ví dụ: Viết 1 chương trình để chuyển đổi liên tục thanh ghi I/O của cổng B

23
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

3.4 Thanh ghi trạng thái AVR

• Giống như tất cả các bộ vi xử lý khác, AVR có một thanh ghi cờ để biểu thị các điều kiện số học
chẳng hạn như bit mang (carry bit).
▪ Cấu trúc thanh ghi trạng thái
• Thanh ghi trạng thái là thanh ghi 8 bit. Nó còn được gọi là bộ đăng ký cờ. Các bit C, Z, N, V, S và
H được gọi là cờ điều kiện, xảy ra sau khi một lệnh được thực thi.

Hình 7. Các bit của thanh ghi trạng thái (SREG)


24
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ C, cờ mang (the carry flag)


• Cờ này được đặt, bất cứ khi nào có sự thực hiện từ bit D7. Bit cờ này bị ảnh hưởng sau phép cộng
hoặc trừ 8 bit.

▪ Z, cờ số 0 (the zero flag)

• Cờ 0 phản ánh kết quả của phép toán số học hoặc logic. Nếu kết quả bằng 0 thì Z = 1. Do đó, Z =
0 nếu kết quả khác 0.

▪ N, cờ âm (the negative flag)


• Biểu diễn nhị phân của số có dấu sử dụng D7 làm bit dấu. Cờ âm phản ánh kết quả của một phép
tính số học. Nếu bit D7 của kết quả bằng 0 thì N = 0 và kết quả là dương. Nếu bit D7 là 1 thì N =
1 và kết quả là âm.

25
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ V, cờ tràn (the overflow flag)


• Cờ này được đặt bất cứ khi nào kết quả của phép toán số có dấu quá lớn, khiến bit bậc cao tràn
vào bit dấu. Cờ nhớ được sử dụng để phát hiện lỗi trong các phép tính số học không dấu trong khi
tràn.
▪ S, bit dấu (the Sign bit)

• Cờ này là kết quả của phép OR của cờ N và V.

▪ H, cờ mang một nửa (the haft carry flag)

• Nếu có sự mang từ D3 đến D4 trong hoạt động lệnh ADD hoặc SUB, bit này được thiết lập; nếu
không, nó sẽ bị xóa. Bit cờ này được sử dụng bởi các lệnh thực hiện theo hệ số BCD (binary
coded decimal)

26
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Lệnh ADD và thanh ghi cờ


• Tác động của lệnh ADD lên các bit cờ C, H, và Z của thanh ghi trạng thái.

▪ Ví dụ:

- Giá trị trong thanh ghi R20 về 0

27
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ Ví dụ:

- C = 0 vì không có phần nhớ nào vượt quá bit D7.

- H = 1 vì có sự mang từ bit D3 sang bit D4.

- Z = 0 vì R16 (kết quả) có giá trị khác 0 sau phép cộng.

28
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ Ví dụ:

- C = 1 vì có phần mang vượt quá bit D7.

- H = 1 vì có sự mang từ bit D3 sang bit D4.

- Z = 1 vì R20 (kết quả) có giá trị 0 sau phép cộng.

29
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ Ví dụ:

- C = 1 vì có phần mang vượt quá bit D7.

- H = 0 vì không có sự mang từ bit D3 sang bit D4.

- Z = 0 vì R20 (kết quả) có giá trị khác 0 sau phép cộng.

30
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Lệnh ảnh hưởng tới cờ

• Một số lệnh ảnh hưởng đến tất cả


sáu bit cờ C, H, Z, S, V và N
(ADD).

• Một một số lệnh không ảnh hưởng


đến bit cờ nào cả, lệnh load dữ
liệu.

• Một số lệnh chỉ ảnh hưởng đến một


số bit cờ (AND).

Bảng 4. Ảnh hưởng của lệnh tới giá trị cờ

31
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Bit cờ tới ra quyết định

• Một số lệnh sẽ thực hiện nhảy có điều kiện (rẽ


nhánh) dựa trên trạng thái của bit cờ.

Bảng 5. Lệnh rẽ nhánh liên quan giá trị bit cờ

32
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ Bài tập:

• Tìm giá trị bit cờ C, H, Z sau khi thực hiện 3 đoạn chương trình

33
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

3.5 Định dạng dữ liệu và chỉ dẫn AVR


❖ Kiểu dữ liệu AVR
• Bộ vi điều khiển AVR chỉ có một loại dữ liệu là 8 bit và kích thước của mỗi thanh ghi cũng là 8
bit.
• Công việc của người lập trình là chia nhỏ dữ liệu lớn hơn 8 bit (00 đến 0xFF hoặc 0 đến 255 ở
dạng thập phân) để CPU xử lý.

❖ Biểu diễn định dạng data

• Có bốn cách để biểu diễn một byte dữ liệu trong trình biên dịch AVR: dạng hex, nhị phân, thập
phân hoặc ASCII

34
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ Số thập lục phân (Hex)

• Đặt 0x (or 0X) lên phía trước của phần số trong lệnh ví dụ: LDI R16, 0x99.
• Viết $ vào trước số như sau: LDI R22, $99.

• Ví dụ:

▪ Số nhị phân (Binary)

35
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

▪ Số thập phân (Decimal)

▪ Ký tự ASCII

36
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Chỉ dẫn trong AVR


• Trong khi các lệnh cho CPU biết phải làm gì thì các lệnh (còn gọi là các lệnh giả) đưa ra các chỉ
dẫn cho trình biên dịch mã.

• Ví dụ: LDI và ADD các lệnh là các lệnh gửi đến CPU, nhưng .EQU, .DEVICE và .ORG là các
lệnh gửi đến trình biên dịch mã.

37
Chương 3: Cấu trúc AVR và lập trình hợp ngữ (Assembly)

❖ Ví dụ về lập trình Assembly

38
THANK YOU !

You might also like