AVR - Website Staff UI

advertisement
IKI10230
Pengantar Organisasi Komputer
Kuliah no. A2: Bahasa Rakitan AVR
Data Transfer Instructions
Sumber:
1. AVR AT90S8515 Data Sheet.
2. Materi kuliah CS152, th. 1997, UCB.
7 Maret 2003
Bobby Nazief ([email protected])
Qonita Shahab ([email protected])
bahan kuliah: http://www.cs.ui.ac.id/~iki10230/
1
Why RISC?
° Reduced Instruction Set Computing (RISC)
° Hanya terbatas jenis/jumlah instruksi untuk operasi
dasar
• Arithmetic, load/store, branches and jumps
• Instruksi umum dan sering digunakan: sederhana dan
cepat
make common case: simple and fast
Top 10 80x86 Instructions
Rank
Instruction
Integer Average Percent total executed
1
load
22%
2
conditional branch
20%
3
compare
16%
4
store
12%
5
add
8%
6
and
6%
7
sub
5%
8
move register-register
4%
9
call
1%
10
return
1%
Total
96%
Simple instructions dominate instruction frequency
2
Why AVR 8-bit RISC
° RISC: kinerja (performance) komputer meningkat
• Pilihan teknologi rancangan prosesor modern (PowerPC,
Sun Sparc, MIPS dll)
• Fast with reduced complexity!
° Atmel AVR 8-bit RISC
• Sederhana (bentuk minimalis dari RISC): mudah dipelajari !
• Target operasi: microcontroller (embedded systems)
-
Berbagai aplikasi dan peralatan elektronis (ponsel, home
appliances, mobil, dll)
Controller untuk pabrik, proses kimia, mesin dll.
“Vast opportunity”: karir, wira-usaha dll. (more embedded
computers than PCs!!!)
° Why not X86 (Intel, mikroprosesor paling populer)
• Terlalu rumit (complex): operasi beragam dan sangat
banyak variasinya
• Akses langsung ke register di PC kita? 
3
Arsitektur AVR AT90S8515
4
AVR Registers (1/3)
° Register AVR disebut “general purpose”
• Semua register tersambung langsung ke ALU  dua
register dapat diakses dengan satu instruksi dalam satu
clock cycle
• Semua register seragam sebagai variabel operand
• Data akses dari dan ke memori dilakukan melalui register
dengan instruksi load dan store
• Semua register dapat digunakan untuk “load” data dari
memori, tempat operasi dilakukan, dan “store” data ke
memori
° Karakteristik register AVR:
• Menyimpan 1 word adalah 8 bit (1 byte)
• Terdapat 32 Register
• Konvensi penamaan: R0 …. R31 (supaya mudah di-ingat/
kode)
5
AVR Registers (2/3)
PC
SP
6
AVR Registers (3/3)
“pointer registers”
•addressing 16 bit untuk menunjuk ke lokasi di
SRAM (X,Y,Z) atau di program memory (Z)
7
Set Instruksi AVR
° Instruksi dapat dikelompokkan sesuai dengan
fungsi:
-
Transfer Data (31)
-
Aritmatika & Logika (22)
Bit & Bit-Test (31)
Pencabangan (Branch) (34)
° Instruksi diusahakan reguler (mengikuti format
yang baku): hanya 6 jenis format
16
4
OP
I
16
II
d
9
OP
16
III
4
r
10
OP
5
n
31
IV
d
OP
16 LSBs
16
10
P
20
Rr/Rd
OP
16
OP
5
n
q
V
11
VI
k
8
Set Instruksi AVR: Rangkuman
9
Contoh Program
AVR Assembly:
;asumsi register Z menunjuk ke var. i
;register Y, menunjuk ke var. j
---ld R1, Z
ld R2, Y
cpi i, 0
breq TEST
add R1,R2
jmp EXIT
;
;
;
;
;
;
R1 berisi var. i
R2 berisi var. Y
compare i dengan 0
if Z flag set then branch TEST
i = i + j
unconditional jump; skip
TEST:ldi R1, 50; i = 50
EXIT: …………
10
Instruksi: Data Transfer
11
Assembly Operands: Memory
° Variabel HLL disimpan pada register;
Bagaimana struktur data yang besar, mis. array?
° Remember: memory (salah satu komponen utama
komputer) dapat menyimpan data yang besar
° Tapi instruksi arithmetik AVR hanya beroperasi pada
register (sebagai operand), tidak dapat langsung
pada memory
° Instruksi Data Transfer memindahkan/transfer data
antara register dan memory:
• Memory ke register (sering disebut “load”)
• Register ke memory (sering disebut “store”)
12
Effective Address pada Instruksi AVR
° Tanpa Effective Address:
Register:
MOV Rd, Rr
; Rd  Rr
Immediate:
LDI
Rd, K8 ; Rd  K8, 16 <= d <= 31
° Dengan Effective Address:
Absolute/Direct:
LDS Rd, k
; Rd  M[k]
Indirect:
LD
LD
LD
Rd, X
Rd, X+
Rd, -X
; Rd  M[X]
; Rd  M[X], X  X + 1
; X  X – 1, Rd  M[X]
Index/Indirect with Displacement
LDD
STD
Rd, Y+q6
Y+q6, Rr
; Rd  M[Y + q6]
; M[Y + q6]  Rr
13
Data Transfer: Memory to Register
° Untuk melakukan transfer satu word data pada
AVR, kita harus menentukan dua hal, yakni:
• Register: tentukan register yang mana (dari R0 s/d R31)
• Alamat Memori (memory address) => lokasi di memori
° Memori:
• Dapat dilihat sebagai array satu dimensi, dan kita
mendapatkan lokasi memori dengan melakukan indexing
pada array tersebut => dikenal istilah pointer
• Dengan model pointer (indexing) maka kita dapat
mengakses lokasi tersebut berdasarkan posisi pointer
tersebut
• Misalkan menaikkan atau menurunkan pointer tersebut
• Sering disebut “indirect”.
14
Load Instruction
° AVR instruksi Load Indirect:
1
2,3
• dimana
(1) nama operasi (mis. LD)
(2) register yang akan menerima data (mis. R1)
(3) register set menyimpan pointer ke memori (X, Y, Z)
° Contoh:
• LD R1, X
(load satu word ke R1 dari lokasi memori yang ditunjuk oleh
register X)
15
Example: Load Indirect
LD R1, X
X-register
R27
178
178
16 bit pointer
R26
1200
R1
Alamat memori
Instruksi ini akan mengambil pointer pada X-register dan load isi
dari memori yang ditunjuk oleh pointer tersebut
16
Data Transfer: Register to Memory
° Kita ingin menyimpan nilai dari register ke memori:
instruksi Store
° Instruksi Store identik dengan sintaks instruksi Load
° Nama Instruksi AVR:
• st (singkatan Store), dengan argumen pertama pointer
register (X, Y, Z) dan argumen kedua register (data) yang
akan disimpan (Rr)
st
X,
R1
; (X) = Rr
Contoh di atas diasumsikan data berada pada R1, dan lokasi
memori yang akan disimpan ditunjuk oleh pointer register X
17
Example: Store Indirect
st X, R1
; (X) = R1
X-register
R27
299
299
16 bit pointer
R26
1900
R1
Alamat memori
Instruksi ini akan mengambil pointer pada X-register dan store nilai
R1 ke lokasi memori yang ditunjuk oleh pointer tersebut
18
Load Immediates
° “Immediates” adalah konstan (bilangan)
• Lihat definisi: Hamacher (bab 2.4: Addressing modes)
° Penggunaan konstan sangat diperlukan dalam
penulisan program
• Misalkan inisialisasi variabel dengan nilai konstan 0;
° Diperlukan instruksi khusus untuk konstan tersebut:
• ldi (Load Immediates) mengisi register dengan suatu
konstan:
ldi
Rd, K ; AVR: Rd = K
• Load konstan “K” (0 s/d 255) ke register Rd
• Contoh:
ldi
R16, 25 ; load R16 dengan bil. desimal 25
19
Contoh Program Load - Store
ldi
R16,1
;memasukkan angka 1 ke dalam R16
st
X,R16 ;menyimpan angka tsb ke dalam memori yg
;ditunjuk oleh X
clr
R16
ld
R16,X ;mengembalikan isi R16 dengan mengambilnya
;dari memori yg ditunjuk oleh X
;hapus isi R16
20
Load Program Memory (1/2)
° Load Program Memory (LPM) diperlukan untuk
mengakses data yang dialokasikan di awal program
(dengan directive .DB)
° Misalnya: menyimpan sebuah string untuk kemudian
diakses dalam eksekusi program
° Pengaksesan data tersebut: ‘ditunjuk’ oleh pointer,
yaitu register X, Y, Z
° Tetapi fungsi LPM hanya mengambil data yang
ditunjuk oleh register Z, langkah-langkahnya:
• program ‘menunjuk’ data tersebut dengan menggunakan
register Z
• LPM mengambil data itu dan meletakkannya di R0
• program membaca isi R0  berisi data tersebut
21
Load Program Memory (2/2)
LDI
LDI
LPM
ZH,high(DATA*2)
;Z menunjuk ke memori
ZL,low(DATA*2)
;yang berisi data
;data yg ditunjuk oleh Z disimpan di R0
;R0 sekarang berisi byte pertama dari DATA
ADIW ZL,1
;melangkah 1 word ke address berikut
LPM
;data yg ditunjuk oleh Z disimpan di R0
;R0 sekarang berisi byte kedua dari DATA
;ADIW dst sebanyak jumlah byte DATA
• Asumsi DATA berisi angka 100
• Bisakah hal di bawah ini dilakukan?:
LDI
ZH,high(100)
LDI
ZL,low(100)
22
Contoh Program LPM (1/3)
MYCODE:
rjmp
.DB "AB“
;data berisi string “AB” = 2 bytes
main
main:
ldi
ZH,high(MYCODE*2)
ldi
ZL,low(MYCODE*2)
lpm
;Z menunjuk ke memori
;yang berisi data
;memindah byte pertama data ke R0
mov R16,R0 ;simpan ke R16, maka isi R16 adalah 0x41, yaitu
;nilai ASCII dari huruf A (65)
adiw ZL,1
;increment ke byte berikutnya
lpm
;memindah byte kedua data ke R0
mov R17,R0 ;simpan ke R17, maka isi R17 adalah 0x42, yaitu
;nilai ASCII dari huruf B (66)
23
Contoh Program LPM (2/3)
MYCODE:
rjmp
.DB 10, 20
;data berisi 2 bytes, tiap bytes
;berisi angka (max: 8 bit = 255)
main
main:
ldi
ZH,high(MYCODE*2)
ldi
ZL,low(MYCODE*2)
lpm
;Z menunjuk ke memori
;yang berisi data
;memindah byte pertama data ke R0
mov R16,R0 ;simpan ke R16, maka isi R16 adalah 0x0A, yaitu
;nilai hex dari angka 10
adiw ZL,1
;increment ke byte berikutnya
lpm
;memindah byte kedua data ke R0
mov R17,R0 ;simpan ke R17, maka isi R17 adalah 0x14, yaitu
;nilai hex dari angka 20
24
Contoh Program LPM (3/3)
° Jika register X yang digunakan
ldi
XH,high(MYCODE*2)
ldi
XL,low(MYCODE*2)
mov ZH,XH
mov ZL,XL
;X menunjuk ke memori
;yang berisi data
;data harus di-copy ke Z
;supaya bisa di-load
lpm
mov R16,R0
• Jika data dalam .DB jumlah byte-nya tidak genap,
apa yang terjadi? (hint: memory addressing)
• Mengapa harus dilakukan hal di bawah ini? (hint:
word)
LDI
ZH,high(DATA*2)
LDI
ZL,low(DATA*2)
25
Referensi
° AVR Assembler User Guide
° http://www.avr-asm-tutorial.net
° AVR AT90S8515 Data Sheets
26
Download