การเขียนโปรแกรมแอสเซมบลี [Assembly Language]
posted on 21 Jul 2011 19:51 by junior11508การเขียนโปรแกรมแอสเซมบลี
ภาษา แอสเซมบลี เป็นภาษาระดับต่ำ ที่พัฒนาขึ้นมาใช้ร่วมกับคำย่อ แทนที่ความหมายนั้นๆอย่างใกล้เคียงกันเช่น LD ย่อมาจาก LOAD หมายถึง การย้าย แทน ใส่ค่า JP ย่อมาจาก JUMP หมายถึง การกระโดดข้าม จึงเรียกคำย่อนี้ว่ารหัสช่วยจำ รูปแบบของแอสเซมบลีเป็นการผสมประสานกันระหว่างคำย่อกับ คำและสัญลักษณ์ใน Z-80 เช่น LD A , 35H การป้อนโปรแกรมแอสเซมบลีอาจป้อนในรูปแบบของแอสเซมบลี หรือป้อนด้วยค่าฐานสิบหก โดยได้มาจากการเปิดตารางกลุ่มคำสั่ง Z-80 เทียบหาค่า การเขียนโปรแกรมที่ดีจะต้องว่างแผนแสดงขั้นตอนการปฏิบัติงาน โดยเขียนผังงานตั้งแต่ต้นจนจบอย่างเป็นระบบ มีระเบียบ เพื่อความสะดวกและง่ายต่อการแก้ไขปรับปรุงทีหลัง 1. รูปแบบการเขียนภาษาแอสเซมบลี Z-80 โปรแกรม ต้นกำเนิด (Source Programs) ที่เขียนด้วยภาษาแอสเซมบลี ควรที่จะเขียนด้วยรูปแบบมาตรฐานที่กำหนดไว้ เพื่อให้ง่ายต่อการอ่านและการแก้ไขโปรแกรมในภายหลัง รูปแบบมาตรฐานที่ใช้มีตั้งแต่ขนาด 1 ไบต์ จนถึง 4 ไบต์ ไบต์แรกของคำสั่งเรียกว่า รหัสดำเนินการ จะเป็นตัวบอกให้คอมพิวเตอร์ว่าทำอะไร ส่วนไบต์ที่เหลือจะเรียกว่าตัวถูกดำเนินการ จะเป็นข้อมูล หรือตำแหน่งที่อยู่ของข้อมูล Label Program Comment LOOP LD A,61H ; A=61 Label ชื่อ Loop นี้ใช้สำหรับบอกตำแหน่งที่อยู่ที่คำสั่งของโปรแกรมในบรรทัดนี้ตั้งอยู่ Program ในส่วนนี้แบ่งออกเป็น 2 ส่วน ด้วยกันคือรหัสดำเนินการ และตัวถูกดำเนินการ ซึ่งอาจจะ มี 1 ไบต์ หรือมากกว่านี้ก็ได้ Opcode ย่อมาจาก Operation Code เป็นส่วนที่บ่งบอกถึงการทำงานของคำสั่งนั้น Operand เป็นส่วนเสริมของคำสั่งเพื่อบอกถึงจุดประสงค์ของคำสั่ง Comment เป็นส่วนที่ใช้อธิบายเพิ่มเติม เริ่มต้นด้วยเครื่องหมาย 2. แอสเซมบลีในรูปรหัสช่วยจำ ( Assembly on Mnemonic Code) Z-80 เข้าใจได้ดีกับภาษาเครื่อง แต่ยากต่อการที่มนุษย์จะเขียนคำสั่ง รหัสคำสั่งช่วยจำ จะใช้อักษรเป็นหลัก ทำให้เขียนได้ง่าย และ จำง่ายกว่ารหัสฐานสิบหก เช่น LD B, A เทียบกับรหัสฐานสิบหก คือ 47H (ความหมายของคำสั่งนี้ก็คือ ย้ายข้อมูลในรีจิสเตอร์ A ไปเก็บในรีจิสเตอร์ B ) รหัส คำสั่งช่วยจำเช่น “LD” ย่อมาจาก Load สำหรับ B และ A เป็นชื่อในรีจิสเตอร์ของ Z-80 โปรแกรมที่เขียนด้วยรหัสคำสั่งช่วยจำ เรียกว่าโปรแกรมแอสเซมบลี (Assembly)การแปลจากภาษาแอสเซมบลีไปเป็นภาษาเครื่องทำได้ 2 วิธีคือ 1) ใช้โปรแกรมแอสเซมบลีที่ผู้เขียนเขียนขึ้น 2) เขียนโปรแกรมแอสเซมบลีแบบวิธีที่ 2 จะแบ่งกระดาษ 4 ช่อง 2.1 ลำดับการเขียนโปรแกรมแอสเซมบลี 1) เขียนคำสั่งแอสเซมบลีลงในช่องรหัสต้นกำเนิด (Source Code) 2) เขียนคำอธิบายว่าเป็นคำสั่ง สั่งให้ทำอะไร ลงในช่องหมายเหตุ (Comment) 3) เปิดตารางคำสั่ง Z-80 เพื่อแปลคำสั่งจากแอสเซมบลีมาเป็น รหัสฐานสิบหก ในช่อง รหัสประสงค์ (Object code) 4) ช่องตำแหน่งที่อยู่ในหน่วยความจำ (Memory Address) โดยบรรทัดแรกแสดง ตำแหน่งแรก ที่รหัสฐานสิบหกแรกไปปรากฏ 3. คำและสัญลักษณ์ในรหัส Z-80 3.1 คำย่อ 1) ชื่อรีจิสเตอร์ขนาด 8 บิต คือ A B C D E H L I R 2) ชื่อรีจิสเตอร์ขนาด 16 บิต IX IY SP AF BC DE HL 3) สถานะของแฟล็ก (Flag) C (Carry Flag) NC (Non carry) Z (Zero) NC (Non Zero) M (Minus) P (pule) PE (Parity even) PO (Parity odd) 3.2 สัญลักษณ์ของตัวถูกดำเนินการ 1) r : ใช้กำหนดแทนรีจิสเตอร์ต่างๆ A B C D E H L ตัวใดๆ 2) (HL) : ชี้ถึงหน่วยความจำที่ถูกกำหนดโดย ข้อมูลภายในรีจิสเตอร์ HL 3) n : คือข้อมูล 1ไบต์โดย 0 < n < 225 4) nn : คือข้อมูล 2 ไบต์โดย 0 < nn < 65535 5) d : คือข้อมูล 1 ไบต์โดย -128 < d < +227 6) (nn) : ชี้ถึงหน่วยความจำถูกกำหนดค่าโดย nn 7) (n) : ชี้ถึงทางเข้าออกกำหนดโดยค่า n 8) b : มีค่า 0 - 7 9) e : ข้อมูลขนาด 1ไบต์โดย -126 < e < +129 10) cc : แสดงสถานะแฟล็กที่เกี่ยวกับคำสั่ง RET CALL JR โดยมี เงื่อนไขควบคุมคำสั่งนั้นด้วย 11) qq : หมายถึงคู่รีจิสเตอร์ BC DE HL หรือ AF คู่ใดคู่หนึ่ง 12) ss : หมายถึงคู่รีจิสเตอร์ BC DE HL หรือ SP คู่ใดคู่หนึ่ง 13) pp : หมายถึงคู่รีจิสเตอร์ BC DE IX หรือ SP คู่ใดคู่หนึ่ง 14) rr : หมายถึงคู่รีจิสเตอร์ BC DE IY หรือ SP คู่ใดคู่หนึ่ง 15) dd : หมายถึงคู่รีจิสเตอร์ BC DE HL หรือ SP คู่ใดคู่หนึ่ง 16) s : หมายถึง r n (HL) (IX+d) หรือ (IY+d) คู่ใดคู่หนึ่ง 17) m : หมายถึง r (HL) (IX+d) หรือ (IY+d) คู่ใดคู่หนึ่ง 3.3 คำสั่งเทียม ( Pseudo Instruction) คำ สั่งเทียม เป็นคำสั่งเฉพาะทาง แอสเซมเบลอร์เท่านั้น ซึ่งแตกต่างจากคำสั่งของ Z-80 คำสั่งเทียมนี้ถูกกำหนดขึ้น เพื่อให้การเขียนโปรแกรมสะดวกรวดเร็วและเข้าใจง่ายคำสั่งนี้ไม่สามารถแปลง เป็นภาษาเครื่องได้ แต่ตัวถูกดำเนินการเท่านั้นที่สามารถแปลงเป็นภาษาเครื่องได้ 4. การอ่านตารางกลุ่มคำสั่งต่างๆของ Z-80 ซีพียู โปรแกรม หรือซอฟต์แวร์เป็นส่วนหนึ่งที่สำคัญในการที่จะให้ไมโครโพรเซสเซอร์ทำงานตาม ที่ผู้ออกแบบโปรแกรมตามต้องการ โปรแกรมหนึ่งๆ ประกอบด้วยคำสั่งต่างๆ ของไมโครโพรเซสเซอร์เบอร์นั้นๆ ไมโครโพรเซสเซอร์ แต่ละเบอร์ อาจมีคำสั่งที่ทำหน้าที่คล้ายๆกันแต่จะเขียนไม่เหมือนกันหรือใช้สัญลักษณ์ ต่างกัน สำหรับ Z-80 ซีพียู มีคำสั่งอยู่ทั้งหมด 158 คำสั่งผู้เขียนหรือผู้ออกแบบไม่จำเป็นต้องจำทั้งหมด 158 คำสั่ง เพียงแต่เข้าใจการอ่านความหมายของสัญลักษณ์การกระทำของคำสั่งชุดนั้นๆก็ เพียงพอ ใน การที่จะให้ไมโครโพรเซสเซอร์ทำงานตามคำสั่งนั้น เราจะต้องเตรียมข้อมูล ให้ไมโครโพรเซสเซอร์รับรู้ และการที่จะให้ไมโครโพรเซสเซอร์ รับรู้ มี 2 วิธี คือ - มี ตัวแปลโปรแกรม (Compiler) - และ ใช้วิธีเปิด ตารางเทียบคำสั่ง แล้ว ป้อนให้เครื่องทำงาน 4.1 การเทียบรหัสฐานสิบหก จาก ตารางแบบหยาบ เช่น ตารางในกลุ่ม 8 บิตโหลด ถ้ามองแนวตั้งจะเป็นต้นทาง (Source) แต่ถ้ามองแนวนอนจะเป็นปลายทาง (Destination) โดยดูรอยบากเป็นหลัก ตัวอย่างที่ 3.3 สมมติ ต้องการหา รหัสฐานสิบหก ของคำสั่งLD E , 99H หมายถึง การนำค่า 99 ฐานสิบหก ไปเก็บลงในรีจิสเตอร์ E โดยที่ต้นทางคือ 99Hปลายทางคือ E การ เทียบจากตารางให้ดูต้นทาง ( ช่อง n ) ว่าตัดกับช่องปลายทางรีจิสเตอร์ E จะพบรหัสฐานสิบหก คือรหัส 1E n ( n คือค่าของข้อมูลขนาด 8 บิตในที่นี้คือ 99 ) ฉะนั้นคำสั่ง LD E , 99 มีรหัสฐานสิบหก คือ 1E 99 นั่นเอง 4.2 การดูตารางละเอียด การ เปรียบเทียบรหัสจากตารางหยาบ นั้นทำได้ง่ายและสะดวกก็จริงแต่ค่าที่ได้จะไม่ชัดเจน ดังนั้นจึงควรเปรียบเทียบกับตารางละเอียดอีกครั้งหนึ่ง เพราะนอกจากจะบอก ค่ารหัสฐานสิบหก แล้วยังบอกค่าอื่นๆ อีก เช่น รูปแบบคำสั่ง ลักษณะการทำงาน สถานะภาพหลังการทำงาน จำนวนไบต์ จำนวนเวลาที่ใช้ใน T - State และคำอธิบายต่างเป็นต้น ความหมายและสัญลักษณ์ต่างๆ ใน ตารางคำสั่งของ Z - 80 CPU นอกจากจะมีรายละเอียดแสดงผลของ แฟล็ก ที่มีกับคำสั่งนั้นๆ แล้วเครื่องหมาย หรือสัญลักษณ์ ที่ใช้ ก็มีความหมายด้วยดังต่อไปนี้ 4. ช่อง Opcode ใช้เทียบรหัสฐานสอง ทั้ง 8 บิต นั่นคือ b0 --> b7 บางบิตให้ฐานสองที่คงค่าไว้ ส่วนบางบิตจะต้องนำค่าของฐานสอง จากการแทนค่าของตัวแปล ตัวอย่างที่ 3.5 แสดงการเทียบรหัสฐานสิบหก ของคำสั่ง LD B , 55H จากตารางละเอียด ขั้นตอนการเทียบ 5 จากขั้นตอน 1-4 สามารถแทนค่าช่องรหัสดำเนินการ ได้คือ นั่นคือ LD B , 55H มีรหัสฐานสิบหก เป็น 1E 55 5. No of bytes หมายถึง จำนวนไบต์ของคำสั่งนั้น เช่น LD A,61H จะมี 2 ไบต์ ด้วยกัน คือ 3E 61 6. No of M Cycle หมายถึงจำนวนรอบเครื่อง ของคำสั่งนั้น 7. No of T States หมายถึงจำนวนสถานะทีของคำสังนั้น คำ ว่า T-State หมายถึง คาบเวลาของสัญญาณนาฬิกา 1 ลูก ของระบบ สมมติ Z-80 Single Board ได้ใช้ X-Tal ขนาดความถี่ 3.579 MHz เป็นฐานเวลา ดังนั้นคาบเวลาของ สัญญาณนาฬิกา 1 ลูก จึงเท่ากับส่วนกลับของความถี่หรือ T = 1 / f = 1 / 3.579 MHz = 0.279 ?sec นั่นคือถ้าต้องการทราบว่าคำสั่งนี้ ซีพียูต้องใช้เวลาในการประมวลผลนานเท่าไรเราสามารถหาได้เช่น คำสั่ง LD r , s ใช้ 4T ดังนั้น = 4 ? 0.279 ?sec. = 1.116 ?sec 8. Comment หมายถึง หมายเหตุของตารางเพื่อบอกค่าที่จะนำไปแทนในรหัสดำเนินการ ของรีจิสเตอร์แต่ละตัว 5. ผังงาน (Flow chart ) การเขียนโปรแกรม มักจะพิจารณาจากโจทย์ที่กำหนดขึ้น แล้วมาลำดับขั้นตอน การแก้ปัญหาให้กับ ไมโครโพรเซสเซอร์ การลำดับขั้นตอนนั้น คือการเขียนผังงานนั่นเอง ตัวอย่าง 3.7 การเขียนโปรแกรมจากผังงาน เพื่อ Clean Memory ตั้งแต่ 2100H ถึง 21FFH ขั้นตอนการพิจารณา ขั้นที่ 1. กำหนดจุดเริ่มต้นเขียนโปรแกรม ซึ่งจะต้องไม่ซ้ำกันกับย่านที่ต้องการ Clean นั่นคือ 2100H ถึง 21FFH กำหนดให้เป็น 2000H โดยใช้รูปวงรี ขั้นที่ 2. กำหนดค่าต่างๆที่ จำเป็นให้ รีจิสเตอร์ภายใน Z-80 ทราบ เช่น ย่านที่ Z-80 เริ่มทำการลบ (2100H) จำนวนช่วงทั้งหมดที่จะทำการลบ หาได้จาก ตำแหน่งที่อยู่สุดท้ายที่ลบ คือ 21FFH - ตำแหน่งที่อยู่เริ่มต้นที่ลบ คือ 2100H 00FFH ฉะนั้น จำนวนช่องทั้งหมดที่ต้องการ ลบ คือ 0FFH สามารถเขียนผังงานได้ดังนี้ ขั้นที่ 3 เริ่มปฏิบัติการลบ ข้อมูลได้ ขั้นที่ 4 เมื่อลบได้จำนวนหนึ่งช่อง แล้วคอยตรวจสอบว่าทำได้ครบ ทั้งหมดหรือไม่ ถ้ายังไม่ครบให้กลับไปทำการลบ ใหม่ ขั้นที่ 5 เมื่อลบ ครบช่องจำนวนแล้วให้ สิ้นสุดโปรแกรม สามารถเขียนผังงานได้ดังนี้ สรุปเนื้อหาท้ายบท ซี พียู ทุกเบอร์จะประมวลผลด้วยฐานสองเท่านั้น แต่เป็นการยากที่ผู้เขียนโปรแกรม (Programmer) จะเขียนรหัสฐานสอง ดังนั้นเพื่อความสะดวกจึงเขียนด้วยรหัสช่วยจำ เป็น รหัสต้นกำเนิด ก่อนแล้วจึงใช้ตัวแปลแปลงรหัส ช่วยจำ ไปเป็นรหัส ฐานสอง อีกครั้ง สำหรับ Z - 80 มีวิธีการแปลง 2 แบบ คือ โปรแกรมแปลงฐานสองนั้นเอง กับการแปลงโดยวิธีเปิดตาราง การเขียนโปรแกรมด้วยภาษาอะไรก็ตาม ควรเขียนผังงานการแก้ปัญหาของคอมพิวเตอร์ก่อน เพื่อง่ายต่อการแก้ไขเพิ่มเติมโปรแกรมภายหลัง