บทที่ 10...

15
เอกสารคาสอนรายวิชา 2301274 ระบบคอมพิวเตอร์ คณะวิทยาศาสตร์ จุฬาลงกรณ์มหาวิทยาลัย | 104 บทที่ 10 การโปรแกรมสแตกซีพียู วัตถุประสงค์ของการเรียนในบทนี เขียนโปรแกรมด้วยชุดคาสั ่ง (instruction set) ของสแตกซีพียู (Stack CPU) ในบทนี ้เราจะมาเขียนโปรแกรมด ้วยชุดคาสั ่งของสแตกซีพียูซึ ่งมีเพียง 16 คาสั ่งเท่านั ้น แต่สามารถเขียนให ้เป็น โปรแกรมใดใดก็ได้ ในการฝึกเขียนโปรแกรมให้ใช้ Stack Simulator จากเว็บไซต์ของรายวิชา โปรแกรมแรก ในชั ้นนี ้ ยังไม่มีอุปกรณ์อินพุตเช่น คีย์บอร์ด ดังนั ้นจะไม่มีการรับอินพุต เริ ่มต้นไม่มีของใน data stack และ return stack ให้โหลดค่าคงที ่ที ่ต้องการใช้ในโปรแกรมด้วยคาสั ่ง LIT ได้เลย และก็ยังไม่มีอุปกรณ์เอาต์พุต เช่น จอภาพ ดังนั ้นจะไม่มีการพิมพ์เอาต์พุตของโปรแกรม เอาต์พุตคือค่าสุดท ้ายที ่เหลืออยู ่ใน data stack (หรือ TOS) เมื ่อ โปรแกรมจบการทางานที ่คาสั ่ง halt โปรแกรมต่อไปนี ้ โหลดค่าคงที ่ 10 ไว้ใน data stack LIT 10 HALT ตัวแปร (Variable) เวลาเขียนโปรแกรมในภาษา C หรือ Java เราจะต้องประกาศตัวแปรที ่จะใช้ในโปรแกรมเสียก่อน การโปรแกรม สแตกซีพียูก็เหมือนกัน เพียงแต่ประกาศไว้ในใจของผู ้เขียนโปรแกรม ลองพิจารณาโปรแกรมต่อไปนี A = 1 B = 2 C = A + B ตัวแปร 1 ตัวก็คือหน่วยความจา 1 ช่อง ขึ ้นอยู ่กับเราว่าจะให้มันอยู ่ตรงไหน โปรแกรมเริ ่มต้นที address 0 ดังนั ้น อาจจะให้ตัวแปร A, B, C อยู ่หลังโปรแกรม ที address 11, 12, 13 ตามลาดับ และกาหนดค่าเริ ่มต้นให้ A = 1 และ B = 2 ไว้ใน Stack Simulator เลย

Upload: others

Post on 25-Dec-2019

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 104

บทท 10 การโปรแกรมสแตกซพย

วตถประสงคของการเรยนในบทน

เขยนโปรแกรมดวยชดค าสง (instruction set) ของสแตกซพย (Stack CPU)

ในบทน เราจะมาเขยนโปรแกรมดวยชดค าสงของสแตกซพยซงมเพยง 16 ค าสงเทานน แตสามารถเขยนใหเปน

โปรแกรมใดใดกได ในการฝกเขยนโปรแกรมใหใช Stack Simulator จากเวบไซตของรายวชา

โปรแกรมแรก

ในชนน ยงไมมอปกรณอนพตเชน คยบอรด ดงนนจะไมมการรบอนพต เรมตนไมมของใน data stack และ return

stack ใหโหลดคาคงททตองการใชในโปรแกรมดวยค าสง LIT ไดเลย และกยงไมมอปกรณเอาตพต เชน จอภาพ

ดงนนจะไมมการพมพเอาตพตของโปรแกรม เอาตพตคอคาสดทายทเหลออยใน data stack (หรอ TOS) เมอ

