งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

CS344-321 Assembly Language Programming Period 32.

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "CS344-321 Assembly Language Programming Period 32."— ใบสำเนางานนำเสนอ:

1 CS Assembly Language Programming Period 32

2 PARAMETER PASSING ในภาษาระดับสูง เมื่อมีการเรียกใช้โปรแกรม ย่อย พารามิเตอร์อาจจะส่งผ่านทาง เรจิสเตอร์ หรือกองซ้อน หรือผสมกัน การผ่านทางเรจิสเตอร์จะเร็วกว่า แต่มี ข้อจำกัด เนื่องจากจำนวน เรจิสเตอร์มีน้อย ถ้ามี พารามิเตอร์จำนวนมากไม่สามารถผ่านทางเรจิ สเตอร์ได้หมด ต่อไปจะกล่าวถึงเฉพาะการผ่านพารามิเตอร์ ทางกองซ้อน เนื่องจากการผ่านพารามิเตอร์ทางเร จิสเตอร์ตรงไปตรงมา ไม่ต้องกล่าวถึงอีก ( ดู ตัวอย่างการเรียกใช้บริการของ BIOS หรือ DOS หรือ atoi หรือ itoa) ตามข้อตกลงของภาษาระดับสูง เมื่อมีการ เรียกใช้โปรแกรมย่อย จะเกิดกรอบกองซ้อน (activation record หรือ stack frame) ดังนี้

3 parameter 1 stack parameter 2 … จัดการโดย ผู้เรียก bp + 6parameter n -1 bp + 4 parameter n bp + 2return address bpdynamic link bp - 2local variable 1 bp - 4local variable 2 จัดการ โดยผู้ถูกเรียก … local variable n กรณี near call

4 parameter 1 stack parameter 2 … จัดการโดย ผู้เรียก bp + 8parameter n -1 bp + 6 parameter n bp + 2return address bpdynamic link bp - 2local variable 1 bp - 4local variable 2 จัดการ โดยผู้ถูกเรียก … local variable n กรณี far call

5 ผู้เรียกจะดำเนินการต่อไปนี้ ผู้เรียกจะดำเนินการต่อไปนี้ - ถ้ามีพารามิเตอร์ กดค่าหรือเลขที่ของ พารามิเตอร์ ( ขึ้นอยู่กับว่าเป็นการส่งพารามิเตอร์ แบบไหน ) ลงบนกองซ้อนในช่วงกระทำการ ตามลำดับ จากตัวแรกถึงตัวสุดท้าย ถ้าเป็นภาษา ปาสคาล ตัวสุดท้ายจะอยู่บนสุด แต่ถ้าเป็นภาษาซี จะทำกลับกัน - เรียกใช้ชุดคำสั่งย่อยหรือฟังก์ชันที่ต้องการ ภาษาแอสเซมบลี 8086/8088 มีคำสั่ง call ซึ่งทำ หน้าที่นี้โดยตรง คำสั่ง call จะกดเลขที่กลับ (return address : เลขที่ของคำสั่งถัดจากคำสั่ง call) ลงบนกองซ้อนในช่วงกระทำการ แล้ว กระโดดไปทำงานที่ชุดคำสั่งย่อยหรือฟังก์ชันที่ ต้องการ ( สถาปัตยกรรมบางแบบไม่มีคำสั่ง call โดยตรง ในกรณีนี้ต้องกดเลขที่กลับมาทำงานต่อ ลงบนกองซ้อนในช่วงกระทำการ แล้วใช้คำสั่ง กระโดด เพื่อไปทำงานที่ชุดคำสั่งย่อยหรือฟังก์ชัน ที่ต้องการเอง )

6 ตัวอย่าง ภาษา Pascal procedure subr(para1:integer, var para2:integer, …, paran:integer) เรียกใช้ด้วย subr(para1, para2, …, paran); subr(para1, para2, …, paran);ภาษาเอสเซมบลี movax,para1; call by value pushax leaax,para2; call by reference leaax,para2; call by reference pushax pushax … movax,paran; call by value movax,paran; call by value pushax pushax callsubr callsubr

