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

การประยุกต์ใช้งาน

การประยุกต์ใช้งาน

       ระบบไมโครคอมพิวเตอร์จะสามารถทำงานได้ จะต้องประกอบด้วย 2 ส่วนคือฮาร์ดแวร์ และ ซอฟต์แวร์ ซึ่งความหมายของ ฮาร์ดแวร์คอมพิวเตอร์คือ อุปกรณ์อิเล็กทรอนิกส์ วงจรลอจิกและชิ้นส่วนอุปกรณ์ต่างๆ ที่ประกอบกันเป็นเครื่องคอมพิวเตอร์ ส่วนซอฟต์แวร์หมายถึง โปรแกรมที่จะทำให้เครื่องคอมพิวเตอร์สามารถทำงานได้ ซึ่งซอฟต์แวร์นี้อาจจะอยู่ในรูปต่างๆ เช่น รหัสเลขฐานสองที่อยู่ในหน่วยความจำ ภาษาระดับสูง หรืออาจรวมทั้งคู่มือ และเอกสารประกอบต่างๆ ด้วย ในบทนี้จะได้กล่าวถึงการเขียนซอฟต์แวร์ที่เป็นโปรแกรมภาษาแอสแซมบลี้เพื่อเป็นตัวอย่างในการนำระบบไมโครคอมพิวเตอร์ ไปประยุกต์ใช้งาน เช่นการเขียนโปรแกรมไฟวิ่งออก LED หรือการเขียนโปรแกรมเรียกใช้โปรแกรมย่อยในระบบนำมาใช้งาน สามารถแสดงการเขียนโปรแกรมดังนี้
 
การเรียกใช้โปรแกรมย่อยจากระบบ (System CALL)
            ตัวอย่างการเรียกใช้ Subroutine Sound ใน Monitor ของเครื่อง เพื่อกำเนิดเสียงตั้งแต่ความถี่ต่ำ ไปยังความถี่สูง ซึ่งมี Subroutine สำหรับกำเนิดเสียงไว้ให้แล้ว โดยการเรียกใช้ผ่าน System Call ซึ่งมีวิธีการใช้ดังนี้
                 - ใส่ Code 01H ที่ Reg. A
                 - กำหนดค่า Reg. B = ระดับความดังของเสียง
                                    C = ระดับความถี่ของเสียง
                                    HL = ช่วงความยาวในการกำเนิดเสียง
                 - ใช้คำสั่ง RST 10H เพื่อจะใช้เรียก Subroutine Sound
โปรแกรมต่อไปนี้เป็นตัวอย่างการเรียกใช้ Subroutine Sound
 
 
 
 
การเขียนโปรแกรมไฟวิ่งออก LED
 
หลักการของไฟวิ่งประกอบด้วยตัวแปร 2 ตัวคือ
1. จังหวะเวลา
2. รูปแบบการติดตับของไฟ
ถ้าสมมุตว่ามีหลอดไฟอยู่ 8 ดวง และต้องการให้ติดทีละดวงเรียงจากขวาไปซ้ายดังรูป
 
      
          เราสามารถกำหนดลักษณะการวิ่งดังกล่าว ในรูปแบบข้อมูลของไมโครโปรเซสเซอร์ได้ โดยกำหนดให้ดวงที่ติดสว่างเท่ากับ "1" และดวงที่ดับเท่ากับ "0" และทำการส่งข้อมูลที่กำหนดไว้นี้ ออกมาทาง Port โดยหน่วงเวลาในการส่งให้เท่าๆ กัน เราก็จะได้ OUTPUT ที่สามารถจะนำไปซับหลอดไฟให้วิ่งได้ ลักษณะข้อมูลจะเป็นดังนี้
 
 
      จากนั้น เราก็สามารถทำโปรแกรมเพื่อกำหนดให้ไมโครโปรเซสเซอร์ส่งข้อมูลเหล่านี้ ออกทาง Port output บนหลักการนี้จะเห็นได้ว่า ไฟวิ่งในระบบไมโครโปรเซสเซอร์นี้มีข้อเด่นดังต่อไปนี้

     1. เราสามารถเปลี่ยนรูปแบบของไฟวิ่งเป็นอย่างไรก็ได้ โดยเพียงแต่เปลี่ยนชุดข้อมูลอันนี้เท่านั้น
     2. ไฟวิ่งทั่วๆ ไป จะมีการครบรอบตามที่กำหนดไว้แน่นอน แต่ไฟวิ่งในไมโครโปรเซสเซอร์นี้ สามารถให้รอบมีความยาวได้อย่างมากมาย เช่น ในชุดข้อมูลที่กล่าวมาแล้วนี้เรายังสามารถเขียนโปรแกรมให้หลอดไฟวิ่งจากขวามาซ้ายต่อไปได้อีก
    3. ความเร็วของไฟวิ่งนี้ เราสามารถจะกำหนดได้โดยเพียงแต่กำหนดระยะในการหน่วงเวลาของข้อมูลที่จะส่งออกไปเท่านั้นเอง
    4. ลักษณะเด่นทั้งหมดที่กล่าวนี้ เราสามารถทำกรเปลี่ยนแปลงได้ โดยการเปลี่ยนแปลงที่โปรแกรม (SOFTWARE) เท่านั้น ซึ่งสามารถทำได้อย่างรวดเร็วและลงทุนลงแรงน้อยกว่า
 
