1 IKI10230 Pengantar Organisasi Komputer Kuliah no. A5: Bahasa Rakitan AVR Stacks & SubRoutine Calls 28 Maret 2003 Bobby Nazief Qonita Shahab bahan kuliah: Sumber: 1. AVR AT90S8515 Data Sheet. 2. Materi kuliah CS152, th. 1997, UCB.
2 Instruksi: Stacks & Subroutine Calls
3 Apakah Stacks? °‘Tumpukan balok-balok kayu’ °PUSH: ‘menambah satu balok pada tumpukan paling atas’ °POP: ‘mengambil balok yang paling atas’
4 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) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16; SP points to RAMEND
5 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’
6 Push/Pop, Call/Ret °Push R x M[SP] R x SP SP – 1 °Rcall Addr Push PC hi Push PC lo PC Addr °Pop R x SP SP + 1 R x M[SP] °Ret Pop PC lo Pop PC hi °Contoh Segmen Program: ldir16,low(RAMEND) outSPL,r16 ldir16,high(RAMEND) outSPH,r16 … pushr17; save r17 pushXL; save X pushXH rcallMySubRoutine popXH popXL; restore X popr17; restore r16 … LIFO
7 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
8 Contoh Program PUSH/POP ldiTEMP,5;isi TEMP = 5 pushTEMP;isi stack paling atas = 5 ldiTEMP,2;isi TEMP = 2 pushTEMP;isi stack paling atas = 2 ldiTEMP,1;isi TEMP = 1 popTEMP;kembalikan nilai 2 ke TEMP popTEMP;kembalikan nilai 5 ke TEMP
9 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?
10 Contoh Program Call/Ret jobs: ldiTEMP,5;angka 5 untuk disimpan ldiCOUNTER,5;jumlah lokasi ldiHASIL,0xA0;lokasi awal rcallloop;melakukan pekerjaan ldiXL,0xB0 stX,HASIL;menyimpan lokasi terakhir rjmpfinish;kemudian selesai loop:;memasukkan angka 5 ke movZL,HASIL;lokasi 0xA0 s.d. 0xA5 st Z,TEMP decCOUNTER incHASIL cpi COUNTER,0 brneloop ret finish: rjmpfinish;selesai
11 Referensi °AVR Assembler User Guide °