14
กกกกกกกกกกกกกกกกกก Procedure Call

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

Embed Size (px)

DESCRIPTION

การผลิตโค๊ดสำหรับ Procedure Call. Activation Record. การผลิตโค๊ดที่เกี่ยวกับ procedure และการ call procedure ขึ้นกับรูปแบบของ AR ที่ออกแบบไว้ โค๊ดสำหรับ stack machine ที่เราจะผลิตใช้ AR ง่ายๆ ผลลัพธ์อยู่ที่ accumulator เสมอ ไม่จำเป็นต้องเก็บลง AR - PowerPoint PPT Presentation

Citation preview

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

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

Page 2: การผลิตโค๊ดสำหรับ  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

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

Activation Record

• $sp ค๊&าก&อนหน"าแลิะหลิ�งการเร�ยก function ม�ค๊&าเที่&าก�น– การผลิ�ตโค๊ดต"องที่ าตามว�น�ย stack อย&างเค๊ร&งค๊ร�ด

• ต"องม� return address• ม� frame pointer ($fp) เอาไว"ใช้"ในการอ"างถึ�ง

ต�วแปรบน stack• ด�งน��นโดยสำร/ป AR ขึ้องเราม�ขึ้"อม�ลิ:– Frame pointer– Actual parameters– Return address

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

แผนภาพ AR

• พ�จารณาการเร�ยก function f(x, y) จะได" AR ลิ�กษณะตามด"านลิ&างน��

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

โค๊ดสำ าหร�บ Function Call

• Calling sequence ค๊3อกลิ/&มค๊ าสำ��งที่��เก��ยวขึ้"องก�บ การเร�ยกใช้" function ที่��งในสำ&วน caller แลิะ callee

• ค๊ าสำ��ง MIPS ที่��ใช้"ในการน��: jal label– กระโดดไปที่�� label แลิะเก-บ address ขึ้องค๊ าสำ��งถึ�ดไปไว"

ที่�� $ra– ต"องม�ค๊ าสำ��งเก-บค๊&าขึ้อง $ra ลิงใน stack– ค๊ าสำ��ง call ใน X86 ISA จะ push ค๊&า return address ลิ

ง stack อ�ตโนม�ต�

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

โค๊ดสำ าหร�บ Function Call

• Caller เก-บค๊&า frame pointer ลิงใน stack• Caller เก-บค๊&า actual parameter ( หร3อ argument ที่��สำ&ง

ผ&านไปย�ง callee) ลิงบน stack โดยเก-บค๊&า parameter ที่�� อย�&ใน order มากที่��สำ/ดก&อน ไลิ&ลิงมาจนเก-บค๊&า

parameter ต�วแรกที่"ายที่��สำ/ด• Callee เก-บค๊&าใน $ra (return address) ลิงบน stack• Callee pop ออกจาก stack: – Return address– ค๊&า arguments ที่��สำ&งผ&านมา– Frame pointer

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

โค๊ดสำ าหร�บ Function Call

• น�สำ�ตบอกได"ไหมว&าขึ้ณะน�� ขึ้นาดขึ้อง stack frame ม�

ค๊&าเที่&าไหร&– 4*n + 4

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

โค๊ดสำ าหร�บ Function Definitioncgen(T f(T1 x1, …, Tn xn) { e }) =

• Callee จะ pop ค๊&าต&อไปน��:– Return address– Actual arguments– Frame pointer

• z = 4*n + 8

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

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

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

โค๊ดสำ าหร�บต�วแปร• สำ าหร�บ stack machine ที่��เราได"กลิ&าวมา ต�วแปร

จร�งๆที่��ต"องพ�จารณาค๊3อ actual arguments ( หร3อparameters ขึ้อง function)– ต�วแปรที่/กๆต�วอย�&ใน AR– ถึ�ก push โดย caller

• เราจะอ"างไปถึ�งต�วแปรเหลิ&าน��ได"อย&างไร ใช้" $sp?– ที่ าได"ลิ าบากเพราะ AR สำ าหร�บแต&ลิะ function เต�บโตไม&เที่&าก�น

– เราไม&สำามารถึอ"างไปถึ�งต�วแปรเหลิ&าน��นได"โดย offset ที่��ตายต�ว

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

Frame Pointer ก�บการอ"างถึ�งต�วแปร• การอ"างไปถึ�งต�วแปรจะสำะดวกกว&ามากถึ"าใช้" 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

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

ต�วอย&าง T f(Tx x, Ty y) { e }

• ต�วแปร x จะถึ�กช้��ด"วย $fp + 4• ต�วแปร y จะถึ�กช้��ด"วย $fp + 8

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

สำร/ปโดยรวม• การออกแบบ AR ก�บการผลิ�ต assembly code จะต"องที่ าค๊วบค๊�&ก�นแลิะเป,นไปในที่�ศที่างเด�ยวก�น

• การผลิ�ตโค๊ดสำ าหร�บ stack machine ในลิ�กษณะที่��เรา กลิ&าวถึ�งสำามารถึกระที่ าโดยใช้"การ traverse AST ใน

ลิ�กษณะ top-down• ค๊อมไพเลิอร*ที่��ใช้"งานจร�งปร�บปร/งการผลิ�ตโค๊ดให"ด�ขึ้��นเช้&น– เก-บค๊&าต�วแปรลิง register แที่นที่��จะเก-บลิง stack– ค๊&าผลิลิ�พธ์*ระหว&างกลิางม�ต าแหน&งที่��ก าหนดไว"ใน AR

โดยตรง ไม&ต"อง push แลิะ pop จาก stack อย�&ตลิอด

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

Examplesumto:

move $fp, $spsw $ra, 0($sp)addi $sp, $sp, -4lw $a0, 4($fp)sw $a0, 0($sp)addi $sp, $sp, -4li $a0, 0lw $t1, 4($sp)addi $sp, $sp, 4beq $a0, $t1 true1

false1:lw $a0, 4($fp)sw $a0, 0($sp)addi $sp, $sp, -4sw $fp, 0($sp)addi $sp, $sp, -4lw $a0, 4($fp)sw $a0, 0($sp)addi $sp, $sp, -4

int sumto(int x) { if (x == 0 ) return 0; else return x + sumto(x-1); }

li $a0, 1lw $t1, 4($sp)sub $a0, $t1, $a0addi $sp, $sp, 4sw $a0, 0($sp)addi $sp, $sp, -4jal sumtolw $t1, 4($sp)add $a0, $t1, $a0addi $sp, $sp, 4j endif

true1:li $a0, 0

endif:lw $ra, 4($sp)addi $sp, $sp, 12lw $fp, 0($sp)jr $ra