laporan arkom
I. TUJUAN PRAKTIKUM :
1.
Mengetahui dan memahami sintaks‐sintaks
SPIM 2
2. Mengimplementasikan bahasa assembly MIPS dalam
studi kasus yang lebih mendalam
II. TEORI
DASAR :
A. Jenis
Instruksi MIPS
Instruksi pada MIPS dibagi dalam
tiga bentuk format yakni: format R, format I, format J.
a. R format terdiri dari tiga register
dan function field
b. I format terdiri atas dua register
dan 16 bit long immediate value
B. Daftar
Opcode
a. 0:
tipe R (add, sub, and, or, slt)
b. 2:
jump (j)
c. 4:
branch (beq)
d. 5:
branch (bne)
e. 8:
penjumlahan dengan immediate (addi)
f. 17:
load upper dengan immediate (lui)
g. 35:
load (lw)
h.
43: store (sw)
C.
Instruksi dalam MIPS
1. Add
– penambahan
add
$s1,$s2,$s3 #jumlahkan isi reg s2 dengan isi reg s3
dan
simpan hasilnya ke reg s1
2. Addi
– add immediate
addi
$sp,$sp, 4 #Jumlahkan isi reg sp dengan 4 dan
hasilnya
simpan di dalam reg sp
3. ADDIU
-- Add immediate unsigned
4. ADDU
-- Add unsigned
5. AND -- Bitwise and
6. ANDI
-- Bitwise and immediate
7. BEQ
-- Branch on equal
8. BGEZ
-- Branch on greater than or equal to zero
9. BGEZAL -- Branch on greater than or equal to
zero and link
10. BGTZ -- Branch on greater than zero
11. BLEZ -- Branch on less than or equal to zero
12. BLTZ -- Branch on less than zero
13. BLTZAL -- Branch on less than zero and link
14. BNE -- Branch on not equal
bne
$t0,$zero, Less #Lompat ke alamat Less jika isi
reg t0
tidak sama dengan no
15. DIV – Divide
16. DIVU -- Divide unsigned
17. J – Jump
18. JAL -- Jump and link
19. JR -- Jump register
20. LB -- Load byte
21. LUI -- Load upper immediate
lui
$t0, 255 #isi reg t0 bagian upper (bit 16-31) dengan 255
Isi $t0 sesudah instruksi lui $t0, 255 dieksekusi
22. 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)
23. MFHI -- Move from HI
24. MFLO -- Move from LO
25. MULT -- Multiply
26.
MULTU
-- Multiply unsigned
27. NOOP -- no operation
28. OR -- Bitwise or
29. ORI -- Bitwise or immediate
30. SB -- Store byte
31. SLL -- Shift left logical
32. SLLV -- Shift left logical variable
33. 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
34. SLTI -- Set on less than immediate (signed)
slti $t0,$s0, 10 #reg t0 diisi dengan 1 jika
isi reg s0lebih kecil dari 10
biasanya diikuti dengan perintah: bne
$t0,$zero,Less
35.
SLTU --
Set on less than unsigned
36. SRA -- Shift right arithmetic
37. SRL -- Shift right logical
38. SRLV -- Shift right logical variable
39. SUB – Subtract
sub $s1,$s2,$s3 #kurangkan isi reg s2 dengan
isi reg s3 dan simpan hasilnya ke reg s1
40. SUBU -- Subtract unsigned
41. SW -- Store word
sw
$s1,100($s2) #simpan isi reg s1 ke memori pada alamat hasil jumlahan dari isi
reg s2 dengan 100 (offset)
42. SYSCALL -- System call
43. XOR -- Bitwise exclusive or
44.
XORI --
Bitwise exclusive or immediate
D.
Penggunaan SPIM dipakai pada saat
kondisional (if …then …else…)
Kondisional
kali ini akan diterapkan pada kasus pengecekan bilangan yang diinputkan user,
apakah bilangan tersebut merupakan bilangan ganjil atau bilangan genap.
E. Penggunaan
SPIM untuk bilangan Prima
Pada contoh kali ini
kita akan mengecek apakah inputan user merupakan bilangan prima atau bukan, dan
juga kita akan mengimplementasikan perulangan (for…) beserta kondisional
(if…then…else).
Bila
diconvert menjadi SPIM syntax maka perlu kita ketahui bahwa,
t1
= x (inputan user);
t2
= i;
t3
= p;
t4
= penampung nilai (x+1) ;
t5
= penampung bilangan 2;
s1=
hasil dari perhitungan (x mod i)
F.
Penggunaan
SPIM untuk menghitung FPB
Faktor
Persekutuan Terbesar (FPB) dari dua bilangan bulat positif adalah bilangan bulat positif
terbesar yang membagi habis kedua bilangan tersebut. FPB berguna untuk
menyederhanakan pecahan.
III. LANGKAH KERJA
A.
Menentukan
Bilangan Ganjil dan Genap
v Klik star, All program, pilih accessories, lalu pilih notepad.
v Kode-kode
program dengan bahasa Assembly kita tuliskan di Notepad
v
Simpan hasilnya dengan ekstensi .asm
atau .s.
v
Buka
program PCSPIM, maka akan muncul 2 windows yaitu window berlabel PCSPIM dan
window Console seperti
berikut
v maka akan muncul 2 windows yaitu window berlabel PCSPIM dan
window Console seperti berikut
v Kita
buka kode program yang
ditulis di notepad tadi dengan mengklik File → Open
v Lalu klik file yang di inginkan
v
Compile dan jalankan program dengan
Simulator → Go atau tombol F5 atau tekan
pada
toolbar. Maka akan
muncul window Run Parameters, pada starting address masukkan starting address
yang ada pada program.
v
Pada
Window Run Parameter yang telah diganti Starting Addressnya klik Ok, maka akan
muncul hasilnya pada window Console
v Tampilan
hasil
B. Menentukan Bilangan prima
v Lakukan
langkah yang sama seperti di atas , sintaks yang diinput adalah
v Lalu pilih data yang akan
dijalankan
v Compile
dan jalankan program dengan Simulator → Go atau tombol F5 atau tekan
pada
toolbar. Maka akan muncul window Run Parameters, pada starting address masukkan
starting address yang ada pada program
v Pada
Window Run Parameter yang telah diganti Starting Addressnya klik Ok, maka akan
muncul hasilnya pada window Console
IV. Menghitung FPB
v Lakukan
langkah yang sama seperti di atas , sintaks yang diinput adalah
v Simpan file notepad dengan ekstensi
.asm atau .s
v Buka
program PCSPIM, maka akan muncul 2 windows yaitu window berlabel PCSPIM dan
window Console seperti berikut,lalu
pilih open
v Pilih
file notepad yang akan dijalankan
v
Compile dan jalankan program dengan
Simulator → Go atau tombol F5 atau tekan
pada
toolbar. Maka akan
muncul window Run Parameters, pada starting address masukkan starting address
yang ada pada program.
V. HASIL DAN PEMBAHASAN
A.
Menentukan
Bilangan Ganjil dan Genap
.data = Untuk mengawali pendeklarasiaan
variabel
msg1:.asciiz = msg1 merupakan variabel
"Masukkan nilai:"
msg2:.asciiz = msg2 merupakan variabel
"Genap"
msg3:.asciiz = msg3 merupakan variabel
"Ganjil"
.text = Mengawali program
main: =Label
li $v0, 4 = perintah untuk print string
la $a0,msg1 =load variabel msg1 ke register argumen0
syscall = prosedure call instruksi li $v0,
4
li $v0,5 = perintah untuk baca integer
syscall = prosedure call li $v0,5
add
$t0,$t0,$v0 = jumlahkan isi register t0
dengan isi register v0 dan simpan di register t0
addi
$t1,$t1,2 = jumlahkan isi reg t1
dengan 2 dan simpan di reg t1
div $t0,$t1 = bagi isi register t1 dengan t0
mfhi $t2 = Mengisi
register t2 dengan
bilangan sisa pembagian.
beq
$t2,$0,genap = Jika register t2=0 maka lompat ke label genap
la $a0,msg3 = load msg3
ke reg argumen0
li $v0,4 = perintah print string
syscall = prosedure call
jr $ra = program selesai
genap: = label
la $a0,msg2 = load msg2 ke reg argumen a0
li $v0,4 = perintah print string
syscall = prosedure call
B.
Menentukan
Bilangan prima
.data =Untuk mengawali pendeklarasiaan variabel
msg1:.asciiz
= variabel msg1
"masukan
bilangan:"
msg2:.asciiz = variabel msg2
"merupakan
bilangan prima\n\n"
msg3:.asciiz = variabel msg3
"Bukan
bilangan prima\n\n"
.text =awal Program
main: =label
li $v0, 4 =
perintah untuk print string
la $a0,msg1 =load variabel msg1 ke register argumen0
syscall = prosedure call instruksi li$v0,4
li $v0,5 = perintah untuk baca integer
syscall = prosedure call li $v0,5
addu $t1,$v0,$0 = jumlahkan
isi register v0 dengan 0 dan simpan di
register t1.
addi $t5,$0,2 = jumlahkan 0
dengan 2 dan simpan di register t5
sub $t3,$t3,$t3 = kurang isi register t3 dengan isi register t3 dan simpan di
register t3
addi $t2,$0,1 = jumlahkan 0 dengan 1 dan simpan di
register t2
addi $t4,$t1,1 = tambah isi
regsiter t1 dengan 1 dan simpan di t4
loop: =label
beq $t2,$t4,kalkulasi=jika isi
register t2 sama dengan isi register t4 maka instruksi berikutnya menujuke
label kalkulasi.
div $t1,$t2 = bagi isi register t1 dengan t2
mfhi
$s1 =Mengisi register t2 dengan bilangan sisa
pembagian.
beq $s1,$0,prima =jika isi register s1 sama dengan 0 maka
instruksi berikutnya menuju ke label prima.
add $t2,$t2,1 = jumlahkan isi register t2 dengan 1 dan
simpan di register t2
j loop = lompat ke loop
prima:
= label
add $t3,$t3,1 = jumlahkan isi regsiter t3 dengan 1 dan simpan diregister t3
add $t2,$t2,1 =jumlahkan isi register t2 dengan 1 dan simpan di register t2
j loop
= lompat ke loop
kalkulasi:
= label
beq $t3,$t5,yes = jika isi register
t3=t5 instruksi berikutnya ke label yes
li $v0, 4
= printah untuk print string
la $a0,msg3 =load msg3 ke register a0
syscall
=prosedure call
j exit
=lompat ke label exit
yes:
=label yes
li $v0, 4
=perintah print string
la $a0,msg2
=load msg2 ke register a0
syscall
=prosedure call
j exit
=lompat ke label exit
exit:
=label exit
li $v0, 10
=perintah exit
syscall
=prosedure call
C. Menghitung FPB
.data = Untuk mengawali pendeklarasiaan variabel
msg1:.asciiz = variabel msg1
"\nNilai1:"
msg2:.asciiz = variabel msg2
"nilai2:"
hsl:.asciiz = variabel hsl
"\nHasil:"
.text = awal program
main: = label
la $a0,msg1 = load msg1 ke register a0
li $v0,4 = perintah print string
syscall = prosedure call
li $v0,5 = read integer
syscall = prosedure call
addu $t0,$v0,$0 = $v0+0 dan simpan di register $t0
la $a0,msg2 = load msg2 ke register a0
li $v0,4 = perintah print string
syscall = prosedure call
li $v0,5 = read integer
syscall = prosedure call
addu $t1,$v0,$0 = $t0+0 dan simpan di $t1
slt
$s1,$t1,$t0 = register s1 diisi dengan
satu jika isi register t1 lebih kecil dari isi register t0.
bne
$s1,$zero,loop = Jika $s1 dan $zero tidak sama, maka menuju ke
loop
add $s0,$s0,$t0 = $s0+$t0 disimpan di $s0
sub $t0,$t0,$t0 = $t0-$t0 disimpan di $t0
add $t0,$t0,$t1 = $t0+$t1 disimpan di $t0
sub $t1,$t1,$t1 = $t1-$t1 disimpan di $t1
add $t1,$t1,$s0 = $t1+$s0 disimpan di $s0
loop: = label
div $t0,$t1 = isi $t0:$t1
mfhi $t2 =
Mengisi register t2 dengan bilangan sisa
pembagian.
beq $t2,$zero,exit = jika $t2=0 menuju exit
add $t0,$t1,$0 = $t1+$0 simpan di $t0
add $t1,$t2,$0 = $t2+$0 simpan di $t1
j loop = lompat kke loop
exit: = label
la $a0,hsl =load hsl ke $a0
li $v0, 4 = perintah untuk print string
syscall = prosedure call
add $a0,$a0,$a0 = $a0+$a0 simpan di $a0
add $a0,$t1,$0 = $t1+0 simpan di $a0
li $v0,1 = perintah print integer
syscall = prosedure call
li $v0,10 = perintah exit
syscall = prosedure call
KESIMPULAN
Percobaan
ini menggunkan instruksi MIPS. Secara umum, instruksi pada MIPS dibagi menjadi
4 tipe, yaitu instruksi tipe Arithmetic Operation, Logical Operation, Data
Transfer, dan Control.
Instruksi
tipe aritmetic yang digunakan adalah :
1. Add
=Menjumlahkan isi dari dua buah register dan menyimpan hasilnya ke register
lain.
2. Addi
=Menjumlahkan isi sebuah register dengan sebuah signed number [imm] dan
menyimpan hasilnya ke register lain
3. Addu
=Menjumlahkan isi sebuah register dengan sebuah unsigned number [imm] dan
menyimpan hasilnya ke register lain
4. Sub
=Mengurangkan isi dari dua buah register dan menyimpan hasilnya ke register
lain.
5. Div
=Pembagian 2 buah register
6. Mfih
=Mengisi sebuah register dengan bilangan sisa pembagian Instruksi Logical
Operation yang digunakan adalah
1. Beq
=Jika $s dan $t sama, maka menuju ke alamat yang dituju
2. Bne=Jika
$s dan $t tidak sama, maka menuju ke alamat yang dituju
3. J
= lompat
4. Slt
=Jika $s kurang dari $t, $d diset menjadi 1,dan 0 jika selainnya
5. Syscall =System call merupakan sebuah interface yang
menjembatani antara program dengan sistem operasi.
De', mungkin bagusnya dipotong tulisannya biar di homepage cuma muncul sebagian kecil isi tulisan ^._.^
BalasHapusIye makasih masukanx,nanti phi kuedit2 krn tdk ad ksemptanku.maklum blog baru...
BalasHapusDi tunggu tulisan berikutnya de',,
BalasHapusnice share walaupun panjang banget
BalasHapusThanks ya dah berkunjung di Blog ku....
BalasHapus