assembly mips (bag-2) · april 2016 assembly mips (bag-2) (pertemuan ke-26) prodi s1 teknik...
TRANSCRIPT
April 2016
Assembly MIPS (bag-2) (Pertemuan ke-26)
Prodi S1 Teknik Informatika Fakultas Informatika
Universitas Telkom
Diedit ulang oleh:
Endro Ariyanto
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #1
Prosedur Dalam MIPS
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #2
Tahap Pemanggilan Prosedur
• Menempatkan parameter dimana prosedur dapat mengaksesnya
• Kirim kontrol ke prosedur
• Menyediakan sumber daya storage yang diperlukan oleh prosedur
• Lakukan tugas yang diinginkan
• Tempatkan hasilnya pada tempat dimana program pemanggil dapat mengaksesnya
• Kembali ke program awal
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #3
Alokasi MIPS untuk prosedur
• $a0 - $a3: 4 argumen untuk mengirim parameter
• $v0 - $v1: 2 register nilai untuk nilai yang dihasilkan
• $ra: 1 register alamat kembali untuk kembali ke program asal
• $sp: stack pointer untuk menunjukkan alamat dimana data dicadangkan
• Jal: jump and link ke call procedure
• Jr $ra: jump return ke alamat kembali
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #4
Alokasi MIPS untuk prosedur
• Pada saat program utama akan memanggil prosedur terlebih dahulu nilai parameter disimpan dalam register argumen
• Dalam prosedur yang dipanggil hasil akhirnya disimpan dalam register tempat menyimpan hasil
• Register $ra digunakan sebagai register yang menyimpan tempat alamat kembali ke program utama
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #5
Register yang tidak boleh dan boleh digunakan dalam pemanggilan prosedur
• Register yang tidak boleh digunakan (Preserved) – Register Save: $s0 - $s7
– Register Stack pointer: $sp
– Register Return address: $ra
– Stack di atas stack pointer
• Register yang boleh digunakan (Unpreserved) – Register Temporary $t0 - $t7
– Register Argument: $a0 - $a3
– Register nilai prosedur: $v0 - $v1
– Stack di bawah stack pointer
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #6
Contoh dalam C
int leaf_example (int g, int h, int i, int j)
{
int f;
f = (g+h) – (i+j);
return f;
}
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #7
Program dalam MIPS
leaf example:
subi $sp, $sp, 12
sw $t1, 8($sp)
sw $t0, 4($sp)
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero
lw $s0, 0($sp)
lw $t0, 4($sp)
lw $t1, 8($sp)
addi $sp, $sp, 12
jr $ra
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #8
Prosedur Bersarang
int fact (int n)
{
if (n<1) return (1);
else return (n * fact(n-1));
}
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #9
Program Dalam MIPS
fact:
subi $sp, $sp, 8
sw $ra, 4($sp)
sw $a0, 0($sp)
slt $t0, $a0, 1
beq $t0, $zero, L1
add $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1: sub $a0, $a0, 1
jal fact
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $a0, $v0
jr $ra
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #10
Layanan System Call
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #11
Layanan System Call
• Layanan print_string memerlukan alamat awal string karakter
• Directive .asciiz membuat “null-terminated character string”
• Layanan read_int, read_float, dan read_double membaca seluruh baris input termasuk karakter baris baru
• Layanan read_string sama dengan semantik rutin fgets pada library UNIX – Membaca sampai n-1 karakter ke dalam buffer dan
memberi nilai akhir string dengan karakter null
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #12
Layanan System Call
• Layanan sbrk mengembalikan nilai alamat block memory yang mengandung n byte tambahan
• Layanan ini digunakan untuk alokasi memori dinamis
• Layanan exit menghentikan program yang sedang berjalan
• Contoh: mencetak nilai integer li $v0, 1
move $a0, $t2
syscall
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #13
Contoh Layanan System Call
• Membaca nilai integer, menyimpan dalam RAM: li $v0, 5
syscall
sw $v0, int_value
• Mencetak string .data
String1: .asciiz "Print this.\n"
.text
main: li $v0, 4
la $a0, string1
syscall
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #14
System Call dan I/O pada SPIM
• Digunakan untuk membaca atau menulis nilai atau string dari input/output, dan mengindikasikan akhir program
• Menggunakan “syscall” untuk memanggil rutin sistem operasi
• Menyimpan nilai tertentu dalam registers $v0 dan $a0-$a1
• Jika terdapat hasil akan disimpan dalam register $v0
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #15
PC SPIM
• PCSpim merupakan aplikasi untuk mensimulasikan program assembly MIPS
• Program assembly bisa ditulis pada Notepad, kemudian disimpan dengan ekstensi .asm
• Pada PCSpim, buka file .asm tersebut
• Jalankan program dengan mengubah “Starting Address” dari 0x00000000 menjadi 0x00400000 sesuai alamat awal program
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #16
Contoh Program Perkalian (1)
.data
string1: .asciiz "Masukkan bilangan pertama:"
string2: .asciiz "Masukkan bilangan kedua:"
string3: .asciiz "Hasil perkalian adalah:"
string4: .asciiz "\n"
string5: .asciiz "Jika hasil perkalian = 99, maka program akan keluar.\n"
string6: .asciiz "Goodbye......."
.text
main:
li $v0,4 # menuliskan string5 ke layar
la $a0, string5
syscall
li $v0,4 # ganti baris
la $a0, string4
syscall
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #17
Contoh Program Perkalian (2)
jal proc_input1 # memanggil prosedur proc_input
or $s0, $zero, $v0 # memindahkan hasil bilangan I ke $s0
jal proc_input2 # memanggil prosedur proc_input
or $s1, $zero, $v0 # memindahkan hasil bilangan II (pengali) ke
jal proc_kali # memanggil prosedur proc_kali
or $s2, $zero, $v0 # memindahkan hasil perkalian ke $a2
jal proc_output # memanggil prosedur proc_output
li $v0,4 # ganti baris
la $a0, string4
syscall
li $v0,4 # ganti baris
la $a0, string4
syscall
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #18
Contoh Program Perkalian (3)
li $t8,99
bne $t8, $t0, main
li $v0,4 # keluar
la $a0, string6
syscall
li $v0,10
syscall
proc_input1:
li $v0,4 # menuliskan string1 ke layar
la $a0, string1
syscall
ori $v0, $zero, 5 # meminta inputan integer dari user
syscall
j $ra
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #19
Contoh Program Perkalian (4)
proc_input2:
li $v0,4 # menuliskan string1 ke layar
la $a0, string2
syscall
ori $v0, $zero, 5 # meminta inputan integer dari user
syscall
j $ra
proc_kali:
or $t0, $zero, $zero # inisiasi $t0 = 0 (utk menampung hasil kali)
or $t1, $s1, $zero # $t1 diisi dengan $s1 (pengali)
ulang: beq $t1, $zero, exit # jika $t1 (pengali) = 0 lompat ke exit
add $t0, $t0, $s0 # tambahkan $t0 dengan isi $s0 (bilangan I)
addi $t1, $t1, -1 # kurangi bilangan pengali dengan 1
j ulang
exit: or $v0, $zero, $t0 # copy hasil perkalian ($t0) ke $v0
j $ra
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #20
Contoh Program Perkalian (5)
proc_output:
ori $v0, $zero, 4 # tampilkan string2 ke layar
la $a0, string3
syscall
ori $v0, $zero,1 # menampilkan hasil ke layar
or $a0,$zero,$s2
syscall
j $ra
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #21
Contoh Hasil Eksekusi
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #22
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/