โปรแกรมจบการท างานทค าสง halt

โปรแกรมตอไปน โหลดคาคงท 10 ไวใน data stack

LIT

10

HALT

ตวแปร (Variable)

เวลาเขยนโปรแกรมในภาษา C หรอ Java เราจะตองประกาศตวแปรทจะใชในโปรแกรมเสยกอน การโปรแกรม

สแตกซพยกเหมอนกน เพยงแตประกาศไวในใจของผเขยนโปรแกรม ลองพจารณาโปรแกรมตอไปน

A = 1

B = 2

C = A + B

ตวแปร 1 ตวกคอหนวยความจ า 1 ชอง ขนอยกบเราวาจะใหมนอยตรงไหน โปรแกรมเรมตนท address 0 ดงนน

อาจจะใหตวแปร A, B, C อยหลงโปรแกรม ท address 11, 12, 13 ตามล าดบ และก าหนดคาเรมตนให A = 1

และ B = 2 ไวใน Stack Simulator เลย

Page 2: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 105

Address 0: LIT

Address 1: 11

Address 2: LOAD // load (push) A

Address 3: LIT

Address 4: 12

Address 5: LOAD // load (push) B

Address 6: ADD

Address 7: LIT

Address 8: 13

Address 9: STORE // write C

Address 10: HALT

Address 11: 1 // variable A = 1

Address 12: 2 // variable B = 2

Address 13: // variable C (ไมมคาเรมตน)

แถวล าดบ (Array)

แถวล าดบกเปนเซตของตวแปรทอยตดกนในหนวยความจ า เชน A[5] โปรแกรมเมอรกประกาศไวในใจ และจ าไว

วาเรมตนจาก address 10 ถง 14 เปนตน

การแยกท าตามเงอนไข (Conditional Branch)

สแตกซพยจะท างานตามค าสงทอยในหนวยความจ าเรยงตามล าดบ เชน เรมท าจาก address 0 และเลอนไปท า

ค าสงทอยถดไป การจะท าใหเกดโครงสรางแบบ if-then หรอ if-else นนตองใชค าสง IF สมมตวาเราจะให

โปรแกรมแยก (branch) ไปท างานในค าสงท address 12 กเขยนแบบน

Address 0: LIT

Address 1: 0

Address 2: IF

Address 3: 12

ทตอง LIT 0 กอนกเพอใหเงอนไขเปนจรง ค าสง IF จะไดเซตให PC = 12 ค าสงทสามารถเปลยนคา program

counter (PC) ไดตามเงอนไข เปนค าสงประเภทแยกท าตามเงอนไข (conditional branch) ถาเงอนไขเปนจรง

โปรแกรมกจะกระโดดไปท าค าสงหนง (PC = operand) เรยกกรณน วา branch taken แตถาเงอนไขไมเปนจรง

โปรแกรมกจะท าค าส งตอไป (PC = PC + 1) เรยกกรณน วา branch not taken ปกตจะมค าส งประเภท

unconditional branch ดวย ซงจะท าใหโปรแกรมกระโดดไปท าค าสงหนงทนท โดยไมมเงอนไข แตสแตกซพยไมม

ค าสงน ตรงๆ ถาจะท ากตอง LIT 0 กอน แลวคอยเรยกค าสง IF อยาลมวา 0 ท LIT ไวบน data stack จะหายไป

หลงจากท าค าสง IF ทนสตมกจะพลาดบอยๆ คอลมไปวาค าสง IF จะ pop ของใน data stack ออกมา 1 ชน

Page 3: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 106

การท า if-then

โครงสรางของโปรแกรมแบบ if-then แสดงในรปท 10.1

รปท 10.1 โครงสรางโปรแกรมแบบ if-then

ถากลบเงอนไขกอน จะท าใหโปรแกรมสนลง เชน ถาจรงให push(คาทไมใช 0) แตถาไมจรงให push(0) ในบาง

กรณจะเขยนโปรแกรมงายกวามาก และท าใหโปรแกรมสนลงดวย ดรปท 10.2

