Masalah diilustrasikan di bawah. Main routine ditulis untuk memanggil subroutine sub di beberapa lokasi kode. Tapi karena sub selalu mengembalikan kontrol ke lokasi yang sama, sehingga pengaturan seperti ini tidak berhasil.
Di halaman sebelumnya, sebelum konsepnya benar-benar dipahami. Dukungan hardware untuk subroutine telah hilang. Berbagai trik jelek telah digunakan untuk mengimplementasikan konsep.
Yang diperlukan adalah mengirim return address ke subroutine saat subroutine tersebut dipanggil. Jadi saat subroutine dipanggil maka dia akan mengembalikan kontrol ke return address.
Tentu saja mengembalikan kontrol ke return address artinya subroutine akan meload PC dengan return address.
Quest 3: (Pertanyaan hardware disain) Bagaimana seharusnya return address dimasukkan ke dalam subroutine? dengan cara meletakkannya di memory di suatu tempat? atau Diletakkan ke dalam register yang berfungsi untuk tujuan ini?
Jawab: diletakkan ke dalam register
Kamis, 11 April 2013
Memberikan Kontrol lewat Instruksi Jump
Gambar di bawah menunjukkan apa yang bisa kamu lakukan dengan menggunakan intruksi j (cara yang sama juga bisa dilakukan dengan menggunakan instruksi b). Jika subroutine utama memanggil subroutine yang lain maka dia akan menggunakan intruksi j untuk masuk ke subroutine tersebut, di akhir subrotine akan ada j lagi untuk mengembalikan code ke subroutine utama.
Subroutine ini hanya dipanggil sekali dalam main, karena dia akan selalu kembali ke titik yang sama (kamu harus menggunakan trik lebih untuk bisa mengimplementasikan subroutine yang lebih modern dan berguna, tapi untuk sementara mengikuti konvensi ini)
Sebuah subroutine dipanggil adalah ketika main routine atau routine yang lain memberikan kontrol ke subroutine tersebut. Main routine ini disebut CALLER dan subroutine disebut CALLEE (pemanggil dan yang dipanggil). Setelah CALLEE selesai dieksekusi, dia biasanya mengembalikan kontrol kembali ke CALLEE.
Quest 2: Apakah normal kalau subroutine hanya bisa diletakkan di satu program?
Jawab: Tidak normal
Jawaban yang benar: No. Kamu harusnya bisa memanggil subroutine di mana pun di dalam program, sebagai bentuk yang dinamis. Dan merekan akan mengembalikan kontrol ini ke baerbagai tempat sebagaimana pemanggilnya, ini akan menjadi semacam permasalahan dengan instruksi j.
Subroutine ini hanya dipanggil sekali dalam main, karena dia akan selalu kembali ke titik yang sama (kamu harus menggunakan trik lebih untuk bisa mengimplementasikan subroutine yang lebih modern dan berguna, tapi untuk sementara mengikuti konvensi ini)
Sebuah subroutine dipanggil adalah ketika main routine atau routine yang lain memberikan kontrol ke subroutine tersebut. Main routine ini disebut CALLER dan subroutine disebut CALLEE (pemanggil dan yang dipanggil). Setelah CALLEE selesai dieksekusi, dia biasanya mengembalikan kontrol kembali ke CALLEE.
Quest 2: Apakah normal kalau subroutine hanya bisa diletakkan di satu program?
Jawab: Tidak normal
Jawaban yang benar: No. Kamu harusnya bisa memanggil subroutine di mana pun di dalam program, sebagai bentuk yang dinamis. Dan merekan akan mengembalikan kontrol ini ke baerbagai tempat sebagaimana pemanggilnya, ini akan menjadi semacam permasalahan dengan instruksi j.
BAB 26 — Subroutine Linkage Sederhana
Semua bahasa pemrograman tingkat tinggi mempunyai konsep subroutine (kadang disebut procedure, function atau method). Sebuah subroutin adalah blok logika terpisah yang memuat operasi yang mandiri. Misalnya adalah fungsi sin biasanya di pisah untuk menjadi subroutine. Bisa juga dipanggil untuk digunakan oleh program sewaktu-waktu.
Bab ini akan menunjukkan implementasi sederhana dari konsep subroutine di dalam bahasa assembly. Implementasi sederhana ini memang belum cukup jika disandingkan dengan subroutine yang ada di bahasa tingkat tinggi. Tetapi merupakan awalan yang baik bagi kamu.
Topik:
Bab ini akan menunjukkan implementasi sederhana dari konsep subroutine di dalam bahasa assembly. Implementasi sederhana ini memang belum cukup jika disandingkan dengan subroutine yang ada di bahasa tingkat tinggi. Tetapi merupakan awalan yang baik bagi kamu.
Topik:
- Call Subroutine
- Routine Caller dan Routine Callee
- Instruksi jal dan jr
- Register $ra
- Konvensi pemanggilan linkage sederhana
- Register yang digunakan di subroutine
Dua bab setelah ini akan membahas metode pemanggilan subroutine yang mirip dengan bahasa tingkat tinggi
Quest 1: Apa instruksi takberkondisi yang mengirim kontrol dari satu address ke address yang lain?
Jawab: jump
Jawaban yang benar: Intruksi jump j dan intruksi branch b
Fase terakhir
Fase final dari program adalah mengeprint string.
Quest 15: Apakah akan lebih mudah jika program ini menggunakan array?
Jawab: Yes
Jawaban yang benar: Mungkin tidak
. . . . .
# pop chars from stack back into the buffer
stend: li $t1,0 # index of first byte of str buffer
popl:
lw $t0,($sp) # pop a char off the stack
addu $sp,$sp,4
beqz $t0,done # null means empty stack
sb $t0,str($t1) # store at string[$t1]
addu $t1,1 # inc the index
j popl # loop
# print the reversed string
done: li $v0,4 # service code
la $a1,str # address of string
syscall
li $v0,10 # exit
syscall
.data
str: .space 128 # character buffer
Quest 15: Apakah akan lebih mudah jika program ini menggunakan array?
Jawab: Yes
Jawaban yang benar: Mungkin tidak
Menge-Pop Character
Saat null byte yang diambil dari buffer terdeteksi maka proses penge-push-an character selesai dan dilanjut dengan proses yang lain. Proses selanjutnya adalah menge-pop character yang ada di dalam stack sampai null yang berada di awal stack terdeteksi. Tiap-tiap character ini di pop ke dalam string buffer.
Null yang berada di akhir null-terminated string tidak perlu di hapus, karena dia berguna untuk membentuk null-terminated yang merupakan hasil dari pop.
Quest 14: Fill in the blank
Null yang berada di akhir null-terminated string tidak perlu di hapus, karena dia berguna untuk membentuk null-terminated yang merupakan hasil dari pop.
. . . . .
# push each character onto the stack
pushl:
lbu $t0,str($t1) # get current char into
# a full word
beqz $t0,stend # null byte: end of string
subu $sp,$sp,4 # push the full word
sw $t0,($sp) # holding the char
addu $t1,1 # inc the index
j pushl # loop
# pop chars from stack back into the buffer
stend: li $t1,0 # index of first byte of str buffer
popl:
$t0,($sp) # pop a char off the stack
$sp,$sp,4
beqz $t0,done # null means empty stack
$t0,str($t1) # store at string[$t1]
addu $t1,1 # inc the index
j popl # loop
# print the reversed string
. . . . .
.data
str: .space 128 # character buffer
Quest 14: Fill in the blank
Menge-Push Character
Di tahap berikutnya, character yang berasal dari buffer di push ke dalam stack. Character kemudian ditest apakah null atau tidak, kalau tidak maka character akan dimasukkan ke stack, kalau iya maka loop akan berhenti.
Quest 13: Fill in the blank
# Reverse and output a user-supplied string
#
# Settings: Load delays OFF; Branch delays OFF,
# Trap file ON; Pseudoinstructions ON
#
# $t0 --- character pushed or popped
# $t1 --- index into string buffer str
.text
.globl main
main: #input the string
li $v0,8 # service code
la $a0,str # address of buffer
li $a1,128 # buffer length
syscall
li $t0,0 # push a null
subu $sp,$sp,4 # onto the stack
sw $t0,($sp) # to signal its bottom
li $t1,0 # index of first char in str buffer
# push each character onto the stack
pushl:
lbu $t0,str($t1) # get current char into
# a full word
$t0,stend # null byte: end of string
subu $sp,$sp,4 # push the full word
$t0,($sp) # holding the char
addu $t1,1 # inc the index
j # loop
stend:
. . . . .
# pop chars from stack back into the buffer
# print the reversed string
.data
str: .space 128 # character buffer
Quest 13: Fill in the blank
Potongan Pertama
Bagian pertama dari program ini adalah membaca string yang diinputkan oleh user. Stack diinisialisasi dengan cara menge push dengan null, natinya null ini berguna ketika program melakukan loop untuk mengepop stack, bergunanya yaitu saat loop mencapai null maka proses pop berhenti.
Quest 12: Fill in the blank
# Reverse and output a user-supplied string
#
# Settings: Load delays OFF; Branch delays OFF,
# Trap file ON; Pseudoinstructions ON
#
# $t0 --- character pushed or popped
# $t1 --- index into string buffer str
.text
.globl main
main: #input the string
li $v0,8 # service code
la $a0,str # address of buffer
li $a1,128 # buffer length
syscall
# initialize the stack:
li $t0, # push a null
$sp,$sp,4 # onto the stack
sw $t0,( ) # to signal its bottom
li $t1,0 # index of first char in str buffer
# push each character onto the stack
# pop chars from stack back into the buffer
# print the reversed string
.data
str: .space 128 # character buffer
Quest 12: Fill in the blank
Langganan:
Komentar (Atom)

.gif)