7 ตัวอย่าง ภาษา C ซึ่งมีวิธีการผ่านค่าโดย value เท่านั้น subr(int para1, int para2, …, int paran) subr(int para1, int para2, …, int paran)เรียกใช้ด้วย subr(para1, para2, …, paran); subr(para1, para2, …, paran);ภาษาเอสเซมบลี movax,paran pushax... movax,para2 movax,para2 pushax pushax movax,para1 movax,para1 pushax pushax callsubr callsubr

8 ผู้ถูกเรียก จะมีการดำเนินการ ดังต่อไปนี้ ผู้ถูกเรียก จะมีการดำเนินการ ดังต่อไปนี้ - กดค่าโยงพลวัต (dynamic link) ลงบน กองซ้อนในช่วงกระทำการ - จองเนื้อที่ให้กับตัวแปรท้องถิ่นบนกองซ้อน ในช่วงกระทำการ เขียนเป็นคำสั่งภาษาแอสเซมบลี 8086/8088 ได้ ดังนี้ subrprocnear pushbp; dynamic link movbp,sp subsp,_total_local_sizes เมื่อ total_parm_sizes เป็นเลขจำนวนเต็ม มีค่า เท่ากับขนาดของพารามิเตอร์รวมกันทั้งหมด

9 เมื่อผู้ถูกเรียกทำงานเสร็จ จะต้องลบกรอบ กองซ้อนทิ้ง วิธีการลบทำได้ง่าย ๆ โดยการใช้ คำสั่ง ต่อไปนี้ movsp,bp popbp rettotal_parm_sizes subrendp เมื่อ total_parm_sizes เป็นเลขจำนวนเต็ม มีค่า เท่ากับขนาดของพารามิเตอร์รวมกันทั้งหมด

10 ตัวอย่าง จากโปรแกรมภาษาปาสกาล ข่อไปนี้ program final(input,output); var i,j:integer; var i,j:integer; procedure swap(var x,y:integer); procedure swap(var x,y:integer); var t : integer; var t : integer; begin begin t:=x; t:=x; x:=y; x:=y; y:=t; y:=t; end; end; begin begin swap(i,j); swap(i,j); end. end. จงเขียนโปรแกรมภาษาแอสเซมบลี 8086/8088 ให้ทำงานเหมือน โปรแกรมภาษา Pascal ข้างต้น โดยให้มีการผ่านพารามิเตอร์ทาง กองซ้อน ตามข้อตกลงของภาษา Pascal

11 dosseg.model small.stack 128.data ; define global variables here idw? jdw?

12 .code swapprocnear xequ[bp+6]; parameter x yequ[bp+4]; parameter y tequ[bp-2]; local variable t pushbp; save old bp as dynamic link movbp,sp; set bp point to stack frame subsp,2; allocate space for t pushbx; save content of bx movbx,x; t := x be careful x keeps address of i not value of i movax,[bx]; keep value of x in ax movt,ax; then copy to t movbx,y; x:=y be careful x and y keep address of i and j movax,[bx]; keep value of y in ax movbx,x mov[bx],ax; then copy to x movax,t; y:=t, keep value of t in ax movbx,y; next instruction will copy to y mov[bx],ax; after this i and j should be exchanged value

13 popbx; restore content of bx mov sp,bp pop bp ret 4 swapendp mainprocnear movds,ax leaax,i; pass parameters (Pascal Convention) pushax leaax,j pushax callswap; call swap movax,4c00h int21h mainendp endmain

14 กรณี nested call หรือ recursive call เช่น main call A แล้ว A call B main{ … ; call A; … } proc A { …; call B; … } proc B { … } จะเกิด stack frame บน stack ดังนี้ หมายเหตุ แสดงเฉพาะ dynamic link และ stack frame pointer

15 bp ของ main เป็นอะไร ก็ได้ bp stack frame ของ A bp stack frame ของ B


ดาวน์โหลด ppt CS344-321 Assembly Language Programming Period 32.

งานนำเสนอที่คล้ายกัน


Ads by Google