ตัวอย่างโปรแกรมไฟวิ่งออก LED โดยต้องการให้วิ่งจากขวามาซ้าย สามารถแสดงให้เห็นได้ดังนี้
 

 

กลุ่มคำสั่งการควบคุมโปรแกรม

กลุ่มคำสั่งการควบคุมโปรแกรม

        กลุ่มคำสั่งการควบคุมโปรแกรม เช่น คำสั่ง Jump, Call และ Return เป็นชุดคำสั่งที่สั่งให้ CPU แยก (Branch) ไปทำงานตามคำสั่งซึ่งเขียนไว้ ที่ตำแหน่งอื่น ของหน่วยความจำแทนที่จะไปตามลำดับคำสั่ง ซึ่งใน CPU เบอร์ Z-80 มี Reg. ตัวหนึ่ง เรียกว่า Program Counter (Reg. PC) ซึ่งทำหน้าที่เก็บตำแหน่งของคำสั่งถัดไปจากตำแหน่งคำสั่งที่กำลังปฏิบัติอยู่ เพื่อลำดับการทำงานของโปรแกรมได้ถูกต้อง และการนำค่าในแฟลกมาใช้เป็นเงื่อนไข ก็เป็นการควบคุมโปรแกรมด้วย ซึ่งกลุ่มคำสั่งการควบคุมโปรแกรมมีดังนี้
 
- คำสั่งกระโดดแบบไม่มีเงื่อนไข
- คำสั่งกระโดดแบบมีเงื่อนไข
- คำสั่งที่ใช้ควบคุม Loop
- คำสั่งเปรียบเทียบ
- คำสั่งควบคุมโปรแกรมย่อย




คำสั่งที่ใช้ควบคุม Loop

       ตามปกติ CPU Z-80 จะทำงานตามคำสั่งที่เขียนในโปรแกรมทีละคำสั่งเรียงลำดับกันไป แต่ในบางครั้งเราต้องการให้ CPU ทำงานอย่างหนึ่งซ้ำกันหลายๆ ครั้ง CPU สามารถทำงานดังกล่าวได้ ซึ่งขึ้นอยู่กับเงื่อนไข ที่ผู้เขียนโปรแกรมตั้งไว้ โดยที่ไม่ต้องเขียนโปรแกรมซ้ำกันหลายๆ ครั้ง ตามเงื่อนไขที่ตั้งไว้ การที่ CPU มีความสามารถดังกล่าวนี้เนื่อง จากมีคำสั่งเกี่ยวกับ "การกระโดด" และการตัดสินใจ" นั่นเอง แสดงให้เห็นการทำงานของคำสั่งควบคุม Loop ดังตัวอย่าง
 
