Page 1 of 1

ซีพียูทำงานอย่างไร (2) - 1001

Posted: 17 Oct 2014, 16:56
by brid.siriwan
ซีพียูทำงานอย่างไร (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