รปท 10.2 โครงสรางโปรแกรมแบบ if-then (แบบกลบเงอนไข)

Page 4: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 107

การท า if-else

โครงสรางของโปรแกรมแบบ if-else แบบงายๆ ตรงไปตรงมา แสดงในรปท 10.3 ลองเขยนอกแบบโปรแกรมจะ

สนกวาดงรปท 10.4

รปท 10.3 โครงสรางโปรแกรมแบบ if-else (แบบยาว)

รปท 10.4 โครงสรางโปรแกรมแบบ if-else (แบบสน)

Page 5: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 108

การสราง TOS ส าหรบค าสง IF

ค าสง IF จะ taken หรอไม ขนอยกบคาทอยบนสดของ data stack ถา TOS เปนมคาเทากบ 0 กจะ taken ดงนน

ถาเราตองการใหโปรแกรม taken ตามเงอนไข เชน A >= 0 เรากตอง push คา 0 ลง data stack ในกรณท A >=

0 จรง และ push คาทไมเทากบ 0 ในกรณอนๆ (A < 0)

ลองดตวอยางแรก ถา A >= 0 จรงให ให TOS = 0 (taken) ถาไมจรงให TOS != 0 (not taken) วธหนงคอ

สราง TOS ขนาด 8 บต ใหมคาเทากบ A70000000 หรอ MSB ของ A ตามดวย 0 อก 7 ตว ดวยโปรแกรม

ตอไปน

LIT

A // A เปน 2’complement ขนาด 8 บต

LIT

x80

AND

… // ถาเรยกค าสง IF ตอนนจะ taken ถา A >= 0

ท AND ดวย x80 คอตองการพราง (mask) มาใชเฉพาะ MSB และเราร วาถา MSB = 0 แสดงวาเปนจ านวนท

มากกวาหรอเทากบศนย เพราะถา MSB = 1 ในระบบสวนเตมเตมสอง (2’s complement) จะเปนเลขลบ ถา

เปลยนเงอนไขเปน A < 0 จะเอาบตทสรางไวส าหรบเงอนไข A >= 0 มา not ไมได ตองสรางบตทมคาเทากบ

(A XOR x80) AND x80

บตนมคาเปน 0 เมอ A < 0 และมคาอนๆ ทไมเทากบ 0 เมอเงอนไข A < 0 ไมเปนจรง

LIT

A

LIT

x80

XOR

LIT

x80

AND

… // ถาเรยกค าสง IF ตอนนจะ taken ถา A < 0

Page 6: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 109

ถาเปนเงอนไข A > 0 จะยงยากกวาเงอนไข A >= 0 พอสมควร เราตองให TOS เปน 0 ในกรณท A > 0 (เพอให

taken) วธหนงคอสราง TOS ให MSB มคาเทากบ 𝐴7|(𝐴6|𝐴5|𝐴4|𝐴3|𝐴2|𝐴1|𝐴0) บตทเหลอเปน 0 หมด

ดวยโปรแกรมตอไปน (ขอเขยนหลายค าสงรวมกนเพอประหยดบรรทด)

LIT

A

DUP DUP ADD

DUP DUP ADD

DUP DUP ADD

DUP DUP ADD

DUP DUP ADD

DUP DUP ADD

DUP DUP ADD

OR OR OR OR OR OR

LIT

x80

XOR

OR

LIT

x80

AND

… // ถาเรยกค าสง IF ตอนนจะ taken ถา A > 0

ลองดอกตวอยางนงคอ A >= B วธเชคเงอนไขคอจดรปอสมการเปน A – B >= 0 แลวกค านวณ C = A – B

กอน แลวกเชควา C >= 0 หรอไม กท าเหมอนตวอยางแรก

ในการเขยนโปรแกรมจรงๆ เราไมจ าเปนตองระบตวถกด าเนนการ (operand) ของค าสง IF เปนตวเลข เพราะ