แสดงการทำคำสั่ง JP C,05H
ตัวอย่างการควบคุม Loop1 และ Loop2



 
คำสั่งเปรียบเทียบ

         การเปรียบเทียบข้อมูลสามารถทำได้โดยนำข้อมูล 2 ข้อมูลมาคำนวนทางคณิตศาสตร์ หรือลอจิก และตัดสินผลการเเปรียบเทียบจากสภาพการเปลี่ยนแปลงของแฟลก
         ตัวอย่างเช่น ถ้าอยากทราบว่า x เท่ากับ y หรือไม่ ก็ให้ทำการคำนวณ โดยใช้ x-y ถ้าคำตอบเป็น "0" แฟลกศูนย์จะมีค่า="1" ซึ่งแสดงว่า ตัวเลข ทั้งสองเท่ากัน ถ้าแฟลกศูนย์มีค่าเป็น "0" จะแสดงว่า มีค่าไม่เท่ากัน ดังนั้น การเปรียบเทียบข้อมูลจะประกอบด้วย 2 ขั้นตอน คือ การคำนวณ และการตัดสินใจ
         ใน CPU เบอร์ Z-80 มีคำสั่งเกี่ยวกับการเปรียบเทียบข้อมูลดังนี้
         CP s ซึ่ง s สามารถที่เป็น Reg. (B, C, D, E, H, L) หรือเป็นข้อมูลโดยตรงก็ได้เมื่อทำคำสั่ง CP s จะมีการนำค่า s ไปลบจากค่าใน Reg. A (โดย Reg. A ไม่เปลี่ยนแปลง ) และจะมีผลต่อแฟลกด้วย ดังตัวอย่างเช่น ต้องการเปรียบเทียบข้อมูลใน Reg. A กับ Reg. B สามารถทำได้โดยใช้คำสั่ง CP B ซึ่งจะมีผล คือ
Registor
Flag
A=B
A>B
A<B
Z=1, C=0
Z=0, C=0
Z=0, C=1
 
ตัวอย่างคำสั่งเปรียบเทียบแสดงได้ดังนี้
       คำสั่ง CP B (ในกรณีที่ Reg. A= Reg B)
       คำสั่ง CP B มีรหัสเฮกซ์=B8H เมื่อ CPU Z-80 พบคำสั่ง B8H CPU จะทราบว่าให้นำข้อมูลใน Reg. B มาเปรียบเทียบกับ Reg. A ผลลัพธ์ที่ได้จะนำไปเก็บใน Reg. A พร้อมแสดงสถานะของแฟลกต่างๆ ด้วย แสดงการทำงานให้เห็นดังรูป
 
แสดงการทำคำสั่ง CP เมื่อรีสจิสเตอร์ A=B
คำสั่ง CP B (ในกรณีที่ Reg. A> Reg B)
         คำสั่ง CP B มีรหัสเฮกซ์=B8H เมื่อ CPU Z-80 พบคำสั่ง B8H CPU จะทราบว่าให้นำข้อมูลใน Reg. B มาเปรียบเทียบกับ Reg. A ผลลัพธ์ที่ได้จะนำไปเก็บใน Reg. A พร้อมแสดงสถานะของแฟลกต่างๆ ด้วย แสดงการทำงานให้เห็นดังรูป

แสดงการทำคำสั่ง CP เมื่อรีสจิสเตอร์ A>B

 
คำสั่ง CP B (ในกรณีที่ Reg. A< Reg B)
         คำสั่ง CP B มีรหัสเฮกซ์=B8H เมื่อ CPU Z-80 พบคำสั่ง B8H CPU จะทราบว่าให้นำข้อมูลใน Reg. B มาเปรียบเทียบกับ Reg. A ผลลัพธ์ที่ได้จะนำไปเก็บใน Reg. A พร้อมแสดงสถานะของแฟลกต่างๆ ด้วย แสดงการทำงานให้เห็นดังรูป
 
แสดงการทำคำสั่ง CP เมื่อรีสจิสเตอร์ A<B
 

 

กลุ่มคำสั่งเกี่ยวกับบิท

กลุ่มคำสั่งเกี่ยวกับบิท

         กลุ่มคำสั่งเกี่ยวบิทนี้ จะมีคำสั่งใช้อยู่ได้แก่ คำสั่งเซ็ท รีเซ็ท และคำสั่งย้ายข้อมูลแบบบิท คำสั่งเซ็ทเป็นการทำให้บิทใดบิทหนึ่งใน 8 บิท ของ Reg. ใน CPU หรือในหน่วยความจำตามตำแหน่งที่กำหนด ถูกระบุให้เป็น "1" และคำสั่ง รีเซ็ท จะถูกระบุให้เป็น "0" ส่วนคำสั่งการย้ายข้อมูลแบบบิท จะมีคำสั่งใช้อยู่ใด้แก่ คำสั่ง RLC, RRC, RL และ RR การย้ายข้อมูลแบบบิทจะกระทำ Reg. ของ CPU หรือข้อมูลในหน่วยความจำซึ่งบ่งด้วยค่าใน Reg. HL หรือ Reg IX, IY ดังมีการทำงานของกลุ่มคำสั่งเกี่ยวกับบิทดังนี้
 
