Senin, 17 September 2012

LAPORAN PRAKTIKUM ARKOM


laporan arkom
I.    TUJUAN PRAKTIKUM :
1. Mengetahui dan memahami sintakssintaks 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
c.       J format terdiri atas enam bit opcode yang diikuti oleh 26 bits 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.




5 Coment:

  1. De', mungkin bagusnya dipotong tulisannya biar di homepage cuma muncul sebagian kecil isi tulisan ^._.^

    BalasHapus
  2. Iye makasih masukanx,nanti phi kuedit2 krn tdk ad ksemptanku.maklum blog baru...

    BalasHapus
  3. Di tunggu tulisan berikutnya de',,

    BalasHapus
  4. nice share walaupun panjang banget

    BalasHapus
  5. Thanks ya dah berkunjung di Blog ku....

    BalasHapus