ยงยาก พอแกโปรแกรมท จ านวนบรรทดเลอน กตองมาคอยแกตวเลขใหม เราสามารถตงชอใหตวถกด าเนนการ

ไดเลย เชน :START หรอ :END (ผมใส : ขางหนา เพอใหดตางจากค าสงของสแตกซพย) เชน

IF

:AAA // ถา taken จะกระโดดไปท าท :AAA

:AAA …

ในทางปฏบตตวแปลภาษา (compiler) จะแปลงชอเหลาน ใหเปนตวเลขเอง การเขยนโปรแกรมดวยสญลกษณ

เชน LIT, ADD, IF เรยกวาการโปรแกรมดวยภาษาแอสเซมบล (assembly language) ตวแปลภาษาทแปลจาก

ภาษาแอสเซมบลเปนรหสฐานสองหรอภาษาเครอง (machine language) เรยกวาแอสเซมเบลอร (assembler)

Page 7: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 110

การท า for-loop

เรากแปลงลป for ใหใช if-then และ conditional branch กอน ดงในรปท 10.5 จากนนกคอยแปลง if-then และ

unconditional branch ใหเปนค าสงของสแตกซพย

รปท 10.5 โครงสรางโปรแกรมแบบ for-loop

การท า while-loop

กท าคลายๆ กบการท า for-loop ดรปท 10.6

รปท 10.6 โครงสรางโปรแกรมแบบ while-loop

Page 8: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 111

การเรยกฟงกชน (Function Call)

ขออธบายศพทเทคนคทจะใชกอนเลกนอย “caller” หมายถงฟงกชนทเปนคนเรยก สวน “callee” คอฟงกชนท

ถกเรยก เชน ฟงกชน main เรยกฟงกชน printf ฟงกชน main คอ caller สวนฟงกชน printf คอ callee การ

เรยกใชฟงกชน เชน y = f(a,b) ประกอบดวย 3 สวนคอ

Argument ทจะสงใหฟงกชน จะตองอยใน data stack กอนทจะท าค าสง CALL เชน data stack = …, a, b

(b เปน top of stack)

Function หลงจาก CALL กจะเรมท าฟงกชน ตว callee จะร เองวา argument อยใน data stack แลว เมอ

จะจบการท างานของฟงกชน กอนท าค าสง EXIT ตวฟงกชนจะตองท าลาย argument ใน data stack ทงไป

ใหหมด (pop ทงไป) และใสผลลพธไวบน data stack

Result หลงท าค าสง EXIT โปรแกรมจะกลบมาท างานท caller ตว caller จะรเองวา result อยบน data

stack แลว data stack = …, y (y = f(a,b) เปน top of stack)

ลองดตวอยางโปรแกรม f(a, b) = a + b

Address 0: LIT

Address 1: 1 // the first argument

Address 2: LIT

Address 3: 2 // the second argument

Address 4: CALL

Address 5: 7

Address 6: HALT

Address 7: ADD // function starts here

Address 8: EXIT // return from function

เมอโปรแกรม HALT ใน data stack จะเหลอของเพยงชนเดยวคอ 1 + 2 = 3

Page 9: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 112

การเรยกซ า (Recursive Call)

ในฟงกชนหนงเราสามารถเรยกฟงกชนอนใหมาท างานตอได เชน ฟงกชน main เรยกฟงกชน A แลวฟงกชน A

เรยกฟงกชน B เปนตน หรอจะเรยกฟงกชนเดมซ า (recursive) กได ลองดตวอยางโปรแกรม sum(n) = 1 + …

+ n, n ≥ 0 เขยนแบบเรยกซ าจะไดวา sum(n) = n + sum(n - 1), sum(0) = 0

กอนอนควรจะเขยนรหสเทยม (pseudocode) ของฟงกชน sum ใหไดกอนดงน

sum(n) {

if (n == 0)

return 0

else

return n + sum(n - 1)

}