การเซ็ต (SET BIT)
 
        ไมโครโปรเซสเซอร์ Z-80 มีคำสั่งเซ็ทบิท (SET BIT) อยู่ 80 คำสั่ง ซึ่งบิทในที่นี้หมายถึง บิทใดๆ ของไบท์ที่อยู่ในรีจิสเตอร์ต่างๆ หรือในหน่วยความจำโดยบิทขวาสุดเรียกบิท "0" และบิทซ้ายสุดเรียกว่า บิท 7
        คำสั่ง เซ็ทบิท จะเซ็ทบิทที่บ่งในคำสั่งให้เป็น "1" เสมอไม่ว่าเดิมบิทนั้นจะมีค่าเป็น "0" หรือ "1" ดังแสดงให้เห็นในรูป
 
แสดงคำสั่งการเซ็ทบิท (SET BIT )
การเคลียบิท
 
        ไมโครโปรเซสเซอร์ Z-80 มีคำสั่งเคลียบิท (CLEAR BIT) หรือ รีเซ็ทบิท (RESET BIT) อยู่ 80 คำสั่ง คำสั่งรีเซ็ทบิท จะทำหน้าที่รีเซ็ทบิทให้เป็น "0" ไม่ว่าเดิมบิทดังกล่าวจะมีค่า "0" หรือ "1" ดังแสดงให้เห็นในรูป
แสดงคำสั่งการ รีเซ็ทบิท (RESET BIT)
เทคนิคการโอนย้ายข้อมูลเป็นบิท

      การย้ายข้อมูลเป็นบิท ประกอบด้วยคำสั่งดังนี้

คำสั่ง RLC

        คำสั่ง RLC ย่อมาจาก Rotate Left Circular การทำงานตามคำสั่ง RLC r คือแต่ละบิทจะหมุนโดยเขียนทับบิทที่อยู่ทางซ้ายของตนเอง สำหรับ D7 จะเขียนทับ D0 และทับบิทในแฟล็กทดด้วย ดังแสดงในรูป
 
แสดงคำสั่ง RLC r
คำสั่ง RLC สามารถแสดงสถานะต่างๆ ของ FLAG ได้ดังนี้


 
ตัวอย่าง การทำคำสั่ง RLC ใน Reg A แสดงให้เห็นได้ดังรูป
 
แสดงคำสั่ง RLC A
คำสั่ง RRC

       คำสั่ง RRC r คือ แต่ละบิทจะถูกหมุนไปทางขวาหนึ่งตำแหน่ง สำหรับบิท D0 จะไปแทนที่บิท D7 แต่ละบิทในแฟล็กทด ดังแสดงในรูป


แสดงคำสั่ง RRC r
 คำสั่ง RRC r สามารถแสดงสถานะต่างๆ ของ FLAG ได้ดังนี้


ตัวอย่าง การทำคำสั่ง RRC ใน Reg. C แสดงให้เห็นได้ดังรูป


แสดงคำสั่ง RRC C
คำสั่ง RL r

          คำสั่ง RL r ย่อมาจาก Rotate Left การทำงานตามคำสั่ง RL r คือจะหมุนทุกบิทไปทางซ้ายผ่านแฟล็กทด ดังแสดงให้เห็นในรูป


แสดงคำสั่ง RL r
คำสั่ง RL r สามารถแสดงสถานะต่างๆ ของ FLAGE ได้ดังนี้


คำสั่ง RL r สามารถแสดงสถานะต่างๆ ของ FLAGE ได้ดังนี้


แสดงคำสั่ง RL A
คำสั่ง RR r

          คำสั่ง RR r ย่อมาจาก Rotate Right การทำงานตามคำสั่ง RR r คือจะหมุนทุกบิทไปทางซ้ายผ่านแฟล็กทด ดังแสดงให้เห็นในรูป


แสดงคำสั่ง RR r
คำสั่ง RR r สามารถแสดงสถานะต่างๆ ของ FLAGE ได้ดังนี้


ตัวอย่าง การทำคำสั่ง RR ใน Reg. E แสดงให้เห็นได้ดังรูป


