Kumpulan Instruksi dan
Assembly
MIPS
(Pertemuan ke-25)
Diedit ulang oleh: Endro Ariyanto
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
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)
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
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
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 sebeluminstruksi dieksekusi:
Isi memori sesudah instruksi dieksekusi:
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
Instruksi dalam MIPS
SRA -- Shift right arithmetic SRL -- Shift right logicalSRLV -- 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)
Studi Kasus – Instruksi Add
• Instruksi penjumlahan isi dua register
• Hasil operasi disimpan dalam register
Studi Kasus – Instruksi BEQ
• Instruksi percabangan bersyarat
• Terjadi percabangan jika syarat dipenuhi
• Percabangan terjadi dengan mengisikan
Studi Kasus – Instruksi OR
• Melakukan operasi OR pada dua buah
input bit per bit
• Hasil operasi disimpan dalam suatu
register
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
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 #membuat variabel tunggal dengan #nilai awal 3
Aturan Umum Register MIPS
• Setiap register diberi nama agar mudah diingat
• Terdapat register yang memiliki fungsi khusus
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
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
Instruksi Load/Store
• Contoh:
.data
var1: .word 23
.text
__start:
lw $t0, var1
Li $t1, 5
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 denganalamat yang ditunjukkan $t0 ke dalam $t2
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:
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
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
Struktur Kendali
• Branch (Pencabangan)
– b target #pencabangan tanpa kondisi – beq $t0,$t1,target – blt $t0,$t1,target – ble $t0,$t1,target – bgt $t0,$t1,target – bge $t0,$t1,target – bne $t0,$t1,target
• Jump (Lompatan)
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
Bahasa Mesin MIPS
• Bahasa mesin adalah bahasa yang bisa dimengerti oleh mesin
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:
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
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
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]
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
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]
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:
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):
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
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:
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
berturut-Kompilasi Liupan dengan
variable Array Index
• Jawab:
Loop: add $t1, $s3, $s3 # Temp reg $t1 = 2*i add $t1, $t1, $t1 # Temp reg $t1 = 4*i add $t1, $t1, $s5 # $t1 = address of A[i]
lw $t0, 0($t1) # Temporary reg $t0 = A[i] add $s1, $s1, $t0 # g = g + A[i]
add $s3, $s3, $s4 # i = i + j
Kompilasi Liupan while
• Pemeriksaan kondisi yang terdapat
setelah instruksi While
• Jika terpenuhi maka isi liupan dijalankan
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.
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:
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<b)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;
}
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
# test if k<0
bne $t3, $zero, Exit
# if k < 0, go to exit
slt $t3, $s5, $t2
# test if k<4
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
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/