Bahasa Assembly Struktur Program Deklarasi data v Ditempatkan
Bahasa Assembly
Struktur Program Ø Deklarasi data v Ditempatkan pada bagian program setelah directive. data v Mendeklarasikan nama variabel yang digunakan dalam program, alokasi memori RAM Ø Kode v Ditempatkan pada bagian program setelah directive. code v Mengandung instruksi/kode program v Pengeksekusian dimulai dari label “main: ” v Program diakhiri dengan “exit system call” Ø Komentar v Diawali oleh tanda # 2
Deklarasi Data Ø Format v Nama: tipe_storage nilai v Membuat variabel dengan nama “nama” yang bernilai “nilai” dan bertipe “tipe_storage” Ø Label v Label senantiasa diakhiri oleh tanda “: ” v Contoh: Var 1: . word 3 #membuat variabel tunggal dengan #nilai awal 3 Array 1: . byte ‘a’, ‘b’ #membuat array karakter 2 #elemen dengan nilai awal ‘a’ dan ‘b’ 3
Aturan Umum Register MIPS Ø Setiap register diberi nama agar mudah diingat Ø Terdapat register yang memiliki fungsi khusus dan tidak bisa digunakan untuk menyimpan nilai 4
Instruksi Load/Store Ø Instruksi yang mengakses RAM Ø Load v Lw tujuan_register, sumber_RAM v Lb tujuan_register, sumber_RAM Ø Store word v Sw sumber_register, tujuan_RAM v Sb sumber_register, tujuan_RAM Ø Load immediate v Li tujuan_register, nilai 5
Bahasa Assembly MIPS Ø Arithmetic v Add: add $s 1, $s 2, $s 3 # $s 1=$s 2+$s 3 v Substract: sub $s 1, $s 2, $s 3 # $s 1=$s 2 -$s 3 Ø Data Transfer v Load word: lw $s 1, 100($s 2) v Store word: sw $s 1, 100($s 2) # $s 1=Memory[$s 2+100] # Memory[$s 2+100]=$s 1 Ø Conditional branch v Branch on equal: beq $s 1, $s 2, L # if ($s 1=$s 2) go to L v Branch on not equal: bne $s 1, $s 2, L # if ($s 1!=$s 2) go to L v Set on less than: slt $s 1, $s 2, $s 3 #if ($s 2<$s 3) $s 1=1, else $s 1=0 Ø Unconditional jump v Jump: j 2500 # go to 10000 v Jump register: jr $ra # go to $ra v Jump and link: jal 2500 #$ra=PC+4; go to 10000 ; for procedure call 6
Instruksi Load/Store Ø Contoh: . data var 1: . word 23. text __start: lw $t 0, var 1 Li $t 1, 5 sw $t 1, var 1 done 7
Pengalamatan Tidak Langsung Ø Hanya digunakan pada instruksi load dan store Ø Load alamat: v la $t 0, var 1 #menyalin alamat RAM var 1 ke #dalam register $t 0 Ø Pengalamatan tidak langsung: v lw $t 2, ($t 0) #mengambil data pada RAM dengan alamat yang ditunjukkan $t 0 ke dalam $t 2 v sw $t 2, ($t 0) #menyimpan data dari reg $t 2 ke dalam RAM dengan alamat yang ditunjukkan $t 0 8
Pengalamatan Berbasis Atau Berindex Ø lw $t 2, 4($t 0) v Mengambil word pada RAM alamat ($t 0+4) ke dalam register $t 2 v "4" adalah jarak dari register $t 0 Ø sw $t 2, -12($t 0) v Menyimpan word dari register $t 2 ke dalam RAM pada alamat ($t 0 - 12) v Offset negatif dapat digunakan Ø Pengalamatan berbasis khusus digunakan pada: v Arrays: mengakses elemen sebagai offset dari alamat basis v Stacks: mudah dalam mengakses elemen dari stack pointer atau frame pointer 9
Contoh Pengalamatan Tidak Langsung dan Berindex. data array 1: . space 12. text __start: la $t 0, array 1 li $t 1, 5 sw $t 1, ($t 0) li $t 1, 13 sw $t 1, 4($t 0) li $t 1, -7 done 10
Instruksi Aritmetika Ø Sebagian besar menggunakan 3 buah operand Ø Semua operand register Ø Ukuran operand adalah 1 word (4 bytes) Ø Contoh: v add $t 0, $t 1, $t 2 # $t 0 = $t 1 + $t 2; v sub $t 2, $t 3, $t 4 # $t 2 = $t 3 – $t 4 v addi $t 2, $t 3, 5 # $t 2 = $t 3 + 5 v addu $t 1, $t 6, $t 7 # $t 1 = $t 6 + $t 7 v subu $t 1, $t 6, $t 7 # $t 1 = $t 6 + $t 7 11
Struktur Kendali Ø Branch (Pencabangan) v b target #pencabangan tanpa kondisi v beq $t 0, $t 1, target v blt $t 0, $t 1, target v ble $t 0, $t 1, target v bgt $t 0, $t 1, target v bge $t 0, $t 1, target v bne $t 0, $t 1, target Ø Jump (Lompatan) v J target v Jr $t 3 # lompat ke label “target” # lompat ke alamat isi $t 3 12
Pemanggilan Subrutin Ø Instruksi JAL: Jump and link v Jal sub_label #sub_label adalah nama subrutin v Menyalin isi program counter ke dalam register $ra v Lompat ke program dengan label “sub_label” Ø Instruksi JR: jump register v Jr $ra v Lompat ke alamat kembali yang terdapat dalam register $ra 13
Bahasa Mesin MIPS Ø Bahasa mesin adalah bahasa yang bisa dimengerti oleh mesin Ø Setiap bahasa assembly diterjemahkan ke dalam bahasa mesin yang dapat dimengerti oleh MIPS 14
Kompilasi Program C ke Dalam MIPS Ø Contoh: berikut bagian program C yang mengandung lima variabel a, b, c, d, dan e: a = b + c; d = a – e; Tunjukkan kode MIPS-nya ! Ø Jawab: add a, b, c sub d, a, e 15
Kompilasi Program C ke Dalam MIPS Ø Contoh: Program C kompleks mengandung 5 variabel f, g, h, i, dan j: f = (g+h) – (i+j); Apakah yang dihasilkan oleh compiler C ? Ø Jawab: add t 0, g, h add t 1, i, j sub f, t 0, t 1 16
Kompilasi Program C Menggunakan Register Ø Contoh: f = (g+h) – (i+j) Ø Jawab: add $t 0, $s 1, $s 2 #register $t 0 menyimpan nilai g+h add $t 1, $s 3, $s 4 #register $t 1 menyimpan nilai i+j sub $s 0, $t 1 #f gets $t 0 -$t 1 17
Kompilasi Assignment Dimana Operand Dalam Memory Ø Contoh: Misal A adalah array 100 word dan compiler memetakan variabel g dan h dengan register $s 1 dan $s 2. Misal alamat awal, alamat basis, array ada dalam $s 3. Terjemahkan program C berikut: g = h + A[8] Ø Jawaban: lw $t 0, 32($s 3) # Temporary reg $t 0 gets A[8] add $s 1, $s 2, $t 0 # g = h + A[8] 18
Kompilasi Menggunakan Load dan Store Ø Misal variabel h diasosiasikan dengan register $s 2 dan alamat dasar array A ada dalam $s 3. Bagaimanakah kode assembly MIPS untuk program C berikut ? A[12] = h + A[8] Ø Jawab: lw $t 0, 32($s 3) add $t 0, $s 2, $t 0 sw $t 0, 48($s 3) 19
Kompilasi Menggunakan Variable Array Index Ø Berikut contoh array dengan index variabel: g = h + A[i] Misal A adalah array 100 elemen dengan basisnya ada pada register $s 3, compiler mengasosiasikan variabel g, h, dan i dengan register $s 1, $s 2, dan $s 4. Bagaimanakah bahasa MIPS ? Ø Jawaban: add $t 1, $s 4 #temp reg $t 1=2*i add $t 1, $t 1 #temp reg $t 1=4*i add $t 1, $s 3 #$t 1=address of A[i] (4*i+$s 3) lw $t 0, 0 ($t 1) #temp reg $t 0=A[i] add $s 1, $s 2, $t 0 #g=h+A[i] 20
Menterjemahkan Assembly MIPS ke Dalam Instruksi Mesin Ø Contoh: Terdapat instruksi MIPS: add $t 0, $s 1, $s 2 Ubahlah ke dalam kombinasi bilangan desimal kemudian bilangan binernya Ø Jawab: The decimal representation : 0 -17 -18 -8 -0 -32 In biner: 000000 -10001 -10010 -01000 -00000 -100000 machine language 000000110010010000100000 21
Menterjemahkan C ke Dalam Assembly dan Bahasa Mesin MIPS Ø Contoh: Terjemahkan bahasa MIPS ke dalam bahasa mesin. Asumsi $t 1 menyimpan basis array A dan $s 2 sebagai h, program C: A[300] = h + A[300] Ø Jawab: Dikompile dalam MIPS lw $t 0, 1200($t 1) #temp reg $t 0 gets A[300] add $t 0, $s 2, $t 0 #temp reg $t 0 gets h+A[300] sw $t 0, 1200($t 1): Bahasa mesinnya: 22
Instruksi untuk membuat keputusan Ø Compile pernyataan IF ke dalam branch kondisional. Berikut program C: if (i==j) go to L 1; f = g + h; L 1 f = f – i; Asumsi 5 buah variabel f-j sama dengan registers $s 0 - $s 4, bagaimanakah hasil compile dalam kode MIPS? Ø Jawab: beq $s 3, $s 4, L 1 # go to L 1 if i equals j add $s 0, $s 1, $s 2 # f = g + h L 1: sub $s 0, $s 3 # f = f – i 23
Kompilasi pencabangan kondisional ifthen-else Ø Menggunakan variabel dan register yang sama seperti contoh sebelumnya, compile statemen berikut: if (i == j) f = g + h ; else f = g – h; Ø Jawab: bne $s 3, $s 4, else # go to Else if i ≠ j add $s 0, $s 1, $s 2 # f = g + h (skipped if i ≠ j) j exit # go to Exit else: sub $s 0, $s 1, $s 2 #f=g-h Exit: 24
Kompilasi Liupan dengan variable Array Index Ø Berikut ini instruksi loop dalam C: Loop: g = g + A[i]; i = i + j; if (i != h) goto Loop; Asumsi A adalah array 100 element dan kompiler mangasosiasikan variabel g, h, i, dan j dengan register $s 1, $s 2, $s 3 dan $s 4 berturut-turut. Misal basis array A terdapat dalam $s 5. Bagaimanakah kode MIPS? 25
Kompilasi Liupan dengan variable Array Index Ø Jawab: Loop: add $t 1, $s 3 add $t 1, $t 1 add $t 1, $s 5 lw $t 0, 0($t 1) A[i] add $s 1, $t 0 add $s 3, $s 4 bne $s 3, $s 2, Loop # # Temp reg $t 1 = 2*i Temp reg $t 1 = 4*i $t 1 = address of A[i] Temporary reg $t 0 = # g = g + A[i] #i=i+j # go to Loop if i ≠ h 26
Kompilasi Liupan while Ø Pemeriksaan kondisi yang terdapat setelah instruksi While Ø Jika terpenuhi maka Isi Liupan dijalankan Ø Jika tidak terpenuhi keluar dari liupan 27
Kompilasi Liupan while Ø Berikut loop dalam C: while (save[i] ==k) i = i + j; Asumsi i, j, dan k berkorespondensi dengan register $s 3, $s 4, dan $s 5 dan basis array disimpan dalam $s 6. Bagaimanakah bahasa MIPS-nya? 28
Kompilasi Liupan while Ø Jawab: Ambil nilai save[i] Loop: add $t 1, $s 3 add $t 1, $t 1 add $t 1, $s 6 save[i] lw $t 0, 0($t 1) bne $t 0, $s 5, Exit add $s 3, $s 4 j Loop Exit: ke dalam register temp # Temp reg $t 1 = 2 * i # Temp reg $t 1 = 4 * i # $t 1 = address of # temp reg $t 0 = save[i] # go to Exit if save[i] ≠ k # go to Loop 29
Kompilasi pengecekan Less Than Ø Apakah kode untuk memeriksa jika variabel a (berkorespondensi dengan register $s 0) lebih kecil dari variabel b (register $s 1) dan lompat ke label Less jika kondisi dipenuhi? Ø Jawab: slt $t 0, $s 1 # $t 0 gets 1 if $s 0<$s 1(a<b) bne $t 0, $zero, Less # go to Less if $t 0 ≠ 0 # that is if a<b 30
Case/Switch Statement Ø Kode C berikut memilih diantara 4 alternatif tergantung nilai k 0, 1, 2, atau 3 switch (k) { case 0: f = i + j; break; case 1: f = g + h; break; case 2: f = g – h; break; case 3: f = i – h; break; } Asumsi 6 variabel f – k berkorespondensi dengan 6 register $s 0 - $s 5 dan register $t 2 bernilai 4. 31
Case/Switch Statement Ø Jawab: kita gunakan switch variabel k sebagai index alamat jump address table, dan loncat melalui nilai yang diambil. slt $t 3, $s 5, $zero bne $t 3, $zero, Exit slt $t 3, $s 5, $t 2 beq $t 3, $zero, Exit # # test if k<0 if k < 0, go to exit test if k<4 if k ≥ 4, go to exit 32
Case/Switch Statement add $t 1, $s 5# add $t 1, $t 1 # add $t 1, $t 4 # lw $t 0, 0 ($t 1) # jr $t 0 L 0: add $s 0, $s 3, $s 4 j Exit L 1: add $s 0, $s 1, $s 2 j Exit L 2: sub $s 0, $s 1, $s 2 j Exit L 3: sub $s 0, $s 3, $s 4 Exit temp reg $t 1 = 2 * i temp reg $t 1 = 4 * i $t 1 = address of Jumptable[k] temp reg $t 0 = Jump. Table[k] # jump based on register $t 0 # k = 0 so f gets i + j # end # k = 1 so f gets g + h # end # k = 2 so f gets g - h # end # k = 3 so f gets i - j # end. e 33
Referensi Ø Hennessy, John L. dan Patterson, David A. 1998, “Computer Organization and Design: The Hardware/Software Interface”. 2 nd edition. Morgan Kaufmann publisher Inc. San Fransisco. USA Ø http: //chortle. ccsu. edu/Assembly. Tutorial/ Chapter-01/ 34
- Slides: 34