แสดงคำสั่ง RR E
การเรียนรู้คำสั่งย้ายข้อมูลแบบบิท

       การเรียนรู้คำสั่งย้ายข้อมูลแบบบิท ตลอจนคำสั่งเซ็ทและรีเซ็ทบิท ซึ่งมีประโยชน์อย่างมาก เป็นต้นว่า ทำการตรวจสอบภาวะของบิทต่างๆ ของค่าไบท์ใน Reg. หรือหน่วยความจำ ตลอดจนสามารถนำไปใช้ในการทำเลขคณิต เช่นการคูณและการหารได้ด้วย
       คำสั่งที่กล่าวมานี้ ส่วนมากเป็นคำสั่งของ CPU เบอร์ Z-80 ที่นอกเหนือจากที่พบใน CPU เบอร์ 8080





กลุ่มคำสั่งทางลอจิก

กลุ่มคำสั่งทางลอจิก 

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


การเคลื่อนบิท
การสลับข้อมูล nibble

         การสลับข้อมูล nibble หรือการสลับข้อมูลขนาด 4 บิท ใน CPU เบอร์ Z-80 มีคำสั่งข้อมูลขนาด 4 บิท อยู่ 2 คำสั่งที่ทำหน้าที่สลับข้อมูลทีละ 4 บิท ซึ่งมีประโยชน์ทางเลขคณิตบีซีดี ได้แก่ RLD (Rotate Left Digit) และ RRD (Rotate Righ Digit) มีการสลับข้อมูลดังนี้  
 
คำสั่ง RLD


        คำสั่ง RLD ย่อมาจาก Rotate Left Digit จะหมนุนข้อมูลครั้งละครึ่งไบท์ไปทางซ้ายโดยทำงานร่วมกันระหว่างแอ็กคิวมูเงเตอร์และข้อมูลในหน่วยความจำซึ่งบ่งด้วยค่าในคู่รีจิสเตอร์ HL ดังแสดงในรูป
 
 
ตัวอย่างการทำงานของคำสั่ง RLD
 
แสดงการทำคำสั่ง RLD
คำสั่ง RRD
 
      คำสั่ง RRD ย่อมาจาก Rotate Right Digit จะหมนุนข้อมูลครั้งละครึ่งไบท์ไปทางขวา โดยทำงานร่วมกันระหว่างแอ็กคิวมูเลเตอร์และข้อมูลในหน่วยความจำซึ่งบ่งด้วยค่าในคู่รีจิสเตอร์ HL ดังแสดงในรูป
 
 
ตัวอย่างการทำงานของคำสั่ง RRD
 
แสดงการทำคำสั่ง RRD
 

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

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

      คำสั่งทางคณิตศาสตร์ได้แก่คำสั่ง การบวกลบคูณ และ หาร การบวกมี 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 บิท
 

กลุ่มคำสั่งการโอนย้ายข้อมูล

กลุ่มคำสั่งการโอนย้ายข้อมูล  
     การโอนย้ายข้อมูล คือ เป็นความสามารถที่สำคัญที่สุด การที่คอมพิวเตอร์จะสามารถประมวลผลได้รวดเร็วนั้น ก็ขึ้นอยู่กับความสามารถในการโอนย้ายข้อมูลนั่นเองการโอนย้ายข้อมูลใน CPU Z - 80 นั้น สามารถแบ่งออกได้เป็น 6 ชนิด คือ
1.การโอนย้ายข้อมูลระหว่างรีจิสเตอร์หรือ หน่วยความจำกับค่าคงที่
2. การโอนย้ายข้อมูลระหว่างรีจิสเตอร์ด้วยกัน
3. การโอนย้ายข้อมูลระหว่างรีจิสเตอร์ กับหน่วยความจำ
4. การโอนย้ายข้อมูลระหว่างหน่วยความจำตำแหน่งต่าง ๆ
5. การโอนย้ายข้อมูลระหว่างรีจีสเตอร์กับหน่วยอินพุท เอาท์พุท
6. การโอนย้ายข้อมูลระหว่างหน่วยความจำกับหน่วยอินพุท เอาท์พุท
 

ความหมายและชนิดของข้อมูลในไมโครโปรเซสเซอร์ Z-80

คำสั่งการ โอนย้ายข้อมูลระหว่างรีจิสเตอร์หรือหน่วยความจำกับค่าคงที่