แลวกคอยเขยนโปรแกรมไปตามรหสเทยมดงน

Address 0: LIT

Address 1: 10 // argument = 10

Address 2: CALL

Address 3: 5

Address 4: HALT

Address 5: DUP // function starts here

Address 6: IF

Address 7: 15

Address 8: DUP

Address 9: LIT

Address 10: 1

Address 11: SUB

Address 12: CALL

Address 13: 5

Address 14: ADD

Address 15: EXIT

Page 10: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 113

ลองดอกตวอยางหนงคอ multiply เขยนรหสเทยม (pseudocode) กอน

mul(m, n) {

if (n == 0)

return 0;

else

return m + mul(m, n - 1)

}

แลวกคอยเขยนโปรแกรมไปตามรหสเทยมดงน

LIT

5 // m

LIT

3 // n

CALL

:MUL

HALT

:MUL DUP

IF

:END

OVER

SWAP

LIT

1

SUB

CALL

:MUL

ADD

EXIT

:END DROP

DROP

LIT

0

EXIT

โปรแกรมนจะไดผลลพธ 5 x 3 = 15 (x0F)

Page 11: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 114

ลองดแฟกทอเรยล (factorial) เปนตวอยางสดทาย fac(n) {

if (n == 0)

return 1

else

return mul(n, fac(n-1))

}

เขยนโปรแกรมไดดงน

LIT

10

CALL

:FAC

HALT

:FAC DUP

IF

:END

DUP

LIT

1

SUB

CALL

:FAC

CALL

:MUL

EXIT

:END DROP

LIT

1

EXIT

จะเหนวาในการค านวณฟงกชน :FAC ตองใชฟงกชน :MUL ชวยเพราะสแตกซพยไมมค าสงคณ ใหนสตไปคดไป

การบานวาจะเขยนฟงกชน :MUL ยงไง

Page 12: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 115

ขอจ ากดของสแตกซพย

ขอจ ากดโดยทวๆ ไปของสแตกซพยคอ โปรแกรมใช memory, data stack, return stack ไดไมเกน 256 ชอง เชน

เขยนโปรแกรมยาวมากไมได เพราะอางถงหนวยความจ าไดแค 28 ชอง ถงมเงนซอหนวยความจ ามาเพม

กอางไดแค 28 ชอง ถาไมแกฮารดแวรหรอมสวนขยายทจะท าใหอางถงหนวยความจ าไดมากกวาน

ใชแถวล าดบ (array) หรอเกบขอมลใหญมากไมได หนวยความจ าไมพอ ดวยเหตผลทกลาวไปแลวขางตน

ค านวณสญกรณเตมหลง (postfix notation) ทยาวมากไมได เพราะ data stack (DS) จะลน (overflow)

เรยกฟงกชนซ าลกมากไมได เพราะ return stack (RS) จะลน

ขอดคอโปรแกรมทเขยนดวยชดค าสงของซพยทมสถาปตยกรรมแบบสแตกจะสนกวาโปรแกรมบนสถาปตยกรรม

แบบอนๆ มาก สถาปตยกรรมแบบสแตกพบได ใน “Java Virtual Machine” และ “Common Language

Runtime (CLR)” ของ .NET ซงเปนเครองเสมอน (virtual machine) คอไมมซพยหรอไมโครโพรเซสเซอรทจะ

ท า (execute) ชดค าส งของ Java byte code และ Common Intermediate Language (CIL) ไดตรงๆ แตใช

วธจ าลองเครองเสมอนข นมาบนไมโครโพรเซสเซอรทมสถาปตยกรรมแบบอน เชน x86 ปจจบนซพยทม

สถาปตยกรรมแบบสแตกไมคอยจะมใหเหนแลว เนองจากสถาปตยกรรมแบบสแตกมสมรรถนะการค านวณดอย

กวาสถาปตยกรรมแบบอนๆ นสตจะไดเหนในบทตอๆ ไปวาท าไมจงเปนเชนนน

