1
IKI10230Pengantar Organisasi Komputer
Kuliah no. A8: Bahasa Rakitan AVRLatihan
23 Mei 2003
Bobby Nazief ([email protected])Qonita Shahab ([email protected])
bahan kuliah: http://www.cs.ui.ac.id/~iki10230/
Sumber:1. AVR AT90S8515 Data Sheet.2. Materi kuliah COMP1300/2300 UQ
2
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
3
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
4
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
5
Data Transfer, Arithmetics, Branch
6
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
7
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?
8
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
9
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
10
Stacks, Subroutines
11
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 stackswap:
push r5 ;only r5 used, no othersmov r5,r3mov r3,r4mov r4,r5pop r5ret ;it’s a procedure/subroutine, then return
12
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 stackswap:
push r3 ; stores r3 value on stackmov r3,r4 ; puts r4 value into r3pop r4 ; puts original r3 val into r4ret ;it’s a procedure/subroutine, then return
13
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 stackswap:
eor r3,r4eor r4,r3eor r3,r4ret ;it’s a procedure/subroutine, then return
14
I/O, Interrupts
15
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 dataout PORTC,temp ;output the datareti ;return from int
16
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 valuein temp,PINB ;read port B ... ; ...do some arithmetics operationout PORTC,temp ;output the datapop temp ;retrieve sreg value out SREG,temp ;restore the sreg reti ;return from interrupt
17
Miscellaneous
18
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
19
Delay° Berapakah lama delay dalam potongan program di
bawah ini?
DELAY:ldi R18, 255
LOOP3:ldi R19, 255
LOOP4:dec R19brne LOOP4
dec R18brne LOOP3
256 * 256 = 65536.1 instruksi = 0.25 microsecond (utk 1 MHz)65536/4 = 16384 microsecond = 16.384 milisecond
20
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.
21
Selamat belajar