คำสั่งการโอนย้ายข้อมูลระหว่างรีจิสเตอร์กับรีจิสเตอร์  
     ในการโอนย้ายข้อมูลระหว่างรีจิสเตอร์ภายใน CPU เบอร์ Z-80 นี้จะใช้คำสั่ง LD ทำการโอนย้าย ในคำสั่งต่างๆนั้นจะใช้ตัวกระทำ (Operand) 2 ตัว คือ ซอร์ท (Source) หมายถึง ตำแหน่งข้อมูลเดิมที่จะย้ายและตำแหน่งที่ข้อมูลจะย้ายไปเก็บหรือรับข้อมูลจะเรียกว่า "Destination" รูปแบบของคำสั่งกลุ่มนี้ คือ LD r , s
 
           r คือ รีจิสเตอร์ต่างๆของ CPU Z-80 ที่เป็นตัวรับข้อมูล ( Destination )
           s คือ รีจิสเตอร์ต่างๆของ CPU Z-80 ที่จะเป็นข้อมูลที่จะถูกย้ายไป

ตัวอย่าง การโอนย้ายข้อมูลระหว่าง Reg. B เข้าไปใน Reg. A เขียนคำสั่ง คือ LD A,B
           คำสั่ง LD A,B มีรหัสเฮ็กซ์ = 78H เมื่อ CPU Z-80 พบคำสั่ง 78H CPU จะนำข้อมูลใน Reg. B เข้ามาเก็บใน Reg. A แสดงการทำงานให้เห็นได้ ดังรูป
แสดงการโอนย้ายข้อมูล รีจิสเตอร์ B เก็บในรีจิสเตอร์ A
ตัวอย่าง การโอนย้ายข้อมูลระหว่าง Reg. C เข้าไปเก็บใน Reg. B เขียนคำสั่ง คือ LD B,C
          คำสั่ง LD B, C มีรหัสเฮ็กซ์ = 41H เมื่อ CPU Z-80 พบคำสั่ง 41H CPU จะนำข้อมูลใน Reg. C เข้ามาเก็บใน Reg. B แสดงการทำงานให้เห็นได้ ดังรูป
แสดงการโอนย้ายข้อมูลรีจิสเตอร์ C เก็บในรีจิสเตอร์ B

ตัวอย่าง การโอนย้ายข้อมูลระหว่าง Reg. D เข้าไปเก็บใน Reg. C เขียนคำสั่ง คือ LD C,D
           คำสั่ง LD C, D มีรหัสเฮ็กซ์ = 4AH เมื่อ CPU Z-80 พบคำสั่ง 4AH CPU จะนำข้อมูลใน Reg. D เข้ามาเก็บใน Reg. C แสดงการทำงานให้เห็นได้ ดังรูป

แสดงการโอนย้ายข้อมูลรีจิสเตอร์ D เก็บในรีจิสเตอร์ C
คำสั่งการโอนย้ายข้อมูลระหว่างรีจิสเตอร์กับหน่วยความจำ
        ในการโอนย้ายข้อมูลแบบนี้จะทำได้ 2 วิธี คือ การย้ายข้อมูลในรีจิสเตอร์ไปเก็บในหน่วยความจำ และการย้ายข้อมูลจากหน่วยความจำไปเก็บในรีจิสเตอร์
การโอนย้ายข้อมูลในรีจิสเตอร์ไปเก็บในหน่วยความจำ
        เป็นการนำข้อมูลในรีจิสเตอร์ต่างๆออกมาเก็บไว้ในหน่วยความจำภายนอก ตัวอย่าง เช่น คำสั่ง LD (1004 H ) , A
        คำสั่ง LD (1004 H ) , A มีรหัสเฮ็กซ์ = 32H 04H 10H เมื่อ CPU Z-80 พบคำสั่ง 32H ตามด้วย Operand 04H 10H CPUจะนำข้อมูลใน Reg. A ออกมาเก็บในหน่วยความจำภายนอกที่ตำแหน่งแอดเดรส 1004H แสดงการทำงานให้เห็นได้ ดังรูป
แสดงการนำข้อมูลในรีจิสเตอร์มาเก็บในหน่วยความจำ
ตัวอย่าง การกำหนดข้อมูล 16 บิท จากรีจิสเตอร์ไปเก็บลงในหน่วยความจำ เช่น คำสั่ง LD (1004),HL
          คำสั่ง LD (1004),HL มีรหัสเฮกซ์ = 22H 04H 10H เมื่อ CPU Z-80 พบคำสั่ง 22H ตามด้วย Operand 04H 10H CPUจะนำข้อมูลในReg.H กับ Reg. L ออกมาเก็บในหน่วยความจำภายนอกที่แอดเดรส 1004H และ 1005H ตามลำดับ แสดงการทำงานให้เห็นดังรูป
แสดงการนำข้อมูล 16 บิท มาเก็บในหน่วยความจำ

