การผลิตโค๊ดสำหรับ Procedure Call

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
โครงสร้างของภาษา C ในโปรแกรมที่พัฒนาด้วยภาษา C ทุกโปรแกรมจะมีโครงสร้างการพัฒนาไม่แตกต่างกัน ซึ่งประกอบด้วย 6 ส่วนหลัก ๆ โดยที่แต่ละส่วนจะมีหน้าที่แตกต่างกัน.
Advertisements

Suphot Sawattiwong Function ใน C# Suphot Sawattiwong
Pointers. Why have pointers? / pointers ทำให้ฟังก์ชันหรือส่วนของ โปรแกรมสามารถใช้งานข้อมูลร่วมกันได้ / ใช้ pointers ในการสร้างโครงสร้างข้อมูลที่ ซับซ้อนได้
โครงสร้างข้อมูลสแตก มีลักษณะเป็นรายการในแนวเชิงเส้น(Linear List)รูปแบบหนึ่ง และมีข้อกำหนดให้ชุดปฏิบัติการสามารถเพิ่มและลบรายการเพียงด้านเดียว ซึ่งเป็นด้านบนสุดของสแตก(Top.
Introduction to C Introduction to C.
อสมการ 1.1 อสมการเชิงเส้นตัวแปรเดียว
การจัดการความผิดพลาด
บทที่ 7 รีเคอร์ซีฟ ระหว่างการออกแบบเขียนโปรแกรมแบบบนลงล่าง (Top-down Design) จะมีงานย่อย(Subtask) เพื่อแก้ปัญหาในแต่ละเรื่อง และผู้เขียนโปรแกรมต้องการใช้งานย่อยในลักษณะที่เรียกตัวเองขึ้นมาทำงาน.
โครงสร้างข้อมูลสแตก มีลักษณะเป็นรายการในแนวเชิงเส้น(Linear List)รูปแบบหนึ่ง และมีข้อกำหนดให้ชุดปฏิบัติการสามารถเพิ่มและลบรายการเพียงด้านเดียว ซึ่งเป็นด้านบนสุดของสแตก(Top.
BC322 ครั้งที่ 6 Text file BC322 : computer Programming (Week6)
คำสั่ง while และ คำสั่ง do..while
บทที่ 11 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์
Chapter 7 ขอบเขตของตัวแปร Variable Scope.
ข้อตกลงการใช้ Stack และ Recursion
Intermediate Representation (รูปแบบการแทนในระยะกลาง)
Register Allocation and Graph Coloring
สถาปัตยกรรมแบบ stack และ การผลิตโค๊ด
สภาวะแวดล้อมในขณะโปรแกรมทำงาน
Type Judgments และ Type Rules. คำศัพท์ที่จะใช้ Type judgment: การตัดสินความถูกต้องของ type สำหรับ expression หรือ statement ใน โปรแกรม – เป็นบทสรุป (conclusion)
โครงสร้างการควบคุมการทำงานของโปรแกรม Program control structures
Ordering and Liveness Analysis ลำดับและการวิเคราะห์บอกความ เป็นอยู่หรือความตาย.
รหัสระหว่างกลาง (Intermediate code)
Functional Programming
Data Type part.III.
สถาปัตยกรรม ActiveX Data Object (ADO)
CS Assembly Language Programming
Structure Programming
CS Assembly Language Programming
CS Assembly Language Programming
ชนิดของข้อมูลและตัวดำเนินการ
Arrays and Pointers.
ลักษณะการทำงานของ Stack
หน่วยที่ 1 ระบบคอมพิวเตอร์
โปรแกรมย่อย : Pascal Procedure
บทที่ 1. พื้นฐานความรู้ทั่วไป
การประกาศตัวแปร “ตัวแปร” คือสิ่งที่เราสร้างขึ้นมาเพื่อใช้เก็บค่าต่างๆและอ้างอิงใช้งานภายในโปรแกรม ตามที่เรากำหนดขึ้น การสร้างตัวแปรขึ้นมาเราเรียกว่า.
Arrays.
บทที่ 13 Pre-processor directive & macro Kairoek choeychuen
Macro Language and the Macro Processor
บทที่ 15 โปรแกรมย่อยและแสต็ก
บทที่ 7 รีเคอร์ซีฟ ระหว่างการออกแบบเขียนโปรแกรมแบบบนลงล่าง (Top-down Design) จะมีงานย่อย(Subtask) เพื่อแก้ปัญหาในแต่ละเรื่อง และผู้เขียนโปรแกรมต้องการใช้งานย่อยในลักษณะที่เรียกตัวเองขึ้นมาทำงานลักษณะของฟังก์ชั่นมีความรอบรัดสั้นกว่าแบบวนลูป.
Infix to Postfix มหาวิทยาลัยเนชั่น หลักการภาษาชุดคำสั่ง
คิว ลักษณะการทำงานของ Queue การดำเนินการของ Queue การตรวจสอบ Queue
สแตค(stack) โครงสร้างข้อมูลแบบ Stack - การสร้าง Stack
ฟังก์ชัน ง30212 การเขียนโปรแกรมด้วยภาษาคอมพิวเตอร์ ศูนย์คอมพิวเตอร์
ประโยคเปิดและตัวบ่งปริมาณ
ปฏิบัติการครั้งที่ 10 pointer. หน่วยความจำ หน่วยความจำนั้นเสมือนเป็นช่องว่างไว้เก็บ ของที่มีหมายเลขประจำติดไว้ที่แต่ละช่อง เพื่อใช้ในการระบุตำแหน่งของช่องได้
โครงสร้างข้อมูลคืออะไร ?
ตัวแปรกับชนิดของข้อมูล
สำนักวิชาเทคโนโลยีสารสนเทศและการสื่อสาร มหาวิทยาลัยนเรศวร พะเยา
เสรี ชิโนดม ฟังก์ชัน เสรี ชิโนดม
Recursion การเรียกซ้ำ
วิทยา กรระสี (วท.บ. วิทยาการคอมพิวเตอร์)
ฟังก์ชัน.
วิชา วิศวกรรมซอฟต์แวร์ (Software Engineering)
หลักการเขียนโปรแกรม ( )
กองซ้อน ยอดกองซ้อน (stack).
โครงสร้างข้อมูลแบบกองซ้อน (Stack)
PHP การตรวจสอบเงื่อนไข.
Lab.
โครงสร้างข้อมูลแบบรายการโยง (Link List)
บทที่ 9 พอยเตอร์. สื่อชุดนี้เป็นลิขสิทธิ์ของสำนักพิมพ์วังอักษรใช้เพื่อ การศึกษาเท่านั้น พอยเตอร์ (Pointer) พอยเตอร์คือต้นฉบับของชนิดข้อมูล เป็นชนิด ข้อมูลที่สร้างจากข้อมูลมาตรฐานชนิดหนึ่ง.
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
TECH30201 Object-Oriented Programming
การกระทำทางคณิตศาสตร์
Function ธนวัฒน์ แซ่ เอียบ. What is a function ฟังก์ชันในภาษา C เป็นโปรแกรมที่ถูกออกแบบมาเพื่อ ใช้แก้ปัญหางานใดงานหนึ่งโดยเฉพาะ ฟังก์ชันจะเปลี่ยน input.
1 Functions กนกวรรธน์ เซี่ยงเจ็น สำนักวิชาเทคโนโลยีสารสนเทศ และการสื่อสาร มหาวิทยาลัยนเรศวร พะเยา.
stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
โครงสร้างข้อมูลแบบ สแตก (stack)
Subroutine ธนวัฒน์ แซ่ เอียบ. Subrountine – คือส่วนหนึ่งของ code จากโปรแกรมทั้งหมด สำหรับปฏิบัติงานโดยเฉพาะ และเป็นอิสระ จาก code ส่วนอื่นของโปรแกรม ประโยชน์
ใบสำเนางานนำเสนอ:

การผลิตโค๊ดสำหรับ Procedure Call

Activation Record การผลิตโค๊ดที่เกี่ยวกับ procedure และการ call procedure ขึ้นกับรูปแบบของ AR ที่ออกแบบไว้ โค๊ดสำหรับ stack machine ที่เราจะผลิตใช้ AR ง่ายๆ ผลลัพธ์อยู่ที่ accumulator เสมอ ไม่จำเป็นต้องเก็บลง AR AR เก็บข้อมูลของ actual parameter ที่ส่งผ่านมาจาก caller สำหรับการเรียก function f(x1, x2, … , xn) เราจะ push x1, …, xn ลงบน stack

Activation Record $sp ค่าก่อนหน้าและหลังการเรียก function มีค่าเท่ากัน การผลิตโค๊ดต้องทำตามวินัย stack อย่างเคร่งครัด ต้องมี return address มี frame pointer ($fp) เอาไว้ใช้ในการอ้างถึงตัวแปรบน stack ดังนั้นโดยสรุป AR ของเรามีข้อมูล: Frame pointer Actual parameters Return address

แผนภาพ AR พิจารณาการเรียก function f(x, y) จะได้ AR ลักษณะตามด้านล่างนี้

โค๊ดสำหรับ Function Call Calling sequence คือกลุ่มคำสั่งที่เกี่ยวข้องกับการเรียกใช้ function ทั้งในส่วน caller และ callee คำสั่ง MIPS ที่ใช้ในการนี้: jal label กระโดดไปที่ label และเก็บ address ของคำสั่งถัดไปไว้ที่ $ra ต้องมีคำสั่งเก็บค่าของ $ra ลงใน stack คำสั่ง call ใน X86 ISA จะ push ค่า return address ลง stack อัตโนมัติ

โค๊ดสำหรับ Function Call Caller เก็บค่า frame pointer ลงใน stack Caller เก็บค่า actual parameter (หรือ argument ที่ส่งผ่านไปยัง callee) ลงบน stack โดยเก็บค่า parameter ที่อยู่ใน order มากที่สุดก่อน ไล่ลงมาจนเก็บค่า parameter ตัวแรกท้ายที่สุด Callee เก็บค่าใน $ra (return address) ลงบน stack Callee pop ออกจาก stack: Return address ค่า arguments ที่ส่งผ่านมา Frame pointer

โค๊ดสำหรับ Function Call นิสิตบอกได้ไหมว่าขณะนี้ขนาดของ stack frame มีค่าเท่าไหร่ 4*n + 4

โค๊ดสำหรับ Function Definition cgen(T f(T1 x1, …, Tn xn) { e }) = Callee จะ pop ค่าต่อไปนี้: Return address Actual arguments Frame pointer z = 4*n + 8

ตัวอย่าง AR สำหรับ f(x, y)

โค๊ดสำหรับตัวแปร สำหรับ stack machine ที่เราได้กล่าวมา ตัวแปรจริงๆที่ต้องพิจารณาคือ actual arguments (หรือ parameters ของ function) ตัวแปรทุกๆตัวอยู่ใน AR ถูก push โดย caller เราจะอ้างไปถึงตัวแปรเหล่านี้ได้อย่างไร ใช้ $sp? ทำได้ลำบากเพราะ AR สำหรับแต่ละ function เติบโตไม่เท่ากัน เราไม่สามารถอ้างไปถึงตัวแปรเหล่านั้นได้โดย offset ที่ตายตัว

Frame Pointer กับการอ้างถึงตัวแปร $fp ที่เก็บค่า frame pointer จะชี้ไปที่ตำแหน่ง return address บน stack เสมอ $fp สำหรับแต่ละ AR จะไม่มีการเปลี่ยนตำแหน่ง ดังนั้นสามารถนำไปใช้อ้างถึงตัวแปรได้โดยใช้ offset ที่ตายตัว ให้ xi แทน parameter ตัวที่ i ( = 1, …, n) การอ้างไปถึง xi จะใช้ assembly code ต่อไปนี้: lw $a0, z($fp) โดย z = 4 * i

ตัวอย่าง T f(Tx x, Ty y) { e } ตัวแปร x จะถูกชี้ด้วย $fp + 4 ตัวแปร y จะถูกชี้ด้วย $fp + 8

สรุปโดยรวม การออกแบบ AR กับการผลิต assembly code จะต้องทำควบคู่กันและเป็นไปในทิศทางเดียวกัน การผลิตโค๊ดสำหรับ stack machine ในลักษณะที่เรากล่าวถึงสามารถกระทำโดยใช้การ traverse AST ในลักษณะ top-down คอมไพเลอร์ที่ใช้งานจริงปรับปรุงการผลิตโค๊ดให้ดีขึ้นเช่น เก็บค่าตัวแปรลง register แทนที่จะเก็บลง stack ค่าผลลัพธ์ระหว่างกลางมีตำแหน่งที่กำหนดไว้ใน AR โดยตรง ไม่ต้อง push และ pop จาก stack อยู่ตลอด

Example int sumto(int x) { if (x == 0 ) return 0; else return x + sumto(x-1); } sumto: move $fp, $sp sw $ra, 0($sp) addi $sp, $sp, -4 lw $a0, 4($fp) sw $a0, 0($sp) li $a0, 0 lw $t1, 4($sp) addi $sp, $sp, 4 beq $a0, $t1 true1 false1: sw $fp, 0($sp) li $a0, 1 lw $t1, 4($sp) sub $a0, $t1, $a0 addi $sp, $sp, 4 sw $a0, 0($sp) addi $sp, $sp, -4 jal sumto add $a0, $t1, $s0 j endif true1: li $a0, 0 endif: lw $ra, 4($sp) addi $sp, $sp, 12 lw $fp, 0($sp) jr $ra