บทที่ 10...
Post on 25-Dec-2019
6 Views
Preview:
TRANSCRIPT
เอกสารค าสอนรายวชา 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 เลย
เอกสารค าสอนรายวชา 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 ชน
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 106
การท า if-then
โครงสรางของโปรแกรมแบบ if-then แสดงในรปท 10.1
รปท 10.1 โครงสรางโปรแกรมแบบ if-then
ถากลบเงอนไขกอน จะท าใหโปรแกรมสนลง เชน ถาจรงให push(คาทไมใช 0) แตถาไมจรงให push(0) ในบาง
กรณจะเขยนโปรแกรมงายกวามาก และท าใหโปรแกรมสนลงดวย ดรปท 10.2
รปท 10.2 โครงสรางโปรแกรมแบบ if-then (แบบกลบเงอนไข)
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 107
การท า if-else
โครงสรางของโปรแกรมแบบ if-else แบบงายๆ ตรงไปตรงมา แสดงในรปท 10.3 ลองเขยนอกแบบโปรแกรมจะ
สนกวาดงรปท 10.4
รปท 10.3 โครงสรางโปรแกรมแบบ if-else (แบบยาว)
รปท 10.4 โครงสรางโปรแกรมแบบ if-else (แบบสน)
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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)
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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)
เอกสารค าสอนรายวชา 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 ยงไง
เอกสารค าสอนรายวชา 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 บตจะท าอยางไร
เอกสารค าสอนรายวชา 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 เทานน
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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).
top related