Kumpulan Instruksi dan Assembly MIPS (Pertemuan ke-25)
Diedit ulang oleh: Endro Ariyanto
Prodi S1 Teknik Informatika Fakultas Informatika
Universitas Telkom
April 2016
Kumpulan Instruksi MIPS
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #1
Jenis Instruksi MIPS
• Instruksi pada MIPS dibagi dalam tiga bentuk format yakni: format R, format I, format J – R format terdiri dari tiga register dan function field – I format terdiri atas dua register dan 16 bit long immediate value – J format terdiri atas enam bit opcode yang diikuti oleh 26 bits immediate value Organisasi dan Arsitektur Komputer – CSG2G3/2016 #2
Daftar Opcode
0: tipe R (add, sub, and, or, slt) 2: jump (j) 4: branch (beq) 5: branch (bne) 8: penjumlahan dengan immediate (addi) 17: load upper dengan immediate (lui) 35: load (lw) 43: store (sw) Organisasi dan Arsitektur Komputer – CSG2G3/2016 #3
Instruksi dalam MIPS Add – penambahan add $s1,$s2,$s3 #jumlahkan isi reg s2 dengan isi reg s3 dan simpan hasilnya ke reg s1
Addi – add immediate addi $sp,$sp, 4 #Jumlahkan isi reg sp dengan 4 dan hasilnya simpan di dalam reg sp
ADDIU -- Add immediate unsigned ADDU -- Add unsigned AND -- Bitwise and ANDI -- Bitwise and immediate BEQ -- Branch on equal BGEZ -- Branch on greater than or equal to zero Organisasi dan Arsitektur Komputer – CSG2G3/2016 #4
Instruksi dalam MIPS BGEZAL -- Branch on greater than or equal to zero and link BGTZ -- Branch on greater than zero BLEZ -- Branch on less than or equal to zero BLTZ -- Branch on less than zero BLTZAL -- Branch on less than zero and link BNE -- Branch on not equal bne $t0,$zero, Less #Lompat ke alamat Less jika isi reg t0 tidak sama dengan nol
DIV -- Divide DIVU -- Divide unsigned Organisasi dan Arsitektur Komputer – CSG2G3/2016 #5
Instruksi dalam MIPS J -- Jump JAL -- Jump and link JR -- Jump register LB -- Load byte LI – Load immediate li $v0, 5 #isi reg v0 dengan sign number (5)
LUI -- Load upper immediate lui $t0, 255 #isi reg t0 bagian upper (bit 16-31) dengan 255 Isi memori sebelum instruksi dieksekusi:
Isi memori sesudah instruksi dieksekusi:
LW -- Load word lw $s1,100($s2) #isi reg s1 dengan data dari memori pada alamat hasil jumlahan dari isi reg s2 dengan 100 (offset)
MFHI -- Move from HI MFLO -- Move from LO Organisasi dan Arsitektur Komputer – CSG2G3/2016 #6
Instruksi dalam MIPS MULT -- Multiply MULTU -- Multiply unsigned NOOP -- no operation OR -- Bitwise or ORI -- Bitwise or immediate SB -- Store byte SLL -- Shift left logical SLLV -- Shift left logical variable SLT -- Set on less than (signed) slt $t0,$s0,$s1 #reg t0 diisi dengan 1 jika isi reg s0 lebih kecil daripada reg s1 biasanya diikuti dengan perintah: bne $t0,$zero,Less
SLTI -- Set on less than immediate (signed) slti $t0,$s0, 10 #reg t0 diisi dengan 1 jika isi reg s0 lebih kecil dari 10 biasanya diikuti dengan perintah: bne $t0,$zero,Less
SLTIU -- Set on less than immediate unsigned SLTU -- Set on less than unsigned Organisasi dan Arsitektur Komputer – CSG2G3/2016 #7
Instruksi dalam MIPS SRA -- Shift right arithmetic SRL -- Shift right logical SRLV -- Shift right logical variable SUB – Subtract sub $s1,$s2,$s3 #kurangkan isi reg s2 dengan isi reg s3 dan simpan hasilnya ke reg s1
SUBU -- Subtract unsigned SW -- Store word sw $s1,100($s2) #simpan isi reg s1 ke memori pada alamat hasil jumlahan dari isi reg s2 dengan 100 (offset)
SYSCALL -- System call XOR -- Bitwise exclusive or XORI -- Bitwise exclusive or immediate Organisasi dan Arsitektur Komputer – CSG2G3/2016 #8
Studi Kasus – Instruksi Add
• Instruksi penjumlahan isi dua register • Hasil operasi disimpan dalam register tujuan
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #9
Studi Kasus – Instruksi BEQ
• Instruksi percabangan bersyarat • Terjadi percabangan jika syarat dipenuhi • Percabangan terjadi dengan mengisikan nilai instruksi target pada PC
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #10
Studi Kasus – Instruksi OR
• Melakukan operasi OR pada dua buah input bit per bit • Hasil operasi disimpan dalam suatu register • Contoh operasi OR
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #11
Bahasa Assembly MIPS
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #12
Struktur Program • Deklarasi data – Ditempatkan pada bagian program setelah directive .data – Mendeklarasikan nama variabel yang digunakan dalam program, alokasi memori RAM
• Kode – – – –
Ditempatkan pada bagian program setelah directive .code Mengandung instruksi/kode program Pengeksekusian dimulai dari label “main:” Program diakhiri dengan “exit system call”
• Komentar – Diawali oleh tanda #
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #13
Deklarasi Data • Format – Nama: tipe_storage nilai – Membuat variabel dengan nama “nama” yang bernilai “nilai” dan bertipe “tipe_storage”
• Label – Label senantiasa diakhiri oleh tanda “:” – Contoh: Var1: .word 3 Array1: .byte ‘a’, ‘b’
#membuat variabel tunggal dengan #nilai awal 3 #membuat array karakter 2 #elemen dengan nilai awal ‘a’ dan ‘b’ Organisasi dan Arsitektur Komputer – CSG2G3/2016 #14
Aturan Umum Register MIPS
• Setiap register diberi nama agar mudah diingat • Terdapat register yang memiliki fungsi khusus dan tidak bisa digunakan untuk menyimpan nilai Organisasi dan Arsitektur Komputer – CSG2G3/2016 #15
Instruksi Load/Store
• Instruksi yang mengakses RAM • Load – Lw tujuan_register, sumber_RAM – Lb tujuan_register, sumber_RAM
• Store word – Sw sumber_register, tujuan_RAM – Sb sumber_register, tujuan_RAM
• Load immediate – Li tujuan_register, nilai Organisasi dan Arsitektur Komputer – CSG2G3/2016 #16
Bahasa Assembly MIPS • Arithmetic – Add: add $s1, $s2, $s3 # $s1= isi $s2 + isi $s3 – Substract: sub $s1, $s2, $s3 # $s1= isi $s2 – isi $s3
• Data Transfer – Load word: lw $s1, 100($s2) # $s1=Memory[$s2+100] – Store word: sw $s1, 100($s2) # Memory[$s2+100]=$s1
• Conditional branch – Branch on equal: beq $s1,$s2, L # if ($s1=$s2) go to L – Branch on not equal: bne $s1,$s2, L # if ($s1!=$s2) go to L – Set on less than: slt $s1, $s2, $s3 #if ($s2<$s3) $s1=1, else $s1=0
• Unconditional jump – Jump: j 2500 # go to 10000 – Jump register: jr $ra # go to $ra – Jump and link: jal 2500 #$ra=PC+4; go to 10000 ; for procedure call Organisasi dan Arsitektur Komputer – CSG2G3/2016 #17
Instruksi Load/Store
• Contoh: .data var1: .word 23 .text __start: lw $t0, var1 Li $t1, 5 sw $t1, var1 done Organisasi dan Arsitektur Komputer – CSG2G3/2016 #18
Pengalamatan Tidak Langsung
• Hanya digunakan pada instruksi load dan store • Load alamat: – la $t0, var1 #menyalin alamat RAM var1 ke #dalam register $t0
• Pengalamatan tidak langsung: – lw $t2, ($t0) #mengambil data pada RAM dengan alamat yang ditunjukkan $t0 ke dalam $t2
– sw $t2, ($t0) #menyimpan data dari reg $t2 ke dalam RAM dengan alamat yang ditunjukkan $t0 Organisasi dan Arsitektur Komputer – CSG2G3/2016 #19
Pengalamatan Berbasis Atau Berindex • lw $t2, 4($t0) – Mengambil word pada RAM alamat (isi $t0+4) ke dalam register $t2 – "4" adalah jarak dari register $t0
• sw $t2, -12($t0) – Menyimpan word dari register $t2 ke dalam RAM pada alamat (isi $t0 - 12) – Offset negatif dapat digunakan
• Pengalamatan berbasis khusus digunakan pada: – Arrays: mengakses elemen sebagai offset dari alamat basis – Stacks: mudah dalam mengakses elemen dari stack pointer atau frame pointer Organisasi dan Arsitektur Komputer – CSG2G3/2016 #20
Contoh Pengalamatan Tidak Langsung dan Berindex .data array1: .space 12 .text __start: la $t0, array1 li $t1, 5 sw $t1, ($t0) li $t1, 13 sw $t1, 4($t0) li $t1, -7 done Organisasi dan Arsitektur Komputer – CSG2G3/2016 #21
Instruksi Aritmetika
• Sebagian besar menggunakan 3 buah operand • Semua operand register • Ukuran operand adalah 1 word (4 bytes) • Contoh: – add $t0,$t1,$t2 # $t0 = $t1 + $t2 – sub $t2,$t3,$t4 # $t2 = $t3 – $t4 – addi $t2,$t3, 5 # $t2 = $t3 + 5 – addu $t1,$t6,$t7 # $t1 = $t6 + $t7 – subu $t1,$t6,$t7 # $t1 = $t6 - $t7
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #22
Struktur Kendali • Branch (Pencabangan) – – – – – – –
b target beq $t0,$t1,target blt $t0,$t1,target ble $t0,$t1,target bgt $t0,$t1,target bge $t0,$t1,target bne $t0,$t1,target
#pencabangan tanpa kondisi
• Jump (Lompatan) – J target # lompat ke label “target” – Jr $t3 # lompat ke alamat isi $t3 Organisasi dan Arsitektur Komputer – CSG2G3/2016 #23
Pemanggilan Subrutin • Instruksi JAL: Jump and link – Jal sub_label #sub_label adalah nama subrutin – Menyalin isi program counter ke dalam register $ra – Lompat ke program dengan label “sub_label”
• Instruksi JR: jump register – Jr $ra – Lompat ke alamat kembali yang terdapat dalam register $ra
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #24
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 Organisasi dan Arsitektur Komputer – CSG2G3/2016 #25
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 Organisasi dan Arsitektur Komputer – CSG2G3/2016 #26
Kompilasi Program C ke Dalam MIPS
• Contoh: Program C kompleks berikut mengandung 5 variabel f, g, h, i, dan j: f = (g+h) – (i+j); Apakah yang dihasilkan oleh compiler C? Jawab: add t0, g, h add t1, i, j sub f, t0, t1 Organisasi dan Arsitektur Komputer – CSG2G3/2016 #27
Kompilasi Program C Menggunakan Register • Contoh: f = (g+h) – (i+j) Ubah ke dalam assembly MIPS ! Jawab: add $t0, $s1, $s2 #register $t0 menyimpan nilai g+h add $t1, $s3, $s4 #register $t1 menyimpan nilai i+j sub $s0, $t0, $t1 #f gets $t0-$t1
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #28
Kompilasi Assignment Dimana Operand Dalam Memory • Contoh: Misal A adalah array 100 word dan compiler memetakan variabel g dan h dengan register $s1 dan $s2. Misal alamat awal, alamat basis, array ada dalam $s3. Terjemahkan program C berikut: g = h + A[8] Jawaban: lw $t0, 32($s3) # Temporary reg $t0 gets A[8] add $s1, $s2, $t0 # g = h + A[8]
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #29
Kompilasi Menggunakan Load dan Store
• Misal variabel h diasosiasikan dengan register $s2 dan alamat dasar array A ada dalam $s3. Bagaimanakah kode assembly MIPS untuk program C berikut? A[12] = h + A[8] Jawab: lw $t0, 32($s3) add $t0, $s2, $t0 sw $t0, 48($s3) Organisasi dan Arsitektur Komputer – CSG2G3/2016 #30
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 $s3, compiler mengasosiasikan variabel g, h, dan i dengan register $s1, $s2, dan $s4. Bagaimanakah bahasa MIPS? Jawaban: add $t1, $s4, $s4 #temp reg $t1=2*i add $t1, $t1, $t1 #temp reg $t1=4*i add $t1, $t1, $s3 #$t1=address of A[i] (4*i+$s3) lw $t0, 0 ($t1) #temp reg $t0=A[i] add $s1, $s2, $t0 #g=h+A[i] Organisasi dan Arsitektur Komputer – CSG2G3/2016 #31
Menterjemahkan Assembly MIPS ke Dalam Instruksi Mesin
• Contoh: Terdapat instruksi MIPS: add $t0, $s1, $s2 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 00000010001100100100000000100000 Organisasi dan Arsitektur Komputer – CSG2G3/2016 #32
Menterjemahkan C ke Dalam Assembly dan Bahasa Mesin MIPS • Contoh: Terjemahkan bahasa MIPS ke dalam bahasa mesin. Asumsi $t1 menyimpan basis array A dan $s2 sebagai h, program C: A[300] = h + A[300] • Jawab: Dikompile dalam MIPS lw $t0, 1200($t1) #temp reg $t0 gets A[300] add $t0, $s2, $t0 #temp reg $t0 gets h+A[300] sw $t0, 1200($t1): Bahasa mesinnya:
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #33
Instruksi untuk membuat Keputusan • Compile pernyataan IF ke dalam branch kondisional. Berikut program C: if (i==j) go to L1; f = g + h; L1: f = f – i; Asumsi 5 buah variabel f-j sama dengan registers $s0 $s4, bagaimanakah hasil compile dalam kode MIPS? • Jawab: beq $s3, $s4, L1 # go to L1 if i equals j add $s0, $s1, $s2 # f = g + h L1: sub $s0, $s0, $s3 #f=f–i Organisasi dan Arsitektur Komputer – CSG2G3/2016 #34
Kompilasi pencabangan kondisional
if-then-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 $s3, $s4, else # go to else if i ≠ j add $s0, $s1, $s2 # f = g + h (skipped if i ≠ j) j exit # go to Exit else: sub $s0, $s1, $s2 # f = g - h exit:
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #35
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 mengasosiasikan variabel g, h, i, dan j dengan register $s1, $s2, $s3 dan $s4 berturutturut. Misal basis array A terdapat dalam $s5. Bagaimanakah kode MIPS? Organisasi dan Arsitektur Komputer – CSG2G3/2016 #36
Kompilasi Liupan dengan variable Array Index • Jawab: Loop: add $t1, $s3, $s3 add $t1, $t1, $t1 add $t1, $t1, $s5 lw $t0, 0($t1) add $s1, $s1, $t0 add $s3, $s3, $s4 bne $s3, $s2, Loop
# Temp reg $t1 = 2*i # Temp reg $t1 = 4*i # $t1 = address of A[i] # Temporary reg $t0 = A[i] # g = g + A[i] #i=i+j # go to Loop if i ≠ h
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #37
Kompilasi Liupan while
• Pemeriksaan kondisi yang terdapat setelah instruksi While • Jika terpenuhi maka isi liupan dijalankan • Jika tidak terpenuhi keluar dari liupan
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #38
Kompilasi Liupan while
• Berikut loop dalam C: while (save[i] ==k) i = i + j; Asumsi i, j, dan k berkorespondensi dengan register $s3, $s4, dan $s5 dan basis array disimpan dalam $s6. Bagaimanakah bahasa MIPS-nya?
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #39
Kompilasi Liupan while • Jawab: Ambil nilai save[i] ke dalam register temp Loop: add $t1, $s3, $s3 # Temp reg $t1 = 2 * i add $t1, $t1, $t1 # Temp reg $t1 = 4 * i add $t1, $t1, $s6 # $t1 = address of save[i] lw $t0, 0($t1) # temp reg $t0 = save[i] bne $t0, $s5, Exit # go to Exit if save[i] ≠ k add $s3, $s3, $s4 # go to Loop j Loop Exit:
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #40
Kompilasi pengecekan Less Than
• Apakah kode untuk memeriksa jika variabel a (berkorespondensi dengan register $s0) lebih kecil dari variabel b (register $s1) dan lompat ke label Less jika kondisi dipenuhi? • Jawab: slt $t0, $s0, $s1 # $t0 gets 1 if $s0<$s1(a
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 $s0 - $s5 dan register $t2 bernilai 4.
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #42
Case/Switch Statement
• Jawab: kita gunakan switch variabel k sebagai index alamat jump address table, dan loncat melalui nilai yang diambil. slt $t3, $s5, $zero bne $t3, $zero, Exit slt $t3, $s5, $t2 beq $t3, $zero, Exit
# test if k<0 # if k < 0, go to exit # test if k<4 # if k ≥ 4, go to exit Organisasi dan Arsitektur Komputer – CSG2G3/2016 #43
Case/Switch Statement add $t1, $s5, $s5 # temp reg $t1 = 2 * I add $t1, $t1, $t1 # temp reg $t1 = 4 * I add $t1, $t1, $t4 # $t1 = address of Jumptable[k] lw $t0, 0 ($t1) # temp reg $t0 = JumpTable[k] jr $t0 # jump based on register $t0 L0: add $s0, $s3, $s4 # k = 0 so f gets i + j j Exit # end L1: add $s0, $s1, $s2 # k = 1 so f gets g + h j Exit # end L2: sub $s0, $s1, $s2 # k = 2 so f gets g - h j Exit # end L3: sub $s0, $s3, $s4 # k = 3 so f gets i - j Exit: # end Organisasi dan Arsitektur Komputer – CSG2G3/2016 #44
Referensi • Hennessy, John L. dan Patterson, David A. 2005. “Computer Organization and Design: The Hardware/Software Interface”. 3rd edition. Morgan Kaufmann publisher Inc. San Fransisco. USA • http://chortle.ccsu.edu/AssemblyTutorial/ Chapter01/
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #45