คำสั่งทางคณิตศาสตร์ได้แก่คำสั่ง การบวกลบคูณ และ หาร การบวกมี 2 ชนิดคือ ADD A,s
และ ADC A,s สำหรับ ADD A,s เป็นการบวกข้อมูลใน Reg. A
กับข้อมูลของตัวกระทำอีกตัวหนึ่ง แล้วผลลัพธ์จากการบวกถูกบรรจุไว้ใน Reg. A ส่วน
ADC A,s จะมีแฟลกตัวทดบวกเข้ามาด้วยางด้าน LSB และผลลัพทธ์จากการบวกถูกบรรจุไว้ใน
Reg. A เช่นกัน
คำสั่งการลบมี 2 ชนิดคือ SUB s และ SBC A,s สำหรับ SUB s เป็นการบลข้อมูลใน Reg. A กับข้อมูลของตัวกระทำอีกตัวหนึ่ง แล้วผลลัพธ์จากการบวกถูกบรรจุไว้ใน Reg. A
คำสั่งการคูณและการหาร จะเป็นการคูณและหารด้วย 2 โดยการใช้คำสั่งการเลื่อน (Shift Instruction) มาช่วยในการทำคำสั่ง
คำสั่งการลบมี 2 ชนิดคือ SUB s และ SBC A,s สำหรับ SUB s เป็นการบลข้อมูลใน Reg. A กับข้อมูลของตัวกระทำอีกตัวหนึ่ง แล้วผลลัพธ์จากการบวกถูกบรรจุไว้ใน Reg. A
คำสั่งการคูณและการหาร จะเป็นการคูณและหารด้วย 2 โดยการใช้คำสั่งการเลื่อน (Shift Instruction) มาช่วยในการทำคำสั่ง
กระบวณการทำางานทางคณิตศาสตร์ของ ALU
กระบวนการทำงานทางคณิตศาสตร์ของ ALU จะเป็นการประมวลผลที่สำคัญของ CPU
จะมีการทำงานในภาค ALU โดยนำข้อมูลซึ่งอาจจะมาจากภายนอก CPU หรือ ภายใน CPU
ก็ได้มาประมวลผล ดังบล็อคไดอะแกรม
บล็อคไดอะแกรมการทำงานทางคณิตศาสตร์ของ ALU
การบวก ลบ AND OR XOR และเปรียบเทียบข้อมูล 8 บิท 2 จำนวนซึ่งข้อมูลจำนวนหนึ่งต้องมาจาก Reg. A เสมอส่วนข้อมูลอีกตัวหนึ่งอาจมาจากคำสั่งทันที หรือมาจากรีจิสเตอร์ต่างๆ ภายใน CPU หรือมาจากหน่วยความจำภายนอก ด้วยวิธีการอ้างถึงหน่วยความจำแบบต่างๆ ข้อมูลทั้งสองตัวนี้จะมากระทำกันภายในภาค ALU แล้วผลลัพธ์ของการกระทำจะกลับไปสู่ Reg. A พร้อมทั้งสถานะต่างๆ ของผลลัพธ์ จะแสดงที่แฟลก ดังแสดงตัวอย่างการทำงานทางคณิตศาสตร์ผ่านบล็อกไดอะแกรมต่างๆ ด้วยคำสั่งการบวก ADD A,06H ดังรูป
![]() |
แสดงการทำงานทางคณิตศาสตร์ของ ALU |
รีจิสเตอร์แฟลก ใน CPU เบอร์ Z-80 จะประกอบด้วยแฟลกจำนวน 6
แฟลกและมีบิที่ไม่ได้แสดงเป็นแฟลกอีก 2 บิท รวมเป็น 8 บิท เพื่อประกอบเป็น Reg. F
ส่วนของแฟลกแต่ละบิทสามารถที่จะเซทหรือรีเซท ตามการประทำของคำสั่งที่ CPU
กำลังทำงาน นอกจากนี้ CPU ยังสามารถใช้ตรวจสอบแฟลกเพื่อกระทำเงื่อนไขต่างๆ
ลักษณะการใช้แฟลกจะใช้ตัวอักษรย่อแทนแฟลก ดังนี้
หน้าที่ของรีจิสเตอร์
1. แฟลกตัวทด (C : Carry flag)
แฟลกนี้เป็นบิทที่ใช้สำหรับทดจากข้อมูลใน Reg. A เช่นเมื่อมีการบวกข้อมูล 8 บิท
ผลบวกอาจเลยเป็น 9 บิท บิทที่เกินเลยจะทดเข้าไปเก็บไว้ที่บิท C (Carry flag)
ในทำนองเดียวกัน ถ้า CPU กระทำคำสั่งลบ
และมีการขอยืมค่าของแฟลกตัวนี้ก็จะได้การเซทให้มีค่าเป็น “ 1”
เช่นกัน 2. แฟลกศูนย์ (Z :Zero flag )
ในแฟลกนี้จะได้รับการเซทให้มีค่า = “1” ถ้าผลลัพธ์ของข้อมูลในReg. A มีค่าเป็น “0”
นอกเหนือจากนี้แล้ว จะมีค่าเป็น “1” 3. แฟลกเครื่องหมาย (S
: Sign flag ) ลักษณะของแฟลกนี้มีประโยชน์รบอกการกระทำของ CPU
ว่าผลลัพธ์ที่เกิดขึ้นมีค่าเป็นบวก หรือ ลบ โดยถ้าบิทที่ D7 = “1” Sign flag
จะมีค่า เป็น “1” และถ้าบิทที่ D7 = “0” Sign flag จะมีค่า เป็น
“0” 4. แฟลกพาริตี้/ค่าเกิน ( P/V : Parity/ Over flow
flag) มีประโยชน์2ประการ
ประการแรกใช้ตรวจสอบผลลัพธ์ของคำสั่งว่ามีพาริตี้คู่ หรือ คี่ แฟล็กจะมีค่าเป็น “1”
หากพาริตี้คู่ และมีค่า “0”พาริตี้ คี่ เช่นหากผลลัพธ์ของคำสั่งเป็น 00101011
ซึ่งมีบิทค่า “1” ทั้งหมดรวมกัน 4 บิท พาริตี้จึงเป็นคู่
ดังนั้นดังนั้นแฟล็กพาริตี้/โอเวอร์โฟล์ จะมีค่าเป็น “1” แต่หากผลลัพธ์เป็น
00111101 ซึ่งมีบิทค่า “1” ทั้งหมดรวมกัน 5 บิท พาริตี้เป็นคี่ ดังนั้น
ดังนั้นแฟล็กพาริตี้/โอเวอร์โฟล์ จะมีค่าเป็น “0” ประโยชน์ประการที่2
ของแฟล็กนี้คือ ใช้ตรวจสอบว่าผลลัพธ์เลขคณิตทูว์คอมพลีเมนท์ ไม่เกิน +127
และไม่ต่ำกว่า -128 หากผลลัพธ์เกินย่านดังกล่าวนี้ แฟล็กพาริตี้/โอเวอร์โฟล์
จะมีค่าเป็น “1” 5. แฟลกตัวทดช่วย (H: Half carry) แฟลกนี้จะเป็นบิทที่ทำหน้าเป็นตัวทดหรือตัวยืมของตัวเลข BCD
แฟลกนี้จะมีค่าเป็น “1” หากมีการทดจากบิทที่3 ไปยังบิทที่ 4 ของการบวกเลข BCD
และมีค่าเป็น “0” หากไม่มีการทด ในการลบก็เช่นเดียวกันหากหลักต่ำบิทที่ 3
ยืมค่าจากบบิทที่ 4 แฟลกนี้จะมีค่าเป็น “1” แต่หารไม่มีการยืมแฟลกนี้จะมีค่าเป็น
“0” 6. แฟลกการลบ (N: subtract Flag)
เนื่องจากในการกระทำทางคณิตศาสตร์ของตัวเลข BCD
เพื่อจะได้มีการรับรู้ในการปรับค่าเมื่อกระทำ DAA ได้ถูกต้อง
แฟลกนี้จะเป็นตัวบอกว่าคำสั่งที่ถูกกระทำเป็นการบวกหรือลบ
โดยถ้ากระทำคำสั่งลบแฟลกบิทนี้จะได้รับการเซทให้มีค่าเป็น “1”
![]() |
การบวกข้อมูล |
![]() |
การลบข้อมูล |
การคูณเลขขนาด 8 บิท จะใช้คำสั่ง SLA (Shift Left Arithmatic) มาทำการคูณ คำสั่ง
SLA จะเป็นการคูณด้วย 2 หากมีการโอเวอร์โฟล์ (เกินค่า 256 ฐาน 10 ) แฟล็กทด
ก็จะถูกเซ็ทให้เป็น "1"
![]() |
แสดงคำสั่ง SLA |
ตัวอย่าง การคูณเลขขนาด 8 บิท
ข้อมูลใน Reg. A มีข้อมูล 1BH หรือ 27 (ฐาน 10) เมื่อใช้คำสั่ง SLA A จะเท่ากับคูณ
2 ได้ผลลัพธ์คือ 36H หรือ 54 (ฐาน 10) ดังแสดงในรูป
![]() |
แสดงการคูณแลขขนาด 8 บิท |
![]() |
แสดงการคูณเลขด้วย 2 |
ถ้าข้อมูลใน Reg. A มีข้อมูลเป็น 9DH หรือ 157 (ฐาน 10) เมื่อใช้คำสั่ง SLA A
จะเท่ากับคูณ 2 ได้ผลลัพธ์คือ 3AH หรือ 58 (ฐาน 10) ซึ่งผลที่ได้รับมิใช่ 2
เท่าเดิม 157 (ฐาน 10) เปลี่ยนไปเป็น 58 (ฐาน 10) ทั้งนี้เพราะค่า 157 มาก 128
ทำให้เมื่อคูณด้วย 2 ค่าที่ได้จึงมากกว่า 256 (ฐาน 10) ซึ่งเป็นค่าสูงสุดที่ 1
ไบต์จะมีได้ เมื่อกรณีนี้เกิดขึ้น แฟล็กทดจะถูกเซ็ทเป็น "1"
เพื่อบอกให้รู้ว่ามีโอเวอร์โฟล์ ดังแสดงในรูป
![]() |
แสดงการคูณแลขขนาด 8 บิทเกิดโอเวอร์โฟล์ |
การหารเลขขนาด 8 บิท
การหารเลขขนาด 8 บิท จะใช้คำสั่ง SRA (Shift Right Arithmatic) มาทำาการหาร คำสั่ง
SRA จะเป็นการหารด้วย 2 โดยเศษจะส่งไปเก็บในแฟล็กทดการหารนี้ค่าใน Reg.
หรือหน่วยควมจะจะเป็นเลขทูว์คอมพลีเมนท์ (2's Complement)
![]() |
แสดงคำสั่ง SRA |
ตัวอย่าง การหารเลขขนาด 8 บิท
ข้อมูลใน Reg. A มีข้อมูล 1FH หรือ 31 (ฐาน 10) เมื่อใช้คำสั่ง SRA A
จะเท่ากับการหาร 2 ได้ผลลัพธ์คือ 0FH หรือ 15 (ฐาน 10) มี Carry FLAG=1 (เศษ)
ดังแสดงในรูป
![]() |
แสดงการหารเลขขนาด 8 บิท |
ขอบคุณมากครับ มีประโยชน์มากๆครับ
ตอบลบ