เอกสารประกอบ (ส าหรบอานเพมเตม)

ลองอานบทความตอไปน

Java Bytecode

http://en.wikipedia.org/wiki/Java_bytecode

Common Intermediate Language

http://en.wikipedia.org/wiki/Common_Intermediate_Language

แบบฝกหด

1. ลองตอบค าถามตอไปน

ก. สแตกซพยไมมค าสง NOT เชน NOT ของ 0x7F ได 0x80 จะเขยนโปรแกรมท า NOT อยางไร

ข. สแตกซพยไมมค าสง “คณ” เลขจ านวนเตม แลวจะเขยนโปรแกรมเพอท าการคณไดอยางไร

ค. สแตกซพยไมมค าสง OVER2 (ท างานคลาย OVER แตเอาตวทอยถดจาก TOS ไปอกสองตว) เชน

เรมตน A B C (C คอ top of stack)

สนสด A B C A

จะเขยนโปรแกรมเพอท าแบบน ไดอยางไร

ง. สแตกซพยบวกเลขไดทละ 8 บต ถาตองการบวกเลข 16, 32, 64 บตจะท าอยางไร

Page 13: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 116

จ. สแตกซพยไมมฮารดแวรทใชค านวณจ านวนแบบจดตรง (floating-point number) มแตฮารดแวรทใช

บวกลบเลขจ านวนเตม แลวจะโปรแกรมใหบวกลบคณหารจ านวนในระบบ IEEE754 ไดหรอไม

ฉ. จะโปรแกรมสแตกซพยใหหาดเทอรมแนนต (determinant) ของเมทรกซขนาด 50 x 50 ไดหรอไม

เพราะเหตใด

ช. จะโปรแกรมสแตกซพยใหหา Fib(1000) ไดหรอไม เพราะเหตใด

2. ก าหนดใหแถวล าดบ (array) A = { random values } จงเขยนโปรแกรมหาผลรวมของทงแถวล าดบ (สมมต

วาเรารความยาวของแถวล าดบ)

3. จงเขยนโปรแกรมหา Fibonacci number ตวท n (n คออนพตของโปรแกรม)

4. จงตอบสนๆ วาโปรแกรมตอไปนท าอะไร และเมอท างานเสรจแลวจะมของใน data stack เหลออยกช น และ

ชนบนสด (top of stack) มคาเปนเทาใด

ขอ ก ขอ ข ขอ ค ขอ ง ขอ จ

LIT 0

LIT 100

STORE

LOOP LIT 100

LOAD

DUP

LIT 10

SUB

IF END

ท ำงำน A

LIT 1

ADD

LIT 100

STORE

LIT 0

IF LOOP

END DROP

HALT

LD LIT 100

LIT 110

CALL F

HALT

F OVER

OVER

SUB

IF END

OVER

OVER

LOAD

LIT 200

STORE

LOAD

OVER

STORE

OVER

LIT 200

LOAD

SWAP

STORE

LIT 1

SUB

SWAP

LIT 1

ADD

SWAP

CALL F

EXIT

END DROP

DROP

EXIT

LIT 3

LIT 7

CALL F

HALT

F DUP

IF END

OVER

SWAP

LIT 1

SUB

CALL F

ADD

EXIT

END DROP

DROP

LIT 0

EXIT

LIT 5

CALL

F

HALT

F DUP

IF END

DUP

POW

SWAP

LIT 1

SUB

CALL F:

ADD

EXIT

END: DROP

LIT 0

EXIT

LIT 128

CALL F:

HALT

F: DUP

LIT 1

SUB

IF END:

LIT 1

SWAP

DIV2

CALL F:

ADD

EXIT

END: DROP

LIT 0

EXIT

Hint

ก. ตวแปร i อยทหนวยความจ าท address 100

ข. แถวล าดบ A มขนาด 11 ชอง (เปนจ านวนคเสมอ) เรมตนท address 100 และจบท address 110

หนวยความจ าท address 200 ใชเปน tmp

