วันพฤหัสบดีที่ 20 กันยายน พ.ศ. 2555

ชุดคำสั่งทางคณิตศาสตร์

ชุดคำสั่งทางคณิตศาสตร์

      คำสั่งทางคณิตศาสตร์ได้แก่คำสั่ง การบวกลบคูณ และ หาร การบวกมี 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) มาช่วยในการทำคำสั่ง
 
กระบวณการทำางานทางคณิตศาสตร์ของ ALU 
      
        กระบวนการทำงานทางคณิตศาสตร์ของ ALU จะเป็นการประมวลผลที่สำคัญของ CPU จะมีการทำงานในภาค ALU โดยนำข้อมูลซึ่งอาจจะมาจากภายนอก CPU หรือ ภายใน CPU ก็ได้มาประมวลผล ดังบล็อคไดอะแกรม
 
บล็อคไดอะแกรมการทำงานทางคณิตศาสตร์ของ ALU

       การบวก ลบ AND OR XOR และเปรียบเทียบข้อมูล 8 บิท 2 จำนวนซึ่งข้อมูลจำนวนหนึ่งต้องมาจาก Reg. A เสมอส่วนข้อมูลอีกตัวหนึ่งอาจมาจากคำสั่งทันที หรือมาจากรีจิสเตอร์ต่างๆ ภายใน CPU หรือมาจากหน่วยความจำภายนอก ด้วยวิธีการอ้างถึงหน่วยความจำแบบต่างๆ ข้อมูลทั้งสองตัวนี้จะมากระทำกันภายในภาค ALU แล้วผลลัพธ์ของการกระทำจะกลับไปสู่ Reg. A พร้อมทั้งสถานะต่างๆ ของผลลัพธ์ จะแสดงที่แฟลก ดังแสดงตัวอย่างการทำงานทางคณิตศาสตร์ผ่านบล็อกไดอะแกรมต่างๆ ด้วยคำสั่งการบวก ADD A,06H ดังรูป

แสดงการทำงานทางคณิตศาสตร์ของ ALU
รีจิสเตอร์แฟลก (FLAG)

        รีจิสเตอร์แฟลก ใน 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 บิท
        ถ้าข้อมูลใน Reg. A มีข้อมูล 77H หรื อ119 (ฐาน 10) เมื่อใช้คำสั่ง SLA A จะเท่ากับ คูณ 2 ได้ผลลัพธ์คือ EEH หรือ 238(ฐาน10) ดังแสดงในรูป
แสดงการคูณเลขด้วย 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 บิท
 

1 ความคิดเห็น: