IKI10230 Pengantar Organisasi Komputer Kuliah no 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) 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?
Arsitektur AVR AT90S8515
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)
AVR Registers (2/3) PC SP
AVR Registers (3/3) “pointer registers” addressing 16 bit untuk menunjuk ke lokasi di SRAM (X,Y,Z) atau di program memory (Z)
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 OP d 4 16 r 9 Rr/Rd 20 31 16 LSBs P 5 n 10 q k 11 I II III IV V VI
Set Instruksi AVR: Rangkuman
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: …………
Instruksi: Data Transfer
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: Contoh: 1 2,3 dimana 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)
Example: Load Indirect LD R1, X 16 bit pointer 178 X-register R27 R26 178 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) = Rr Contoh di atas diasumsikan data berada pada R1, dan lokasi memori yang akan disimpan ditunjuk oleh pointer register X
Example: Store Indirect st X, R1 ; (X) = R1 16 bit pointer 299 X-register R27 R26 299 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
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 ;Z menunjuk ke memori ;yang berisi data Asumsi DATA berisi angka 100 Bisakah hal di bawah ini dilakukan?: LDI ZH,high(100) LDI ZL,low(100)
Contoh Program LPM (1/3) MYCODE: .DB "AB“ ;data berisi string “AB” = 2 bytes rjmp main main: ldi ZH,high(MYCODE*2) ldi ZL,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) ldi ZL,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 ;Z menunjuk ke memori ;yang berisi data
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 lpm mov R16,R0 ;X menunjuk ke memori ;yang berisi data ;data harus di-copy ke Z ;supaya bisa di-load 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