ค. ฟงกชนรบพารามเตอรทเปนจ านวนเตมบวกเทานน

ง. ค าสง POW จะ pop คาในสแตกออกมายกก าลงสอง และ push กลบเขาไปคน ฟงกชนรบพารามเตอร

ทเปนจ านวนเตมบวกเทานน

จ. ค าสง DIV2 จะ pop คาในสแตกออกมาหารสอง (ปดเศษทง เชน 7 หาร 2 เทากบ 3 เปนตน) และ

push กลบเขาไปคน ฟงกชนรบพารามเตอรทเปนจ านวนเตมบวกทมากกวา 0 เทานน

Page 14: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 117

5. จงตอบสนๆ วาโปรแกรมตอไปนท าอะไร

ก. LIT 10 CALL WHAT HALT WHAT DUP ADD DUP ADD EXIT

ข. LIT 10 CALL WHAT HALT WHAT LIT 0xFF XOR LIT 1 ADD EXIT

6. จงเตมฟงกชน SUM ใหสมบรณ SUM(n) = n + SUM(n - 1), SUM(0) = 0

LIT 10 CALL SUM HALT SUM DUP IF END ……… LIT 1 SUB CALL SUM END ………

EXIT

7. ฟงกชน WHAT ท าอะไรกบแถวล าดบ (แถวล าดบเรมตนจาก address 40)

LIT 40 CALL 5 HALT WHAT DUP LOAD IF END DUP LOAD SWAP LIT 1 ADD CALL WHAT ADD EXIT END DROP LIT 0 EXIT

8. ตอบสนๆ วาฟงกชน WHAT ท าอะไร

LIT A

CALL WHAT

HALT

WHAT DUP

IF END

DUP

LIT x80

AND(&)

IF ZERO

ONE LIT 1

SWAP

DUP

ADD(+)

CALL WHAT

ADD(+)

EXIT

ZERO LIT 0

SWAP

DUP

ADD(+)

CALL WHAT

ADD(+)

END EXIT

LIT A

LIT B

CALL WHAT

HALT

WHAT DUP

LOAD (@)

>R

SWAP

DUP

LOAD (@)

>R

SWAP

R>

SWAP

STORE (!)

R>

SWAP

STORE (!)

EXIT

Page 15: บทที่ 10 การโปรแกรมสแตกซีพียูpioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_10... · 2017-03-16 · stack ให้โหลดค่าคงที่ที่ต้องการใช้ใน

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 118

LIT M

LIT N

CALL WHAT

HALT

WHAT OVER

OVER

SUB(-)

LIT x80

AND(&)

IF CONT

DROP

EXIT

CONT SWAP

OVER

SUB(-)

SWAP

CALL WHAT

EXIT

LIT M

LIT N (M > N เสมอ) CALL WHAT

HALT

WHAT OVER

OVER

SUB(-)

IF RET

SWAP

OVER

SUB(-)

OVER

OVER

SUB(-)

LIT x80

AND(&)

IF NEXT

SWAP

NEXT CALL WHAT

EXIT

RET DROP

EXIT

9. จงเตมโปรแกรม Fibonacci ตอไปน ใหสมบรณ f(0) = 0, f(1) = 1, f(n) = f(n – 1) + f(n - 2)

LIT N

CALL FIB

HALT

FIB DUP

IF RET

…………

LIT 1

SUB(-)

…………

DUP

LIT 1

SUB(-)

CALL FIB

…………

LIT 2

SUB(-)

CALL FIB

…………

RET EXIT

รายการอางอง

[1] Philip Koopman, Jr., Stack Computers: the new wave, reprinted and distributed by Mountain View

Press, 1989.

[2] ชชวทย อาภรณเทวญ, การออกแบบ Stack CPU ดวยภาษา Verilog เพอสงเคราะหบน FPGA, เซมคอน

ดกเตอร อเลกทรอนกส ฉบบท 316 และ 317 (พ.ค.-ม.ย. 2551).