1. Chuong 3- TAP LENH AVR Atmega 324P P1
Ky Thuat Robot (rường Đại học Bách khoa, Đại học Quốc gia Thành phố Hồ Chí Minh)
Scan to open on Studocu
Studocu is not sponsored or endorsed by any college or university
Chuong 3- TAP LENH AVR Atmega 324P P1
Ky Thuat Robot (rường Đại học Bách khoa, Đại học Quốc gia Thành phố Hồ Chí Minh)
Scan to open on Studocu
Studocu is not sponsored or endorsed by any college or university
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
2. Chương 3
Tập lệnh AVR
Nguyễn Lý Thiên Trường 1
Tài liệu tham khảo:
1. Chương 3: Tập lệnh AVR (Giáo trình VXL)
2. AVR Instruction Set
3. Muhammad Ali Mazidi, AVR Microcontroller and Embedded Systems: Using Assembly and C,
Pearson New International Edition, 2014.
4. Datasheet ATmega324P
5. https://nicerland.com/avr/
6. http://www.hocavr.com/
7. https://www.youtube.com/watch?v=Fr2K9pzec8g&list=PLgwJf8NK-
2e55CdbY_WnY6pejPHoojCkJ
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
3. Nguyễn Lý Thiên Trường 2
3.1 Giới thiệu
3.2 Các phương pháp định vị địa chỉ
3.3 Các nhóm lệnh
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
4. Nguyễn Lý Thiên Trường 3
3.1 Giới thiệu
▪ Các lệnh của vi điều khiển AVR được truy xuất theo từ (word).
▪ Mỗi word (2 byte) mã máy được cất trong bộ nhớ chương
trình (Flash ROM) theo kiểu Little endian (tức là byte cao được
lưu ở địa chỉ cao, byte thấp được lưu ở địa chỉ thấp).
▪ Đa số các lệnh có mã máy dài 2 byte, một số lệnh dài 4 byte.
▪ Thời gian thực thi cho mỗi lệnh đa số là 1, 2 chu kỳ máy (MC)
và một số lệnh 3, 4 chu kỳ máy.
▪ Với mỗi chip vi điều khiển khác nhau thuộc họ AVR sẽ có một
chút khác biệt có thể là về phần cứng cũng như tập lệnh đi
kèm, do đó khi sử dụng một chip cụ thể nào chúng ta cần phải
tham khảo datasheet tương ứng.
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
16 but
little endian: bye cao dc lưu ở địa chỉ cao và bye thấy dc lưu ở địa chỉ thấp
5. Nguyễn Lý Thiên Trường 4
3.1 Giới thiệu
▪ Little endian và Big endian.
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
103 là ô nhớ có đc cao và 100 là ô nhớ có đc thấp thì theo kiểu data
wowr byte cao là 01 sẽ dc lưu vào 103 và 04 sẽ dc lưu vào 100
6. Nguyễn Lý Thiên Trường 5
3.2 Các phương pháp định vị địa chỉ
▪ Tổng cộng có 15 phương pháp định địa chỉ khác nhau. Có thể
chia thành 8 nhóm như sau:
• Định địa chỉ thanh ghi đơn.
• Định địa chỉ thanh ghi (cả 2 toán hạng đều là thanh ghi).
• Định địa chỉ trực tiếp bộ nhớ SRAM.
• Định địa chỉ gián tiếp bộ nhớ SRAM (qua thanh ghi con trỏ).
• Định địa chỉ trực tiếp bộ nhớ FLASH.
• Định địa chỉ gián tiếp bộ nhớ FLASH (qua thanh ghi con trỏ).
• Định địa chỉ tương đối.
• Định địa chỉ bit.
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
7. Nguyễn Lý Thiên Trường 6
3.2 Các phương pháp định vị địa chỉ
▪ Các ký hiệu dùng trong phương pháp định địa chỉ và tập lệnh:
Các thanh ghi và toán hạng trong lệnh
Rd: thanh ghi đích/nguồn trong tập thanh ghi
Rr: thanh ghi nguồn trong tập thanh ghi
R: kết quả sau khi thực thi lệnh
K: hằng số dữ liệu
k: hằng số địa chỉ
b: bit trong tập GPRs hoặc I/O REGs (3-bit)
s: Bit trong SREG (3-bit)
X,Y,Z: Thanh ghi địa chỉ gián tiếp (con trỏ).
X=R27:R26, Y=R29:R28, Z=R31:R30
P: địa chỉ các I/O REGs cơ bản (I/O chuẩn).
q: độ dời hoặc địa chỉ trực tiếp (6-bit)
Thanh ghi trạng thái SREG và các bit trong thanh ghi
SREG: thanh ghi trạng thái
C: Cờ Carry
Z: Cờ Zero
N: Cờ âm
V: Cờ tràn bù 2
S: Cờ dấu (S = N ⊕ V)
H: Cờ nhớ phân nửa
T: bit sao chép sử dụng trong các lệnh BLD và BST
I: Cờ cho phép/không cho phép ngắt toàn cục
Hằng số và nội dung ô nhớ
A: hằng số dữ liệu A hay ô nhớ có địa chỉ là A
(A): nội dung ô nhớ có địa chỉ là A
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
x,y,z là những thanh ghi 16bit
8. 7
3.2.1 Định địa chỉ thanh ghi đơn
▪ Phương pháp này gồm có 2 kiểu tùy theo các toán hạng được
sử dụng trong lệnh: toán hạng chỉ là một thanh ghi đơn, hay
1 thanh ghi với 1 giá trị tức thời K.
▪ Đối với phương pháp có toán hạng chỉ là một thanh ghi đơn
sẽ dùng 11 bit cho opcode và 5 bit để mã hóa cho vị trí của
Rd (0d31).
Nguyễn Lý Thiên Trường
Ví dụ:
INC R2; tăng nội dung thanh ghi R2 lên 1
NEG R16; tính bù 2 nội dung thanh ghi R16
Mã máy:
INC R2; 0x9423 [0b1001 0100 0010 0011]
NEG R16; 0x9501 [0b1001 0101 0000 0001]
Cấu trúc mã lệnh với toán hạng chỉ là 1 thanh ghi đơn:
Lưu ý: lệnh CLR Rd
có cấu trúc mã máy
như lệnh EOR Rd,Rd
(xem tập lệnh).
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
9. 8
Nguyễn Lý Thiên Trường
ATmega Instruction Set
Ví dụ:
INC R2; tăng nội dung thanh ghi R2 lên 1
Mã máy: 0x9423 [0b1001 0100 0010 0011]
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
10. 9
Nguyễn Lý Thiên Trường
ATmega Instruction Set
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
ko bị ảnh
hưởng
bị ảnh hưởng
11. 10
3.2.1 Định địa chỉ thanh ghi đơn
▪ Phương pháp định địa chỉ thanh ghi đơn với một giá trị tức thời
(hằng số 8 bit) sử dụng 4 bit cho opcode, 4 bit cho Rd (16d31) và
8 bit cho dữ liệu K (Nhị phân, thập phân, thập lục phân, mã ASCII).
Nguyễn Lý Thiên Trường
Ví dụ:
LDI R16,200; R16 = 200
SUBI R28,0x20; R28 R28 - 20H
Mã máy:
LDI R16,200; 0xEC08 [0b1110 1100 0000 1000]
SUBI R28,0x20; 0x52C0 [0b0101 0010 1100 0000]
Cấu trúc mã lệnh với toán hạng là 1 thanh ghi với giá trị tức thời:
12 11
Lưu ý: chỉ được phép
sử dụng với các thanh
ghi từ R16÷R31 → được
mã hóa bằng 4 bit nhị
phân có giá trị tương
ứng từ 0÷15.
I = Immediate: tức thời Nếu K là
số âm thì
K ≥ −256
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
sử dụng thập lúc phân thì kí hiệu là 0x hoặc $
lúc này thì R16 tương ứng là 0000, R17 tương ứng 0001 và R31 là 1111
200 đổi qa nhị phân bằng 1100 1000 thì
12. 11
3.2.2 Định địa chỉ thanh ghi (cả 2 toán hạng)
Nguyễn Lý Thiên Trường
Ví dụ:
MOV R2,R3; R2 R3
ADD R1,R16; R1 R1 + R16
Mã máy:
MOV R2,R3; 0x2C23 [0b0010 1100 0010 0011]
ADD R1,R16; 0x0E10 [0b0000 1110 0001 0000]
Cấu trúc mã lệnh với cả 2 toán hạng đều là thanh ghi:
▪ Phương pháp định địa chỉ thanh ghi sử dụng trong câu lệnh có 2 toán hạng là
các thanh ghi Rd và Rr (GPRs).
▪ Thực hiện các thao tác lệnh trên các dữ liệu được đặt trong 2 thanh ghi Rd và
Rr, quy ước Rr là toán hạng nguồn, Rd là toán hạng đích, kết quả cất vào Rd.
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
13. 12
3.2.3 Định địa chỉ trực tiếp bộ nhớ SRAM
Nguyễn Lý Thiên Trường
Mã máy:
OUT PORTA,R1; 0xB812 [1011 1000 0001 0010]
OUT $02,R1; 0xB812 [1011 1000 0001 0010]
Cấu trúc mã lệnh định địa chỉ trực tiếp vùng thanh ghi I/O cơ bản:
▪ Dùng để truy xuất trực tiếp đến các thanh ghi I/O và vùng SRAM (Data memory).
▪ Ký hiệu P (0 ≤ P ≤ 63) trong tập lệnh thực hiện trên các toán hạng là các thanh ghi I/O cơ bản,
k (0 ≤ k ≤ 8FFH) là địa chỉ các ô nhớ SRAM (toàn bộ bộ nhớ SRAM).
▪ Nếu 60H ≤ k ≤ FFH (thuộc vùng I/O mở rộng): có thể thay bằng tên thanh ghi I/O tương ứng
thay vì dùng địa chỉ bộ nhớ (SRAM).
▪ Sử dụng các lệnh IN và OUT để truy cập vùng I/O cơ bản (hay vùng I/O chuẩn). Thông thường là
sử dụng tên thanh ghi I/O thay vì địa chỉ I/O.
Ví dụ:
OUT PORTA,R1; PORTA R1
OUT $02,R1; (02H) R1 ⇔ PORTA R1
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
cái bit 10:9 và 3:0 sẽ mã hóa cho địa chỉ I/O của PortA
14. 13
3.2.3 Định địa chỉ trực tiếp bộ nhớ SRAM
Nguyễn Lý Thiên Trường
Mã máy:
IN R3,PINB; 0xB033 [1011 0000 0011 0011]
IN R3,$03; 0xB033 [1011 0000 0011 0011]
Cấu trúc mã lệnh định địa chỉ trực tiếp vùng thanh ghi I/O cơ bản:
▪ Sử dụng các lệnh IN và OUT để truy cập vùng I/O cơ bản (hay vùng I/O chuẩn).
Ví dụ:
IN R3,PINB; R3 PINB
IN R3,$03; R3 (03H) ⇔ R3 PINB
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
15. 14
3.2.3 Định địa chỉ trực tiếp bộ nhớ SRAM
Nguyễn Lý Thiên Trường
Mã máy:
OUT PORTA,R1; 0xB812 (2 byte), 1MC
STS $22,R1; 0x9210, 0x0022 (4 byte)
; Thời gian thực thi: 2MC
▪ Mỗi thanh ghi I/O cơ bản trong không gian bộ nhớ dữ liệu sẽ có 2 địa chỉ tương ứng
đó là địa chỉ I/O và địa chỉ bộ nhớ (hay địa chỉ mem, địa chỉ dữ liệu).
Ví dụ:
OUT PORTA,R1; PORTA R1
STS $22,R1; (22H) R1
▪ Khi làm việc với các I/O cơ bản ta có thể dùng một trong 2
phương pháp định địa chỉ khác nhau để thực hiện lệnh
(OUT/STS, IN/LDS). Mỗi phương pháp cho kích thước mã
lệnh và thời gian thực thi lệnh khác nhau.
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
64 thanh ghi I/O cơ bản
có đc I/O từ 0x00 đến 0x3F
khi use lệnh STS phải thao tác trên
đc bộ nhớ
2 câu lệnh này tương tương
nhau về mặt chức năng
16. 15
3.2.3 Định địa chỉ trực tiếp bộ nhớ SRAM
Nguyễn Lý Thiên Trường
Mã máy:
IN R3,PINB; 0xB033 (2 byte), 1MC
LDS R3,$23; 0x9030, 0x0023 (4 byte), 2MC
▪ Mỗi thanh ghi I/O cơ bản trong không gian bộ nhớ dữ liệu sẽ có 2 địa chỉ tương ứng
đó là địa chỉ I/O và địa chỉ dữ liệu (hay địa chỉ bộ nhớ, địa chỉ mem).
Ví dụ:
IN R3,PINB; R3 PINB
LDS R3,$23; R3 (23H)
▪ Khi làm việc với các I/O cơ bản ta có thể dùng một trong 2
phương pháp định địa chỉ khác nhau để thực hiện lệnh
(OUT/STS, IN/LDS). Mỗi phương pháp cho kích thước mã
lệnh và thời gian thực thi lệnh khác nhau.
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
lệnh này cg chỉ thao tác trên vùng
địa chỉ bộ nhớ
NX: nếu truy cập đến vùng I/O cơ bản thì nên use lệnh OUT/IN
17. 16
3.2.3 Định địa chỉ trực tiếp bộ nhớ SRAM
Nguyễn Lý Thiên Trường
Mã máy:
LDS R0,UDR0; 0x9000, 0x00C6
STS $100,R0; 0x9200, 0x0100
Cấu trúc mã lệnh định địa chỉ trực tiếp vùng thanh ghi I/O mở rộng và SRAM:
▪ Sử dụng các lệnh STS và LDS để truy cập vùng I/O mở rộng và vùng Data SRAM (2KB).
➢ Lưu ý: các lệnh STS và LDS dùng để truy cập trực tiếp
đến tất cả nội dung SRAM từ 000H đến 8FFH.
Ví dụ:
LDS R0,UDR0; R0 UDR0
STS $100,R0; (100H) R0
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
I/O
cơ
bản
I/O
mở
rộng
vùng IO mở rộng
thì ko có địa chỉ IO
có thể use cái tên
lưu lưu nội dung R0 vào ô nhớ SRAM có đc
100H
vùng IO cơ bản thì nên use
IN/OUT
18. 17
3.2.4 Định địa chỉ gián tiếp bộ nhớ SRAM
▪ Phương pháp định địa chỉ gián tiếp qua thanh ghi thực hiện trên các lệnh dùng để truy
xuất dữ liệu vùng SRAM sử dụng các thanh ghi con trỏ X, Y hoặc Z.
▪ Các thanh ghi X, Y, Z hoạt động như các con trỏ (pointer) và nội dung của các thanh ghi
này là địa chỉ của các ô nhớ trong vùng SRAM, nơi mà dữ liệu sẽ được đọc hoặc là ghi.
▪ Phương pháp này được chia ra làm 4 kiểu khác nhau: dữ liệu gián tiếp, dữ liệu gián
tiếp với tiền tố trừ (-), dữ liệu gián tiếp với hậu tố cộng (+) và dữ liệu gián tiếp với một
độ chuyển dời q (6 bit, 0 ≤ q ≤ 63) thông qua các lệnh LD, LDD, ST, STD.
Ví dụ: Để thực hiện việc ghi giá trị 0xCC vào địa chỉ SRAM 0x800 cùng với việc chọn
thanh ghi Y làm con trỏ trong phương pháp định địa chỉ này, ta thực hiện các lệnh sau:
LDI R16,0xCC ;lưu dữ liệu cần ghi vào R16
LDI R28,0x00 ;lưu địa chỉ ô nhớ vào Y
LDI R29,0X08 ;Y YH:YL R29:R28
ST Y, R16;ghi dữ liệu
0xCC
Bộ nhớ SRAM
0x800
0x801
0x7FF
Trực tiếp?
Gián tiếp:
LDI R16,0xCC ;R16 = CCH
STS 0x800, R16; (0x800) R16
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
Store là lưu trữ
LDS và STS dc dùng để
truy cập trực tiếp
còn LD, LDD, ST, STD là truy cập gián tiếp, mà gián tiếp thì phải thông qua con trỏ
ko thể ghi trực tiếp giá trị
0xCC vào ô nhớ này dc mà
phải thông qua R16
19. 18
3.2.4 Định địa chỉ gián tiếp bộ nhớ SRAM
Ví dụ: Đọc nội dung SRAM ở ô nhớ có địa chỉ 0x800 cùng với việc chọn thanh ghi X làm
con trỏ. Kết quả lưu vào thanh ghi R7.
LDI R27,0x08 ;lưu byte cao địa chỉ ô nhớ vào X
LDI R26,0x00 ; lưu byte thấp địa chỉ ô nhớ vào X
LD R7, X; đọc dữ liệu
0xCC
Bộ nhớ SRAM
0x800
0x801
0x7FF
Trực tiếp?
Gián tiếp:
LDS R7,0x800; R7 (0x800)
➢ Lưu ý: Thanh ghi X ≡ XH:XL ≡ R27:R26
LDI XH,0x08 ;lưu byte cao địa chỉ ô nhớ vào X
LDI XL,0x00 ;lưu byte thấp địa chỉ ô nhớ vào X
LD R7, X; đọc dữ liệu
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
1
2
sau 2 câu lệnh 1 và 2 thì nội dung thanh ghi X là 0x0800
20. 19
3.2.4 Định địa chỉ gián tiếp bộ nhớ SRAM
Ví dụ: Đọc nội dung SRAM ở ô nhớ có địa chỉ 0x800 cùng với việc chọn thanh ghi Z làm
con trỏ kết hợp với tiền tố trừ. Kết quả lưu vào thanh ghi R7.
LDI R31,0x08 ;lưu byte cao địa chỉ ô nhớ vào Z
LDI R30,0x01 ;lưu byte thấp địa chỉ ô nhớ vào Z
LD R7, -Z ;Z Z - 1, đọc dữ liệu
0xCC
Bộ nhớ SRAM
0x800
0x801
0x7FF
Gián tiếp:
➢ Lưu ý: Thanh ghi Z ≡ ZH:ZL ≡ R31:R30
LDI ZH,0x08 ;lưu byte cao địa chỉ ô nhớ vào Z
LDI ZL,0x01 ;lưu byte thấp địa chỉ ô nhớ vào Z
LD R7, -Z ;Z Z - 1, đọc dữ liệu
▪ Phương pháp định địa chỉ gián tiếp với tiền tố trừ (-) thực hiện trong câu lệnh có
các toán hạng là các thanh ghi con trỏ với ký hiệu dấu trừ phía trước X, Y, Z (-X, -Y,
-Z).
▪ Địa chỉ của các toán hạng được xác định bằng cách lấy nội dung của các con trỏ trừ
đi 1 trước khi thực hiện lệnh, và kết quả này sẽ giữ nguyên trong con trỏ sau khi
thực hiện xong lệnh.
▪ Lưu ý: hậu tố trừ sau X, Y, Z (X-, Y-, Z-) : sai cú pháp.
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
tức là con trỏ sẽ bị thay đổi nội dung do là nó sẽ trừ trước khi truy cập đến địa chỉ 0800
nên ban đầu phải khởi tạo cái X có giá trị lớn hơn
là 0801
sau lệnh 3 thì R7 = 0xCC và Z = 0800
3
21. 20
3.2.4 Định địa chỉ gián tiếp bộ nhớ SRAM
Ví dụ: Đọc nội dung SRAM ở ô nhớ có địa chỉ 0x800 và 0x801 cùng với việc chọn thanh
ghi Z làm con trỏ kết hợp với hậu tố cộng. Kết quả lưu vào thanh ghi R7 và R8 tương
ứng.
LDI ZH,0x08 ;lưu byte cao địa chỉ ô nhớ vào Z
LDI ZL,0x00 ;lưu byte thấp địa chỉ ô nhớ vào Z
LD R7, Z+ ;đọc dữ liệu, Z Z + 1
LD R8, Z
0x2A
0xCC
0x12
Bộ nhớ SRAM
0x800
0x801
0x7FF
Gián tiếp:
▪ Phương pháp định địa chỉ gián tiếp với hậu tố cộng (+) thực hiện trong câu lệnh có
các toán hạng là các thanh ghi con trỏ với ký hiệu dấu cộng phía sau X, Y, Z (X+, Y+,
Z+).
▪ Phương pháp này thực hiện xong lệnh rồi tăng nội dung con trỏ lên 1. Kết quả này
sẽ giữ nguyên trong con trỏ sau khi thực hiện xong lệnh.
▪ Lưu ý: tiền tố cộng trước X, Y, Z (+X, +Y, +Z): sai cú pháp.
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
sau khi thực hiện xong thì nội dung con trỏ
sẽ tăng lên, tức là nội dung con trỏ sẽ thay
đổi sau khi thực hiện
sau lệnh này thì nó tự
động tăng z lên 1 là
0801
sau lệnh này thì z là 0801
22. 21
3.2.4 Định địa chỉ gián tiếp bộ nhớ SRAM
Ví dụ: Đọc nội dung SRAM ở ô nhớ có địa chỉ 0x7FF và 0x801 cùng với việc chọn thanh
ghi Z làm con trỏ kết hợp với độ dời. Kết quả lưu vào thanh ghi R7 và R8 tương ứng.
LDI ZH,0x07 ;lưu byte cao địa chỉ ô nhớ vào Z
LDI ZL,0xFF ;lưu byte thấp địa chỉ ô nhớ vào Z
LD R7, Z ;đọc dữ liệu
LDD R8, Z+2
0x2A
0xCC
0x12
Bộ nhớ SRAM
0x800
0x801
0x7FF
Gián tiếp:
▪ Phương pháp định địa chỉ gián tiếp với độ dời: việc xác định địa chỉ toán hạng
trong phương pháp này bằng cách cộng nội dung của con trỏ với một độ dời q có
giá trị nguyên 6 bit (0 ≤ q ≤ 63) rồi mới thực hiện lệnh. Con trỏ trong phương pháp
này chỉ được dùng với 2 thanh ghi Y và Z.
▪ Lưu ý: việc cộng với độ dời không làm thay đổi nội dung con trỏ. Không sử dụng độ
dời q < 0 (bị báo lỗi cú pháp).
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
r7=(0x7FF)=0x2A
r8=(0x801)=0x12
lệnh có độ dời phải là LDD
ban đầu sẽ lấy z cộng thêm 2 thành 801 rồi sau đó mới trỏ
đến r8. Sau lệnh này thì thằng z vẫn là 7FF
23. 22
3.2.5 Định địa chỉ trực tiếp bộ nhớ FLASH
▪ Được dùng trong các câu lệnh JMP k và CALL k, với k = 0…3FFFH.
▪ Lưu ý: có thể sử dụng Nhãn thay vì địa chỉ k.
Ví dụ: Xét lệnh JMP LABEL, giả sử nhãn LABEL đặt tại địa chỉ 2000H và OP-CODE
tương ứng của lệnh JMP là 1001 0101 10 thì mã máy của lệnh sẽ là 4 byte
tương ứng là:
1001 0100 0000 1100 (0x940C)
0010 0000 0000 0000 (0x2000)
Nguyễn Lý Thiên Trường
Cấu trúc mã lệnh của lệnh JMP k
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
k = 2000H
24. 23
3.2.6 Định địa chỉ gián tiếp bộ nhớ FLASH
▪ Truy xuất dữ liệu gián tiếp từ bộ nhớ chương trình:
• Một địa chỉ trong bộ nhớ chương trình (FLASH) cần được truy xuất sẽ
đặt trực tiếp vào thanh ghi Z tại các vị trí MSBs. Vì tổ chức của bộ
nhớ chương trình là một từ 16 bit, nên nội dung cần truy xuất sẽ
chọn dữ liệu là byte thấp hoặc byte cao của địa chỉ cần truy xuất, việc
này được xác định bởi bit LSB của thanh ghi Z.
• Phương pháp này được sử dụng trong các câu lệnh: LPM; LPM Rd,Z;
LPM Rd,Z+ hay SPM. Tuy nhiên, lệnh SPM không hoàn toàn có sẵn
trong tất cả các chip của họ AVR (ATmega324P có hỗ trợ lệnh SPM).
• Khi lệnh LPM không có toán hạng thì R0 là thanh ghi đích được hiểu
ngầm trong lệnh. Trong trường hợp này, mã máy cố định là: 0x95C8.
Ví dụ: Đọc byte thấp của
ô nhớ FLASH có địa chỉ
$0001 về R0
LDI ZH, HIGH(0x0001 << 1)
LDI ZL, LOW(0x0001 << 1)
LPM
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
địa chỉ byte thấp sẽ gấp đôi địa chỉ word, còn địa chỉ byte cao thì = địa chỉ byte thấp + 1
1
2
sau 2 cậu lệnh 1
và 2 thì z = 0x0002
25. 24
3.2.6 Định địa chỉ gián tiếp bộ nhớ FLASH
▪ Truy xuất gián tiếp địa chỉ bộ nhớ chương trình:
• Trong phương pháp định địa chỉ này, thanh ghi PC được nạp địa chỉ
thực thi gián tiếp qua thanh ghi Z.
• Phương pháp định địa chỉ gián tiếp qua thanh ghi Z sử dụng trong các
lệnh IJMP và ICALL, không có toán hạng và mã máy là 1 giá trị cố
định: IJMP (0x9409) và ICALL (0x9509).
• Định vị địa chỉ này còn gọi là định vị địa chỉ tuyệt đối (Absolute
Adressing).
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
26. 25
3.2.7 Định địa chỉ tương đối
▪ Định địa chỉ tương đối không điều kiện: Phương pháp này được sử dụng trong các
lệnh RJMP và RCALL. Toán hạng trong lệnh là một nhãn hoặc một địa chỉ nằm trong
phạm vi một độ dời tương đối k (hay offset), với k là 1 số có dấu 12 bit so với PC của
lệnh kế, có giá trị từ -2048 đến +2047. Địa chỉ đích = PC lệnh kế + k
▪ Cấu trúc mã lệnh RCALL (Relative Call to Subroutine):
▪ Cấu trúc mã lệnh RJMP (Relative Jump):
Ví dụ: tính mã máy cho lệnh RCALL DELAY, giả sử rằng lệnh RCALL đặt tại địa chỉ 2000H và
nhãn DELAY đặt tại 200BH.
→ PC lệnh hiện tại (lệnh RCALL DELAY) là 2000H → PC của lệnh kế là 2001H (vì lệnh RCALL
dài 1 word) → k (hay offset) = 12 bit của kết quả (200BH – 2001H) = +10 (số thập phân).
→ Mã máy (hay mã lệnh) tương ứng của lệnh RCALL DELAY là: 1101 0000 0000 1010.
Nguyễn Lý Thiên Trường
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
12 bit độ dời có dấu bù 2
chỉ lấy 12bit của kết quả 200BH-2001H
+10 là 12bit có dấu bù 2 mà 10 là 1010
27. 26
3.2.7 Định địa chỉ tương đối
▪ Định địa chỉ tương đối có điều kiện: Phương pháp này áp dụng cho các lệnh nhảy có
điều kiện xét theo các bit cờ trạng thái thanh ghi SREG hoặc so sánh giữa 2 thanh ghi.
Độ lệch k (offset) là số có dấu 7 bit nên k = -64 ÷ +63, do đó địa chỉ đích giới hạn trong
vùng: (PC lệnh kế - 64) ≤ địa chỉ đích ≤ (PC lệnh kế + 63); đc đích = PC lệnh kế + k
▪ Cấu trúc mã lệnh cho các lệnh rẽ nhánh có điều kiện:
Ví dụ: lệnh BRVS LOOP, lệnh này sẽ rẽ nhánh đến nhãn LOOP khi cờ tràn V trong thanh ghi
SREG bằng 1. Giả sử lệnh được đặt tại địa chỉ 50H và nhãn LOOP đặt tại 40H, lệnh này có
OP-CODE là 111100. Ta có k = 7 bit của (địa chỉ đích – PC lệnh kế) = 7 bit của (40H– 51H) =
1101111. Cờ V có vị trí ở bit 3 của thanh ghi SREG nên ta sẽ có mã máy tương ứng của lệnh
là: 1111 0011 0111 1011.
Vị trí cờ trong
thanh ghi SREG
Mã lệnh (ví dụ: BRVS → 111100) Độ dời (hay offset): 7 bit có dấu
SREG:
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
7 bit có dấu bù 2
28. 27
3.2.8 Định địa chỉ bit
▪ Định địa chỉ bit theo BYTE: Phương pháp định địa chỉ này được sử dụng trong các
lệnh xử lý bit đối với các bit có địa chỉ bit thuộc các thanh ghi I/O có địa chỉ từ
001FH (thuộc vùng thanh ghi I/O cơ bản), hoặc bit của nhóm thanh ghi GPRs.
▪ Địa chỉ của toán hạng được xác định chính là địa chỉ bit và địa chỉ thanh ghi tương
ứng trong toán hạng của lệnh.
▪ Phương pháp này được sử dụng cho 2 nhóm lệnh: nhóm lệnh chỉ tác động trên các
bit của các thanh ghi I/O cơ bản (đ/c 001FH) gồm các lệnh SBI và CBI; nhóm còn lại
là 2 lệnh BST và BLD, liên quan đến bit T của thanh ghi SREG và các bit của các thanh
ghi GPRs, trong trường hợp này địa chỉ của bit T được hiểu ngầm trong mã lệnh.
Nguyễn Lý Thiên Trường
Ví dụ: lệnh SBI PORTA,6 sẽ đặt bit 6 (110)
của thanh ghi PORTA lên 1 (địa chỉ I/O
tương ứng của PORTA là 00010). Ta có mã
máy của lệnh là: 1001 1010 0001 0110.
Lệnh BLD R3,7 thực hiện lấy nội dung của
bit T trong thanh ghi SREG lưu vào bit 7
(111) của thanh ghi R3. Ta có mã máy
tương ứng của lệnh là: 1111 1000 0011
0111.
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
(R0-R31)
bi là mã hóa vị trí của bit trong thanh ghi đa dụng
29. 28
3.2.8 Định địa chỉ bit
▪ Định địa chỉ bit theo BIT: Phương pháp định địa chỉ BIT theo BIT chỉ được thực hiện
trên các bit của thanh ghi SREG, thực hiện trên các lệnh đặt/xóa cờ BSET/BCLR hoặc
SE/CL.
Nguyễn Lý Thiên Trường
Ví dụ: lệnh BCLR 0 hoặc CLC cả 2 lệnh đều thực hiện việc xóa cờ Carry trong
thanh ghi SREG, có mã máy là 1001 0100 1000 1000.
b7 = 1: lệnh BCLR/CL
b7 = 0: lệnh BSET/SE
Downloaded by tran ivan (ivantrantien123@gmail.com)
lOMoARcPSD|36009385
vị trí của cờ C trong SREG là 0