Kumpulan Instruksi dan Assembly MIPS · •Format –Nama: tipe_storage nilai ... •Setiap...
Transcript of Kumpulan Instruksi dan Assembly MIPS · •Format –Nama: tipe_storage nilai ... •Setiap...
April 2016
Kumpulan Instruksi dan Assembly MIPS
(Pertemuan ke-25)
Prodi S1 Teknik Informatika Fakultas Informatika
Universitas Telkom
Diedit ulang oleh:
Endro Ariyanto
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #1
Kumpulan Instruksi MIPS
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #2
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 #3
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 #4
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 #5
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 #6
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 #7
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 #8
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 #9
Studi Kasus – Instruksi Add
• Instruksi penjumlahan isi dua register
• Hasil operasi disimpan dalam register tujuan
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #10
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 #11
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 #12
Bahasa Assembly MIPS
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #13
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 #14
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
Array1: .byte ‘a’, ‘b’ #membuat array karakter 2 #elemen dengan nilai awal ‘a’ dan
‘b’
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #15
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 #16
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 #17
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 #18
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 #19
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 #20
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 #21
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 #22
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 #23
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) – J target # lompat ke label “target”
– Jr $t3 # lompat ke alamat isi $t3
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #24
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 #25
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 #26
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 #27
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 #28
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 #29
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 #30
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 #31
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 #32
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 #33
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 #34
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 #35
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 #36
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 berturut-turut. Misal basis array A terdapat dalam $s5. Bagaimanakah kode MIPS?
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #37
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
bne $s3, $s2, Loop # go to Loop if i ≠ h
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #38
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 #39
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 #40
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 #41
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)
bne $t0, $zero, Less # go to Less if $t0 ≠ 0
# that is if a<b
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #42
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 #43
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
beq $t3, $zero, Exit # if k ≥ 4, go to exit
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #44
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 #45
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/ Chapter-01/