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