Assembly MIPS (bag-2) (Pertemuan ke-26)
Diedit ulang oleh: Endro Ariyanto
Prodi S1 Teknik Informatika Fakultas Informatika
Universitas Telkom
April 2016
Prosedur Dalam MIPS
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #1
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 #2
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 #3
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 #4
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 #5
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 #6
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 #7
Prosedur Bersarang
int fact (int n) { if (n<1) return (1); else return (n * fact(n-1)); }
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #8
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 #9
Layanan System Call
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #10
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 #11
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 #12
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 #13
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 #14
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 #15
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 #16
Contoh Program Perkalian (2) jal proc_input1 or $s0, $zero, $v0 jal proc_input2 or $s1, $zero, $v0 jal proc_kali or $s2, $zero, $v0 jal proc_output li $v0,4 la $a0, string4 syscall li $v0,4 la $a0, string4 syscall
# memanggil prosedur proc_input # memindahkan hasil bilangan I ke $s0 # memanggil prosedur proc_input # memindahkan hasil bilangan II (pengali) ke # memanggil prosedur proc_kali # memindahkan hasil perkalian ke $a2 # memanggil prosedur proc_output # ganti baris
# ganti baris
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #17
Contoh Program Perkalian (3) li $t8,99 bne $t8, $t0, main li $v0,4 la $a0, string6 syscall li $v0,10 syscall proc_input1: li $v0,4 la $a0, string1 syscall ori $v0, $zero, 5 syscall j $ra
# keluar
# menuliskan string1 ke layar
# meminta inputan integer dari user
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #18
Contoh Program Perkalian (4) proc_input2: li $v0,4 la $a0, string2 syscall ori $v0, $zero, 5 syscall j $ra
# menuliskan string1 ke layar
# meminta inputan integer dari user
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 #19
Contoh Program Perkalian (5) proc_output: ori $v0, $zero, 4 la $a0, string3 syscall ori $v0, $zero,1 or $a0,$zero,$s2 syscall j $ra
# tampilkan string2 ke layar
# menampilkan hasil ke layar
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #20
Contoh Hasil Eksekusi
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #21
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/ Chapter01/
Organisasi dan Arsitektur Komputer – CSG2G3/2016 #22