• Tidak ada hasil yang ditemukan

Kumpulan Instruksi dan Assembly MIPS (Pertemuan ke-25)

N/A
N/A
Protected

Academic year: 2021

Membagikan "Kumpulan Instruksi dan Assembly MIPS (Pertemuan ke-25)"

Copied!
46
0
0

Teks penuh

(1)

Kumpulan Instruksi dan

Assembly

MIPS

(Pertemuan ke-25)

Diedit ulang oleh: Endro Ariyanto

(2)
(3)

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

(4)

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)

(5)

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

(6)

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

(7)

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:

(8)

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

(9)

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)

(10)

Studi Kasus – Instruksi Add

• Instruksi penjumlahan isi dua register

• Hasil operasi disimpan dalam register

(11)

Studi Kasus – Instruksi BEQ

• Instruksi percabangan bersyarat

• Terjadi percabangan jika syarat dipenuhi

• Percabangan terjadi dengan mengisikan

(12)

Studi Kasus – Instruksi OR

• Melakukan operasi OR pada dua buah

input bit per bit

• Hasil operasi disimpan dalam suatu

register

(13)
(14)

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

(15)

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

(16)

Aturan Umum Register MIPS

• Setiap register diberi nama agar mudah diingat

• Terdapat register yang memiliki fungsi khusus

(17)

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

(18)

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

(19)

Instruksi Load/Store

• Contoh:

.data

var1: .word 23

.text

__start:

lw $t0, var1

Li $t1, 5

(20)

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

(21)

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:

(22)

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

(23)

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

(24)

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)

(25)

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

(26)

Bahasa Mesin MIPS

• Bahasa mesin adalah bahasa yang bisa dimengerti oleh mesin

(27)

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:

(28)

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

(29)

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

(30)

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]

(31)

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

(32)

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]

(33)

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:

(34)

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):

(35)

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

(36)

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:

(37)

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

(38)

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

(39)

Kompilasi Liupan while

• Pemeriksaan kondisi yang terdapat

setelah instruksi While

• Jika terpenuhi maka isi liupan dijalankan

(40)

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.

(41)

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:

(42)

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)

(43)

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;

}

(44)

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

(45)

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

(46)

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/

Referensi

Dokumen terkait