ซีพียูทำงานอย่างไร (2) - 1001
เรามาลองเล่นซีพียูจำลองกันที่ www.cp.eng.chula.ac.th/~piak/pro ject/cpu1001.htm ผมเล่าไว้ถึงตอนที่เรากำลังเขียนโปรแกรมเพื่อสั่งให้ซีพียูทำงานเพื่อบวกเลขสองตัวเข้าด้วยกัน
เรื่องนี้เป็นเรื่องต่อเนื่องจากเมื่อสองอาทิตย์ที่แล้ว เรามาลองเล่นซีพียูจำลองกันที่ www.cp.eng.chula.ac.th/~piak/pro ject/cpu1001.htm ผมเล่าไว้ถึงตอนที่เรากำลังเขียนโปรแกรมเพื่อสั่งให้ซีพียูทำงานเพื่อบวกเลขสองตัวเข้าด้วยกัน ดังนี้ (ขวามือเป็นรหัสคำสั่ง ตัดปะเข้าซีพียูจำลองเลย)
mov r1 1,1
add r1 2,2
put r3 3,3
ซึ่งเมื่อเราสั่งให้โปรแกรมทำงาน จะได้ผลลัพธ์ออกมา แต่ถ้าสังเกตดูจะพบว่ามีแต่เลขศูนย์ไม่มีการเปลี่ยนแปลง เพราะเรายังไม่ได้ให้เลขตั้งต้น เราสามารถเขียนโปรแกรมเพิ่มเพื่อใส่เลข 10 ที่ช่อง 1 และ 20 ที่ช่อง 2 ดังนี้
mvi 10 4,10
put 1 3,1
mvi 20 4,20
put 2 3,2
mov r1 1,1
add r1 2,2
put r3 3,3
คำสั่ง mvi จะเอาเลข (เช่น 10 ตามตัวอย่าง) ไปใส่ไว้ในกระดาษทด แล้ว put 1 เพื่อเอาไปเก็บที่ช่อง 1 ให้รหัส 4 หมายถึง mvi ให้คุณผู้อ่านลองกรอกโปรแกรมดังนี้
“4,10,3,1,4,20,3,2,1,1,2,2,3,3,0“ (เลข 0 ข้างท้ายสั่งให้ซีพียูหยุดการทำงาน) แล้วลองใหม่อีกครั้ง ท่านก็จะได้คำตอบตามต้องการ สังเกตช่องเก็บ 3 มีค่า 30 อยู่
เรามาทำโปรแกรมที่สองกันเถอะ โจทย์คือ เราอยากคูณเลขสองตัว แต่เราไม่มีคำสั่งคูณ เราต้องใช้วิธีบวกซ้ำ ๆ กัน เช่น เอา m คูณ n เราใช้วิธีบวก m ซ้ำ ๆ กัน n ครั้ง ดังนี้ ให้ช่อง 1 เก็บ m ช่อง 2 เก็บ n ช่อง 3 เก็บผล จะได้
สี่บรรทัดแรกใส่เลขทั้งสองในช่องเก็บ “mvi 0” ลบกระดาษทด จากนั้น “eqz r2” ทดสอบว่า ค่าในช่อง 2 เป็นศูนย์หรือไม่ จะได้ผลเป็นค่าจริง/เท็จ ซึ่งนำไปใช้ในคำสั่งถัดไป “jt exit” จะกระโดดไปบรรทัดที่ติดป้าย “exit” ไว้ ถ้าการทดสอบเป็นจริง แต่ถ้าการทดสอบไม่เป็นจริง จะเริ่มทำต่อที่บรรทัด “add r1” บวก m ซ้ำ ๆ กับกระดาษทด ตามด้วย “dec r2” ให้ลดค่า n ทีละหนึ่ง จากนั้นวนซ้ำกลับไปที่บรรทัด “loop” โดยคำสั่งกระโดด “jmp loop” ผลที่ได้คือ การบวก m ซ้ำ ๆ โดยเก็บผลในกระดาษทด จำนวน n ครั้ง เพราะ n ลดไปรอบละหนึ่งในที่สุดจะเป็นศูนย์ แล้วกระโดดออกมา “put r3” เอาผลไปเก็บในช่อง 3 เราให้รหัสกับคำสั่งที่เพิ่มมา 4 คำสั่งดังนี้ 5 eqz, 6 jt, 7 dec, 8 jmp ในการเข้ารหัส ให้สังเกตว่า คำสั่งแต่ละบรรทัดมีเลขที่ของมัน เริ่มจาก 0 ผมจะเขียนเลขที่อยู่ในคอลัมน์ซ้ายมือหลังคำสั่งนะครับ ในการเข้ารหัส ขอให้สังเกตว่า คำสั่ง jt และ jmp ต้องใส่เลขที่บรรทัดเป็นตัวประกอบลงไป คือ 6,10 และ 8,5 นั่นเอง
รหัสโปรแกรมเป็นดังนี้ “4,4,3,1,4,3,3,2,4,0,5,2,6,10,2,1,7,2,8,5,3,3,0” ลอง “รัน” โปรแกรมนี้ในเบราว์เซอร์ดู เราเอา 4 คูณกับ 3 ขอให้สังเกตว่า ทำงานจนเสร็จ ต้องทำไปกี่คำสั่ง?
ถ้าท่านผู้อ่านตามมาถึงตอนนี้ และได้“รัน” โปรแกรมดูแล้ว คงจะตอบตัวเองได้ว่า ซีพียูทำงานได้อย่างไร ซีพียูที่เรากำลังเล่นอยู่นี้มีองค์ประกอบแทบครบทุกอย่างของซีพียูจริง ๆ ก่อนจากกัน ขอฝากการบ้านให้ท่านลองคิดและเขียนดู โปรแกรมคูณของเราไม่ดีนัก เพราะยิ่งบังคับให้คูณใหม่ยิ่งวนซ้ำมาก ท่านหาวิธีที่เร็วกว่านี้ได้ไหม ตอนเด็ก ๆ ผมเล่นคูณเลขโดยวิธีเบิ้ลตัวตั้งแล้วหารสองตัวคูณ จะแสดงตัวอย่างให้ดู เช่น จะทำ 35x24 จะหาคำตอบได้โดย เบิ้ลตัวตั้ง 35x2=70 หารสองตัวคูณ 24/2=12 คำตอบคือ 70x12=840
แนวความคิดนี้จะทำให้เรามีวิธีคูณที่เร็วกว่าเดิมมาก ท่านลองคิดดูนะครับ แล้วลองเขียนโปรแกรมดู ผมให้คำสั่งเพิ่มอีกหนึ่งคำสั่ง คือ “หารสอง” ด้วยการ shr (เลื่อนขวา, รหัส 9) จะเอาค่าในกระดาษทดหารด้วยสอง
ขอให้สนุกครับ ส่งคำตอบที่คุณภูมิใจมาให้ผมได้ที่ prabhas.c@chula.ac.th โดยจั่วหัวว่า “1001” ผมจะมีรางวัลให้กับคำตอบที่ถูกใจ สัปดาห์หน้าจะเฉลยครับ.
ประภาส จงสถิตย์วัฒนา
ภาควิชาวิศวกรรมคอมพิวเตอร์
จุฬาลงกรณ์มหาวิทยาลัย
ที่มา เดลินิวส์
วันที่ 17 ตุลาคม 2557
- Board index การใช้งานบอร์ด และข่าวสาร ERP ไทย / PlanetOne ERP / งานบัญชี / Linux แจ้งข่าว ไทย ERP และข่าวอื่นๆที่น่าสนใจ
ซีพียูทำงานอย่างไร (2) - 1001
-
- Posts: 3942
- Joined: 05 Apr 2013, 08:47
Return to “แจ้งข่าว ไทย ERP และข่าวอื่นๆที่น่าสนใจ”
Jump to
- การใช้งานบอร์ด และข่าวสาร ERP ไทย / PlanetOne ERP / งานบัญชี / Linux
- ↳ กฏการใช้บอร์ด
- ↳ แจ้งข่าว ไทย ERP และข่าวอื่นๆที่น่าสนใจ
- คำถาม คำตอบเกี่ยวกับระบบ ไทย ERP: AdvanceBusinessSystem - PlanetOne และ ERP ระบบบัญชี
- ↳ ข้อมูลหลัก (Master Data)
- ↳ ระบบสินค้าคงคลัง (Inventory)
- ↳ ระบบบัญชีเจ้าหนี้ (Account Payable)
- ↳ ระบบบัญชีลูกหนี้ (Account Receivable)
- ↳ ระบบขาย (Sales System)
- ↳ ระบบจัดซื้อ (Purchasing System)
- ↳ ระบบบัญชีทั่วไป (General Ledger and Financial Statement)
- ↳ ระบบผลิตและวางแผนการผลิต (Manufacturing / Shop Floor Control / Production Planning)
- ↳ ระบบบริหารงานบุคคล (Human Resource Management / HRM)
- ↳ ระบบบริหารสินทรัพย์ (Assets Management)
- ↳ ระบบลูกค้าสัมพันธ์ และบริการ (CRM / Service Center / Call Center)
- ↳ ระบบต้นทุนสินค้า (Product / Job Costing)
- ↳ หัวข้อทั่วไป
- การติดตั้ง ใช้งาน Linux, OSX และ OpenSource Softwares
- ↳ การใช้งาน PostgreSQL
- ↳ การใช้งาน Java และ JVM
- ↳ การใช้งาน Dart
- ↳ การใช้งาน Linux
- ↳ การใช้งาน Mac และ OSX
- AdvanceBusinessSystem Developer Forum
- ↳ Java Programming Techinics
- ↳ ABS Developer Exchange
- ↳ การ admin ระบบ