110 likes | 238 Views
IKI10230 Pengantar Organisasi Komputer Kuliah no. A5: Bahasa Rakitan AVR Stacks & SubRoutine Calls. Sumber : 1. AVR AT90S8515 Data Sheet. 2. Materi kuliah CS152, th. 1997, UCB. 28 Maret 2003 Bobby Nazief (nazief@cs.ui.ac.id) Qonita Shahab (niet@cs.ui.ac.id)
E N D
IKI10230Pengantar Organisasi KomputerKuliah no. A5: Bahasa Rakitan AVRStacks & SubRoutine Calls Sumber:1. AVR AT90S8515 Data Sheet.2. Materi kuliah CS152, th. 1997, UCB. 28 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/
Apakah Stacks? • ‘Tumpukan balok-balok kayu’ • PUSH: ‘menambah satu balok pada tumpukan paling atas’ • POP: ‘mengambil balok yang paling atas’
Stack AVR • Stack ditempatkan di memori data (SRAM) • Top-of-stack ditunjuk oleh Stack Pointer (SP), yang berukuran 16 bit dan terletak di ruang I/O (hanya dapat diakses dengan menggunakan instruksi I/O) • Sebelum digunakan, SP harus diinisialisasi terlebih dahulu dengan cara: .equ SPH = $3E .equ SPL = $3D .equ RAMEND = $25F ldi r16,low(RAMEND) outSPL,r16 ldi r16,high(RAMEND) outSPH,r16; SP points to RAMEND
Stack AVR - Kegunaan • PUSH-POP: Jika tidak ada lagi tempat penyimpanan (register, memori) pada saat ada data baru yang perlu disimpan • Register sudah penuh • Tak ada tempat lain utk menyimpan data • Data tersebut akan digunakan lagi di bagian lain program • Jika masih ada tempat untuk menyimpan data, tidak perlu menggunakan PUSH/POP, karena akan memboroskan processor time • CALL-RET: Jika kita menggunakan subroutine • Setelah eksekusi subroutine, perlu kembali ke ‘si pemanggil’
Push/Pop, Call/Ret • Push Rx • M[SP] Rx • SP SP – 1 • Rcall Addr • Push PChi • Push PClo • PC Addr • Pop Rx • SP SP + 1 • Rx M[SP] • Ret • Pop PClo • Pop PChi • Contoh Segmen Program: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 … push r17 ; save r17 push XL ; save X push XH rcall MySubRoutine pop XH pop XL ; restore X pop r17 ; restore r16 … LIFO
PUSH/POP • Misalnya ada suatu data hasil kalkulasi berulang, di mana sudah tidak ada register yang dapat menyimpannya • Cara kerja: • Data temporary yang berada dalam register di-PUSH ke dalam stack • Register ybs dapat digunakan utk menyimpan data lain • Jika data temporary diperlukan, dapat dilakukan POP untuk mengembalikan data ke register • Contoh: F = ((A*B) + C) * D • Hasil (A*B) ada di R16, nilai D ada di R17 • Isi R17 di-PUSH ke stack • Load isi R17 dengan C • Jumlahkan • Kembalikan (POP) nilai D ke R17 • Kalikan
2 5 ... ... ... Contoh Program PUSH/POP ldi TEMP,5 ;isi TEMP = 5 push TEMP ;isi stack paling atas = 5 ldi TEMP,2 ;isi TEMP = 2 push TEMP ;isi stack paling atas = 2 ldi TEMP,1 ;isi TEMP = 1 pop TEMP ;kembalikan nilai 2 ke TEMP pop TEMP ;kembalikan nilai 5 ke TEMP
CALL/RET • Misalnya ada suatu loop yang perlu dikerjakan, lalu setelah loop diperlukan suatu data hasil dari pekerjaan dalam loop • Cara kerja: • Pada saat subroutine dipanggil (rcall), maka nilai program counter disimpan di dalam stack • Subroutine dikerjakan • Setelah selesai subroutine, untuk kembali ke lokasi tadi dilakuan pop nilai program counter dari stack • Bagaimana jika stack pointer tidak diinisialisasi terlebih dahulu? • Pointer menunjuk ke mana? • Bagaimana jika ada rcall dan ret?
Contoh Program Call/Ret jobs: ldi TEMP,5 ;angka 5 untuk disimpan ldi COUNTER,5 ;jumlah lokasi ldi HASIL,0xA0 ;lokasi awal rcall loop ;melakukan pekerjaan ldi XL,0xB0 st X,HASIL ;menyimpan lokasi terakhir rjmp finish ;kemudian selesai loop: ;memasukkan angka 5 ke mov ZL,HASIL ;lokasi 0xA0 s.d. 0xA5 st Z,TEMP dec COUNTER inc HASIL cpi COUNTER,0 brne loop ret finish: rjmp finish ;selesai
Referensi • AVR Assembler User Guide • http://www.avr-asm-tutorial.net