210 likes | 413 Views
IKI10230 Pengantar Organisasi Komputer Kuliah no. A8: Bahasa Rakitan AVR Latihan. Sumber : 1. AVR AT90S8515 Data Sheet. 2. Materi kuliah COMP1300/2300 UQ. 23 Mei 2003 Bobby Nazief (nazief@cs.ui.ac.id) Qonita Shahab (niet@cs.ui.ac.id) bahan kuliah: http://www.cs.ui.ac.id/~iki10230/.
E N D
IKI10230Pengantar Organisasi KomputerKuliah no. A8: Bahasa Rakitan AVRLatihan Sumber:1. AVR AT90S8515 Data Sheet.2. Materi kuliah COMP1300/2300 UQ 23 Mei 2003 Bobby Nazief (nazief@cs.ui.ac.id)Qonita Shahab (niet@cs.ui.ac.id) bahan kuliah: http://www.cs.ui.ac.id/~iki10230/
Warming Up (1/3) • Tuliskan instruksi AVR yang melakukan hal-hal di bawah ini: • increment register 5 • inc r5 • load nilai 24 ke dalam register 17 • ldi r17, 24 • atau • ldi r17, $18 (notasi hexadecimal) • logical AND register 23 dan register 5, kemudian menyimpan hasilnya di register 5 • and r5, r23
Warming Up (2/3) • set bit-bit dalam register 18 menjadi 1 semua • ldi r18, 255 • atau • ser r18 • set bit-bit dalam register 18 menjadi 0 semua • ldi r18,0 • atau • clr r18 • negasikan register 10 • neg r10
Warming Up (3/3) • invert isi register 10 • com r10 • pindahkan (copy) isi register 3 ke register 4 • mov r4, r3 • set direction utk IO pada port B menjadi output • ser r16 • out DDRB, r16 • baca isi IO port C untuk disimpan di register 20 • in r20, PINC • tulis isi register 21 ke IO port B • out PORTB, r21
Soal 1 • Jika isi register 17 lebih besar daripada 75 (decimal), tukarlah isi register 3 & register 4 (jika sebaliknya, do nothing) .def temp r16 ldi temp, 75 cp temp, r17 brlt swap rjmp continue ; otherwise, do nothing swap: mov temp, r3 mov r3, r4 mov r4, temp continue: … ; program would continue here
Soal 1: contoh jawaban lain .def temp r16 cpi r17,75 brlt continue ; use brlo for unsigned breq continue ; if we get here, r17 > 75 ; code to swap r3 and r4 follows mov temp, r3 mov r3, r4 mov r4, temp continue: … ;program would continue here What about brge?
Soal 2 • Tentukan apakah nilai yang disimpan dalam memory dengan alamat 100 adalah nilai ASCII untuk huruf A (65) .def temp r16 ldi XH, high(100) ; could say clr XH ldi XL, low(100) ; could say ldi XL, 100 ld temp, X ; read memory cpi temp, 65 ; compare with 65 breq matchesA ; equal – go somewhere matchesA: ;nyatakan bahwa memang benar isinya huruf A
Soal 3 • Clear (set menjadi 0) isi memory dengan alamat 128 s.d. 191. .def temp r16 ldi XH, high(128) ; could say clr XH ldi XL, low(128) ; could say ldi XL, 128 clr temp ; store 0 in temp loop: st X+, temp ; write temp(0) out ; now need to check if loop is finished cpi XL, 192 brne loop … ; continue here when finished
Soal 1 (a) • Buatlah sebuah procedure (subroutine) yg melakukan pertukaran isi register r3 dan r4. Tidak boleh ada isi register apapun yg diubah-ubah, kecuali r5. Tulis kodenya dengan menunjukkan pemanggilan subroutine-nya. main: rcall swap ;use push & pop of stack swap: push r5 ;only r5 used, no others mov r5,r3 mov r3,r4 mov r4,r5 pop r5 ret ;it’s a procedure/subroutine, then return
Soal 1 (b) • Bagaimana jika benar-benar tidak ada register lain yang boleh digunakan (r5 juga tidak boleh)? main: rcall swap ;use push & pop of stack swap: push r3 ; stores r3 value on stack mov r3,r4 ; puts r4 value into r3 pop r4 ; puts original r3 val into r4 ret ;it’s a procedure/subroutine, then return
Soal 1 (b): contoh jawaban lain • Untuk menukarkan isi dari dua register, kita dapat menggunakan 3 kali instruksi eor (exclusive OR). main: rcall swap ;use push & pop of stack swap: eor r3,r4 eor r4,r3 eor r3,r4 ret ;it’s a procedure/subroutine, then return
Soal 1 (a) • Buatlah sebuah ISR (interrupt service routine) yang membaca isi PORTB dan mengeluarkan nilai PORTB itu ke PORTC. Interrupt ini bekerja pada INT1. .def temp = r16 EXT_INT1: in temp,PINB ;read the data out PORTC,temp ;output the data reti ;return from int
Soal 1 (b) • Bagaimana jika dalam ISR ingin juga dilakukan sebuah operasi arithmetic yang kemungkinan menghasilkan Carry atau Zero flag? Hint: di dalam status register juga ada interrupt flag! .def temp = r16 EXT_INT1: in temp,SREG ;get the status reg. push temp ;save the sreg value in temp,PINB ;read port B ... ; ...do some arithmetics operation out PORTC,temp ;output the data pop temp ;retrieve sreg value out SREG,temp ;restore the sreg reti ;return from interrupt
Macro • Buatlah sebuah macro yg menukar isi r3 dan r4. • .macro swap34 • push r3 ; Save old r3 • mov r3, r4 ; Copy old r4 to r3 • pop r4 ; Old r3 to r4 • .endmacro • Bagaimana pemanggilannya di dalam program? ldi r16, $33 mov r3, r16 ; Give distinct value ldi r16, $44 mov r4, r16 ; Similarly r4 swap34 ; Call the macro
Delay • Berapakah lama delay dalam potongan program di bawah ini? DELAY: ldi R18, 255 LOOP3: ldi R19, 255 LOOP4: dec R19 brne LOOP4 dec R18 brne LOOP3 256 * 256 = 65536. 1 instruksi = 0.25 microsecond (utk 1 MHz) 65536/4 = 16384 microsecond = 16.384 milisecond
Persiapan UAS: Tugas 5 • Buatlah sebuah procedure (big subroutine) yang menghitung powers of 2 (pangkat 2) secara rekursif. Prosedur ini dapat menerima argumen di r0 (nilai 0 s.d. 7) dan memberikan jawaban (2*r0) di register r1. • Buat versi loop dari pertanyaan di atas. • Buatlah sebuah procedure yang mengkalkulasi n’th Fibonacci fib(n) secara rekursif, dimana fib(n) = fib(n-1) + fib(n-2) dan fib(1) = fib(2) = 1 (urutannya: 1,1,2,3,5,8,13,21,34,…). Argumen n diakses di register r0 dan hasilnya disimpan di register r1. Asumsi: hasil kalkulasi maksimal tidak melebihi 255.