next up previous contents index
Next: Stack: เมื่อต้องการใช้งานรีจีสเตอร์เพิ่มขึ้น Up: คำสั่ง: ภาษาของคอมพิวเตอร์ Previous: การแปลงลูป while ในภาษา C   Contents   Index

การเรียกฟังก์ชั่นในฮาร์ดแวร์

ฟังก์ชั่น หรือ Procedure เป็นเครื่องมือที่สำคัญในการเขียนโปรแกรมที่มีลักษณะเป็นโครงสร้าง ซึ่งมีส่วนช่วยเป็นอย่างมากที่จะทำให้โปรแกรมสามารถเข้าใจได้ง่ายขึ้น และมีส่วนทำให้สามารถนำส่วนของโปรแกรมกลับมาใช้งานได้ใหม่ ผู้เขียนโปรแกรมสามารถทำงานกับการเขียนฟังก์ชั่น ซึ่งเป็นส่วนแยกออกมาจากโปรแกรมหลัก และมีการส่งผ่านพารามิเตอร์ต่างๆ ระหว่างฟังก์ชั่น และโปรแกรมหลัก รวมถึงข้อมูลต่างๆ ในการทำงานของฟังก์ชั่น โปรแกรมจะทำตามขั้นตอน 6 ขั้นตอน ดังต่อไปนี้

  1. เก็บค่าพารามิเตอร์ ต่างๆ ที่ฟังก์ชั่นต้องการใช้งาน ไว้ในที่ที่ฟังก์ชั่นสามารถเรียกใช้ได้
  2. ส่งผ่านการควบคุมให้ฟังก์ชั่น
  3. ให้ได้มาซึ่งทรัพยากรหน่วยความจำ ที่ฟังก์ชั่นต้องการใช้งาน
  4. ทำการประมวลผลตามที่กำหนด
  5. เก็บผลลัพธ์ของการประมวลผลในตำแหน่งที่โปรแกรมสามารถเรียกใช้งานได้
  6. คืนการควบคุมให้โปรแกรม จากตำแหน่งที่เริ่มเรียกใช้งานฟังก์ชั่น

จากที่กล่าวขั้นต้น คอมพิวเตอร์ MIPS จึงมีการแบ่งรีจีสเตอร์ออกเป็นกลุ่มๆ เพื่อการเรียกฟังก์ชั่นดังต่อไปนี้

ในชุดคำสั่ง MIPS มีคำสั่งเฉพาะสำหรับการเรียกฟังก์ชั่นได้แก่ jump-and-link (jal) ที่ทำการ jump ไปยังแอดเดรสของฟังก์ชั่นที่ถูกเรียก พร้อมทั้งเก็บค่าแอดเดรสของคำสั่งถัดไปไว้ใน $ra

jal ProcedureAddress

ในส่วนของ link เป็นการเก็บค่า return address ไว้ใน $ra

การทำงานของคอมพิวเตอร์แบบ Store Program นั้นจะมีรีจีสเตอร์ที่เก็บตำแหน่งของคำสั่งที่กำลังถูกประมวลผลอยู่ รีจีสเตอร์นั้นมักมีชื่อเรียกว่า Program Counter หรือเรียกย่อว่า PC ในคอมพิวเตอร์ MIPS เรียกรีจีสเตอร์ตัวนี้ว่า Instruction Address Register คำสั่ง jal จะทำการเก็บค่า PC + 4 ไว้ในรีจีสเตอร์ $ra เพื่อการกลับมายังจุดเริ่มต้นหลังจากที่ทำงานในฟังก์ชั่นนั้นๆ เสร็จสิ้น

เพื่อรองรับการส่งผ่านการควบคุมของโปรแกรมกลับคืน สู่จุดเริ่มต้น ชุดคำสั่งของ MIPS มีคำสั่ง jump register (jr) สำหรับ jump ไปที่รีจีสเตอร์ที่กำหนด จากคำสั่ง

jr $ra

เป็นการ jump กลับมาที่โปรแกรมที่เป็นตัวเรียกฟังก์ชั่น หรือเรียกว่า caller ฟังก์ชั่นที่ถูกเรียกมีชื่อว่า callee ดังนั้นเมื่อทำการเรียกฟังก์ชั่น caller จะทำการเก็บค่าพารามิเตอร์ต่างๆ ที่ต้องการส่งผ่านลงในรีจีสเตอร์ $a0-$a3 และใช้คำสั่ง jal X ไปยังฟังก์ชั่น X ที่ต้องการเรียก เมื่อ callee ทำการประมวลผลจนเสร็จสิ้น callee จะเก็บค่าผลลัพธ์ไว้ใน $v0-$v1 และส่งคืนการควบคุมไปยังโปรแกรม caller โดยใช้คำสั่ง jr $ra



Subsections
next up previous contents index
Next: Stack: เมื่อต้องการใช้งานรีจีสเตอร์เพิ่มขึ้น Up: คำสั่ง: ภาษาของคอมพิวเตอร์ Previous: การแปลงลูป while ในภาษา C   Contents   Index
Vara Varavithya 2006-11-06