การโอนย้ายข้อมูลจากหน่วยความจำไปเก็บในรีจิสเตอร์
         เป็นการนำข้อมูลที่อยู่ในแอดเดรสต่างๆเข้ามาไว้ในรีจิสเตอร์ภายใน CPU ดังตัวอย่างเช่น LD A,(1004H)
          คำสั่ง LD A,(1004H) มีรหัสเฮกซ์ = 3AH 04H 10H เมื่อ CPU Z-80 พบคำสั่ง 3AH CPU จะทราบว่าต้องนำข้อมูลเข้าไปเก็บใน Reg. A โดยข้อมูลนั้น CPU จะนำ Operand 2 ตัวที่เขียนถัดมาจาก OP.Code 3AH รวมเป็นแอดเดรส แล้วนำข้อมูลแอดเดรสนี้มาเก็บใน Reg.A แสดงการทำงานให้เห็นดังรูป
แสดงการนำข้อมูลหน่วยความจำไปเก็บในรีจิสเตอร์
คำสั่งการโอนย้ายข้อมูลระหว่างหน่วยความจำตำแหน่งต่างๆ  
         คำสั่งการโอนย้ายข้อมูลระหว่างหน่วยความจำกับหน่วยความจำ เป็นการนำข้อมูลจากหน่วยความจำไปเก็บในหน่วยความจำตำแหน่งต่างๆตามคำสั่ง เช่น คำสั่ง LD (IX+05) , 88H (เป็นการนำข้อมูล 88H ในหน่วยความจำ ไปเก็บยังตำแหน่ง (IX+05) ในหน่วยความจำ )
        คำสั่ง LD (IX+05) , 88H มีรหัสเฮ็กซ์ = DDH 36H 05H 88H เมื่อ CPU Z-80 พบคำสั่ง DDH 36H CPUจะนำข้อมูล 88H จากหน่วยความจำที่แอดเดรสต่อจาก OP. Code DDH 36H เข้าไปเก็บในหน่วยความจำที่ตำแหน่งแอดเดรสถูกชี้โดย Reg. (IX+05) แสดงการทำงานให้เห็นได้ ดังรูป 


 แสดงการโอนย้ายข้อมูลระหว่างหน่วยความจำ กับ หน่วยความจำ
การสลับข้อมูล   
        การสลับข้อมูล จะมีคำสั่งสลับข้อมูลได้แก่ EX และ EXX ซึ่งใช้สลับข้อมูลระหว่างชุดรีจิสเตอร์หลัก(MAIN Reg.) กับชุดรีจิสเตอร์สำรอง(ALTERNATE Reg.) คำสั่ง EX และ EXX จะทำงานได้รวดเร็วเพราะเป็นการแลกเปลี่ยนข้อมูลระหว่างรีจิสเตอร์ ซึ่งอยู่ภายใน CPU เช่นกัน
ตัวอย่างเช่น  
คำสั่ง EX DE, HL ใช้สลับข้อมูลระหว่างคุ่ Reg. DE กับ Reg. HL
คำสั่ง EX AF,AF ใช้สลับข้อมูลระหว่างคุ่ Reg. AF กับ Reg. AF
คำสั่ง EXX ใช้สลับข้อมูลทั้งชุดของ Reg. BC , DE และ HL กับชุด Reg. ของ BC' , DE' และ HL' 
คำสั่งที่กล่าวมานี้สามารถแสดงให้เห็นได้ดังรูป
แสดงการสลับข้อมูลของคำสั่ง EX และ EXX
คำสั่งการสลับข้อมูล EX (SP) , HL มีการทำงานดังนี้
         คำสั่ง EX (SP) , HL มีรหัสเฮ็กซ์ = E3H เมื่อ CPU Z-80 พบคำสั่ง E3H CPUจะนำข้อมูลคู่ Reg. HL มาสลับกับข้อมูลที่ถูกชี้โดย Reg. SP ที่มีข้อมูลอยู่ในหน่วยความจำ แสดงการทำงานให้เห็นได้ ดังรูป
