260 likes | 397 Views
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 (nazief@cs.ui.ac.id) Qonita Shahab (niet@cs.ui.ac.id)
E N D
IKI10230Pengantar Organisasi KomputerKuliah no. A2: Bahasa Rakitan AVRData Transfer Instructions Sumber:1. AVR AT90S8515 Data Sheet.2. Materi kuliah CS152, th. 1997, UCB. 7 Maret 2003 Bobby Nazief (nazief@cs.ui.ac.id)Qonita Shahab (niet@cs.ui.ac.id) bahan kuliah: http://www.cs.ui.ac.id/~iki10230/
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
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?
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)
PC SP AVR Registers (2/3)
AVR Registers (3/3) • “pointer registers” • addressing 16 bit untuk menunjuk ke lokasi di SRAM (X,Y,Z) atau di program memory (Z)
16 4 OP d I II III IV 16 16 10 10 OP OP n n V VI 31 20 16 11 OP Rr/Rd 16 9 5 4 5 OP k 16 LSBs OP P r d q 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
Contoh Program AVR Assembly: ;asumsi register Z menunjuk ke var. i;register Y, menunjuk ke var. j ---- ld R1, Z ; R1 berisi var. i ld R2, Y ; R2 berisi var. Y cpi i, 0 ; compare i dengan 0 breq TEST ; if Z flag set then branch TEST add R1,R2 ; i = i + j jmp EXIT ; unconditional jump; skip TEST: ldi R1, 50 ; i = 50 EXIT: …………
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”)
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 Rd, X ; Rd M[X] LD Rd, X+ ; Rd M[X], X X + 1 LD Rd, -X ; X X – 1, Rd M[X] Index/Indirect with Displacement LDD Rd, Y+q6 ; Rd M[Y + q6] STD Y+q6, Rr ; M[Y + q6] Rr
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”.
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)
178 Example: Load Indirect LD R1, X 16 bit pointer 178 X-register R26 R27 1200 R1 Alamat memori Instruksi ini akan mengambil pointer pada X-register dan load isi dari memori yang ditunjuk oleh pointer tersebut
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) = RrContoh di atas diasumsikan data berada pada R1, dan lokasi memori yang akan disimpan ditunjuk oleh pointer register X
299 Example: Store Indirect st X, R1 ; (X) = R1 16 bit pointer 299 X-register R26 R27 1900 R1 Alamat memori Instruksi ini akan mengambil pointer pada X-register dan store nilai R1 ke lokasi memori yang ditunjuk oleh pointer tersebut
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
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;hapus isi R16 ld R16,X;mengembalikan isi R16 dengan mengambilnya ;dari memori yg ditunjuk oleh X
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
;Z menunjuk ke memori ;yang berisi data Load Program Memory (2/2) LDI ZH,high(DATA*2) LDI ZL,low(DATA*2) LPM ;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)
;Z menunjuk ke memori ;yang berisi data Contoh Program LPM (1/3) MYCODE: .DB "AB“ ;data berisi string “AB” = 2 bytes rjmp main main: ldi ZH,high(MYCODE*2) ldiZL,low(MYCODE*2) lpm ;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)
;Z menunjuk ke memori ;yang berisi data Contoh Program LPM (2/3) MYCODE: .DB 10, 20 ;data berisi 2 bytes, tiap bytes ;berisi angka (max: 8 bit = 255) rjmp main main: ldi ZH,high(MYCODE*2) ldiZL,low(MYCODE*2) lpm ;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
;X menunjuk ke memori ;yang berisi data ;data harus di-copy ke Z ;supaya bisa di-load Contoh Program LPM (3/3) • Jika register X yang digunakan ldi XH,high(MYCODE*2) ldiXL,low(MYCODE*2) mov ZH,XH mov ZL,XL 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)
Referensi • AVR Assembler User Guide • http://www.avr-asm-tutorial.net • AVR AT90S8515 Data Sheets