แสดงการสลับข้อมูลของคำสั่ง EX (SP) , HL
การโอนย้ายข้อมูลโดยใช้ Stack  
         การโอนย้ายข้อมูลโดยใช้ Stack จะมีคำสั่งที่ใช้เก็บข้อมูลจาก Reg. ไปไว้ใน Stack ได้แก่ คำสั่ง PUSH และ POP
        คำสั่ง PUSH มีประโยชน์เมื่อเราต้องการเก็บข้อมูลจาก Reg. ไปใว้ใน Stack เพื่อจะได้ใช้ Reg. ทำงานอื่น เมื่อทำงานอื่นเสร็จแล้ว เราใช้คำสั่งเรียกข้อมูล (POP) จาก Stack กลับคืนไปยัง Reg. คำสั่ง PUSH และ POP จะเป็นการโหลดข้อมูลระหว่าง Reg. กับหน่วยความจำ
ตัวอย่างของคำสั่ง PUSH เช่น PUSH BC
         คำสั่ง PUSH BC มีรหัสเฮกซ์ = C5H เมื่อ CPU Z-80 พบคำสั่ง C5H CPUจะนำข้อมูล Reg. B และ Reg. C ออกมาเก็บไว้ในย่านแอดเดรสของReg. SP โดยค่าของ SP จะเป็นแอดเดรสบอกตำแหน่งที่จะนำข้อมูลไปเก็บไว้ แสดงการทำงานให้เห็นได้ดังรูป
 

แสดงการทำคำสั่ง PUSH
ตัวอย่างของคำสั่ง POP เช่น POP BC  
         คำสั่ง POP BC มีรหัสเฮกซ์ = C1H เมื่อ CPU Z-80 พบคำสั่ง C1H CPUจะนำข้อมูล ที่อยู่ในหน่วยความจำ ที่ระบุตำแหน่งแอดเดรสโดย Reg. SP นำข้อมูลจากหน่วยความจำมาเก็บไว้ใน Reg. BC แสดงการทำงานให้เห็นได้ดังรูป 

แสดงการทำคำสั่ง POP



 
 



 

ชุดคำสั่งของไมโครโปรเซสเซอร์และภาษาแอสเซมบลี้

ชุดคำสั่งของไมโครโปรเซสเซอร์และภาษาแอสเซมบลี้

     คำสั่งของไมโครโปรเซสเซอร์จะเป็นตัวกำหนดรูปแบบการทำงานของไมโครโปรเซสเซอร์ใน ไมครโปรเซสเซอร์มีคำสั่งหลายคำสั่งเรียกว่าชุดคำสั่งของไมโครโปรเซสเซอร์ (Microprocess's Instruction Set) คำสั่งของไมโครโปรเซสเซอร์แต่ละรุ่นจะไม่เหมือนกันแต่การพัฒนาไมโครโปรเซสเซอร์รุ่นใหม่ๆ จะพัฒนาในคำสั่งมีประสิทธิภาพมากขึ้น
     คำสั่งหนึ่งคำสั่งอาจประกอบด้วยไบต์เดียว สองไบต์ สามไบต์ หรือ สี่ไบต์ แล้วแต่กรณี ไบต์แรกของคำสั่งเรียกว่า OP. CODE เพราะไบต์นี้จะเป็นไบต์ที่บอกไมโครโปรเซสเซอร์ ว่างเป็นคำสั่งอะไร ส่วนไบต์ที่เหลือเราเรียกว่า โอเปอแรนต์ (Operand) ซึ่งจะเป็นข้อมูลหรือบอกตำแหน่งข้อมูลว่าอยู่ที่ใหน รูปแบบของคำสั่งดังแสดงในรูป


 แสดงรูปแบบของคำสั่ง
    คำสั่งของไมโครโปรเซสเซอร์ที่กล่าวนี้เป็นภาษาแอสแซมบลี้ ต้องมีตัวแปลภาษาที่เรียกว่า แอสแซมเบอร์ (Assembler) เป็นตัวแปลตัวคำสั่งต่างๆ ให้เป็นภาษาเครื่อง (Machine Language) คือเป็นภาษาที่ต้องใช้รหัสเลขไบนารี่นั่นเอง จึงทำให้ระบบไมโครคอมพิวเตอร์ทำงานได้
 
กลุ่มคำสั่งของไมโครโปรเซสเซอร์ Z-80


การอ้างอิงแอดเดรส

รูปแบบและองค์ประกอบของภาษาแอสแซมบลี้ Z-80
 ตารางคำสั่งเป็นตารางที่แสดงการทำงานอย่างย่อของคำสั่งกลุ่มต่างๆ ซึ่งได้ถูกจัดแบ่งออกเป็นคอลัมน์ดังนี้
 
 
ส่วนประกอบของตารางคำสั่ง