บทที่3 การเขียนโปรแกรมควบค...

20
52 บทที3 การเขียนโปรแกรมควบคุมไมโครโพรเซสเซอร โปรแกรมภาษาคอมพิวเตอรที่ใชในการควบคุมการทํางานของ 8086 มี 3 ระดับ คือ โปรแกรมภาษาเครื่อง (Machine Language) เปนรูปแบบของเลขฐานสอง (Binary Form) โปรแกรมภาษาแอสเซมบลี (Assembly Language) : มีคําสั่งงายๆ เปนตัวแทนของ binary code เชน ADD, SUB การ execute โปรแกรมภาษา Assembly มีอยู 2 วิธี คือ - แปลงแตละ instruction ใหเปน binary code โดยใช Template (Interpreter) - ใชโปรแกรมอื่นชวยแปลความหมายของโปรแกรม (Compiler) ในกรณีของโปรแกรมที่เขียนดวย ภาษาแอสเซมบลี (Assembly) โปรแกรมการแปลความหมายนี้มีชื่อวา Assembler โปรแกรมภาษาชั้นสูง (High-Level Language) เชน C, Pascal โปรแกรมเหลานี้ตองใช คอมไพเลอร (Compiler) ของตนเองในกระบวนการ execute โปรแกรม 3.1 ขั้นตอนในการพัฒนาโปรแกรม (Program Development Steps) 3.1.1 กําหนดวัตถุประสงคของโปรแกรม (Defining the Program) ขั้นตอนแรกของการเขียนโปรแกรม คือการพิจารณาเกี่ยวกับความตองการในการใชโปรแกรมเพื่อแกปญหา อยางรอบคอบ โดยถามตัวเองอยูเสมอวา คุณตองการที่จะใหโปรแกรมนี้ทําอะไร?จากนั้นก็เขียนลงในกระดาษ ตามลําดับขั้นตอนการทํางานตามความตองการ เชน - อานคาอุณหภูมิ มาจาก sensor - บวกคาแกดวยคา +7 - บันทึกผลที่ไดลงในหนวยความจํา 3.1.2 เขียนขั้นตอนวิธีการปฏิบัติ (Representing Program Operation) ในการเขียนขั้นตอนวิธีการปฏิบัติ หรืออัลกอริทึม (Algorithm) สามารถทําได 3 วิธี คือ 3.1.2.1. แผนภูมิลําดับการทํางาน (Flowchart) รูปที3 – 1 ตัวอยางของสัญลักษณใน Flowchart

Upload: others

Post on 05-Sep-2019

2 views

Category:

Documents


0 download

TRANSCRIPT

52

บทที่ 3 การเขียนโปรแกรมควบคุมไมโครโพรเซสเซอร

โปรแกรมภาษาคอมพิวเตอรท่ีใชในการควบคุมการทํางานของ 8086 มี 3 ระดับ คือ โปรแกรมภาษาเครื่อง (Machine Language) เปนรูปแบบของเลขฐานสอง (Binary Form)

โปรแกรมภาษาแอสเซมบล ี(Assembly Language) : มีคําสั่งงายๆ เปนตัวแทนของ binary code เชน ADD, SUB การ execute โปรแกรมภาษา Assembly มีอยู 2 วิธี คือ - แปลงแตละ instruction ใหเปน binary code โดยใช Template (Interpreter) - ใชโปรแกรมอื่นชวยแปลความหมายของโปรแกรม (Compiler) ในกรณีของโปรแกรมที่เขยีนดวย

ภาษาแอสเซมบลี (Assembly) โปรแกรมการแปลความหมายนี้มีชื่อวา Assembler โปรแกรมภาษาชั้นสูง (High-Level Language) เชน C, Pascal โปรแกรมเหลาน้ีตองใช

คอมไพเลอร (Compiler) ของตนเองในกระบวนการ execute โปรแกรม

3.1 ข้ันตอนในการพัฒนาโปรแกรม (Program Development Steps) 3.1.1 กําหนดวตัถุประสงคของโปรแกรม (Defining the Program)

ขั้นตอนแรกของการเขียนโปรแกรม คือการพิจารณาเกีย่วกับความตองการในการใชโปรแกรมเพื่อแกปญหาอยางรอบคอบ โดยถามตัวเองอยูเสมอวา “คุณตองการที่จะใหโปรแกรมนี้ทําอะไร?” จากน้ันก็เขียนลงในกระดาษ ตามลําดับขั้นตอนการทํางานตามความตองการ เชน

- อานคาอุณหภูมิ มาจาก sensor - บวกคาแกดวยคา +7 - บันทึกผลที่ไดลงในหนวยความจํา

3.1.2 เขียนขั้นตอนวิธีการปฏบัิติ (Representing Program Operation)

ในการเขียนขั้นตอนวิธีการปฏิบัติ หรืออัลกอริทึม (Algorithm) สามารถทําได 3 วิธี คือ 3.1.2.1. แผนภูมิลําดับการทํางาน (Flowchart)

รูปที่ 3 – 1 ตัวอยางของสัญลักษณใน Flowchart

53

ความสําเร็จในการเขียนโปรแกรมไมไดขึ้นอยูกบัการเขียนชุดคําสั่งการทํางานตามลําดับเทาน้ัน คุณจะตองคิดอยางรอบคอบวาคุณตองการที่จะใหโปรแกรมที่เขียนน้ีทําอะไร ? และจะทําไดอยางไร ? จากน้ันก็เขียนโครงสรางของโปรแกรมดวย Flow Chart หรือ โครงสรางมาตรฐาน หรือท้ังสองอยาง ใหชัดเจน เพื่อท่ีคุณหรือผูอื่นท่ีตองทําการเขียนโปรแกรมนี้เขาใจไดแบบเดียวกัน

รูปที่ 3 – 2 ตัวอยาง Flowchart โปรแกรมการอานคาอุณหภูมิ

3.1.2.2. จัดโครงสรางของโปรแกรม (Structured Programming)

Top-down Design : แบงโปรแกรมขนาดใหญออกเปนหลายๆ โมดูล โดยแตละโมดูลจะมีความสัมพันธกับโปรแกรม โดยโปรแกรมในระดับ Top Level จะเปรียบเสมือนโปรแกรมหลัก (Main Program)

Bottom-up Design : โปรแกรมเมอรแตละคนพัฒนาโมดูลของตนเอง และนํามารวมกันดวยการสรางความสัมพนัธใหเปนโปรแกรม

3.1.2.3. เขียน Pseudocode Pseudocode เปน ภาษาคอมพิวเตอรชั้นสูงทีใ่ชในการเขียนโปรแกรม ซึ่งสามารถเขาใจไดงาย

ใกลเคียงกับภาษาอังกฤษ ในการเขียนโปรแกรม จะมี Operation พื้นฐานที่สําคัญอยู 3 ลักษณะ คือ Sequence : จัดลําดับการทํางาน -> SEQUENCE Decision หรือ Selection : มีตัวเลอืกในการปฏิบัติ -> IF-THEN-ELSE, IF-THEN, CASE

54

รูปที่ 3 – 3 Selection Program

Repetition หรือ iteration : ทํางานซ้ําจนกวาจะสําเร็จตามเงือ่นไข -> WHILE-DO, FOR-DO,

REPEAT-UNTIL

รูปที่ 3 – 4 Repetition Program

55

3.1.3 หาชุดคําสั่งที่เหมาะสมมาใช (Finding the Right Instruction) หลังจากที่เขียนโครงสรางของโปรแกรมไดแลว ขั้นตอนตอไปคือการพิจารณาวาชุดคําสั่งใดที่จะ

เหมาะสมกับโครงสรางโปรแกรมของคุณ ในบทที่ 6 จะมีชุดคําสั่งสําหรับ 8086 พรอมคําอธิบายอยางสั้น ซึ่งชุดคําสั่งตางๆ สามารถจดัแบงตามประเภทของการใชงาน ไดดังตอไปนี้

Data transfer Instruction ใชในการเคลื่อนยายขอมูล เชน MOV, PUSH, POP, IN, OUT

Arithmetic Instruction ใชในการคํานวณทางเลขคณิต เชน ADD, SUB, MUL, DIV

Bit Manipulation Instruction ใชในการคํานวณทางตรรกะในลกัษณะบิต-ตอ-บิต เชน NOT, AND, OR, XOR, SHL, SHR

String Instruction ใชในการควบคุมการทํางานเปนชุดของโปรแกรม เชน REP Program Execution Transfer Instruction ใชในการโยกยายลําดับการทํางานของโปรแกรม

เชน CALL, RET, JMP Processor Control Instruction ใชควบคุมการทํางานของโพรเซสเซอรโดยตรง เชน HLT, CLI, ESC

3.1.4 เขียนโปรแกรม (Write A Program) ในการเขียนโปรแกรม มีขั้นตอนดังตอไปนี้

กําหนดคาเริ่มตนของชุดคําสั่ง (Initialization Instructions) ตามรายการดังตอไปนี้ - Data Segment Register (DS)

- Stack Segment Register (SS)

- Extra Segment Register (ES)

- Stack Pointer Register (SP)

- 8255 Programmable Parallel Port

- 8259A Priority Interrupt Controller

- 8254 Programmable Counter

- 8251A Programmable Serial Port

- Initialize Data Variable

- Set Interrupt Enable Flag

ใชรูปแบบมาตรฐานของการเขียนโปรแกรม (Standard Program Format) จัดทําเอกสารประกอบ (Documentation) : ควรจะทําเอกสารประกอบโปรแกรมที่ชัดเจน ซึ่งแต

ละโปรแกรมควรจะมี ชื่อหัวเรื่องที่อธิบายการทํางานโดยยอไวอยางชัดเจน (Abstract) 3.2 การสรางโปรแกรมภาษาเครื่องจากชุดคําสั่งของ 8086

ในหัวขอน้ีจะกลาวถึงการสราง binary code จากชุดคําสั่งของ 8086 ขั้นตอนในการดําเนินการน้ีโดยมากจะใช Assembler เปนตัวจัดการ แตเพื่อท่ีจะทําใหสามารถเขาใจกระบวนการตางๆ ในการทํางานของ Assembler กอนอื่นจะตองทําความเขาใจวาจะสามารถสราง code เหลาน้ีไดอยางไร โดยการใชบอรดตนแบบของ CPU 8086 เชน

56

SDK-86 การเขาใจกระบวนการเหลาน้ีจะทําใหสามารถเขียนโปรแกรมควบคุมการทํางานตางๆ ไดงายขึ้น ในการเขียนโปรแกรมควบคุมการทํางานของ 8086 สามารถทําได 2 วิธี คือ ใช Instruction Template หรือเขียนโปรแกรมภาษาแอสเซมบลีสําหรับ Assembler

3.2.1 Instruction Templates

ในการเขียนโปรแกรมสําหรับโพรเซสเซอร (Processor) ขนาด 4 บิต หรือ 8 บิต จะสามารถหา code สําหรับชดุคําสั่งที่เปนเลขฐาน 16 ไดใน Op code เพียงหนาเดียว แตสําหรับ 8086 ซึ่งเปนไมโครโพรเซสเซอรชิปขนาด 16 บิต ซึ่งมีวิธีในการระบุตําแหนงของ operand ในแตละคําสั่งไดถึง 32 วิธี เชน MOV CX, source โดยแหลงตนทางของ operand (ขนาด 16 บิต) อาจจะเกบ็อยูใน รีจิสเตอรตัวใดตัวหนึ่งจากรีจิสเตอรท่ีมีอยู 8 ตัว หรืออาจจะเก็บอยูท่ีใดที่หน่ึงในหนวยความจํา ดังน้ันการดําเนินการแตละวิธีของชุดคําสั่งจงึตองการ binary code ท่ีแตกตางกัน และถา CX เปน source แทนที่จะเปน destination ก็จะมีอีก 32 วิธีในการระบุตําแหนงปลายทางของ operand นอกจากนั้นแตละแตละวิธีของชุดคําสั่งก็จะตองการ binary code ท่ีแตกตางกันดวย ดังน้ันจึงมี code ท่ีแตกตางกันอยู 64 ชุดสําหรับคําสั่ง MOV เพียงอยางเดียว ในกรณีท่ีใชรีจสิเตอร CX เปน source หรือ destination และในทํานองเดียวกันหากใชรจีิสเตอรตัวอื่นเปน source หรือ destination ก็จะตองมีโคดท่ีแตกตางกันอีก 64 ชุด ตัวอยางเชน คําสั่ง IN AL, 05H เปนคําสั่งที่มีขนาด 2 ไบต โดย 7 บิตแรกของไบตท่ี 1 เปน op

code ของคําสัง่ IN ท่ีจะบอกให 8086 ทราบวาน่ีคือคําสั่งในการรับ input มาจากพอรต สวนบิต W จะบงบอกวาจะรับขอมูลอินพุตเขามายังรีจิสเตอร AL มีขนาดเปนไบต (W=0) หรือรับขอมูลอินพตุเขามายังรีจิสเตอร AX มีขนาดเปนเวิรด (W=1) สําหรับไบตท่ี 2 จะเปนแอดเดรสของพอรตที่รับอินพุตเขามา เชน 00000101 (05H) ดังน้ันรูปแบบของคําสัง่น้ี ท่ีแสดงโดยเลขฐาน 16 คือ E4H, 05H ดังรูปที่ 3 – 5

รูปที่ 3 – 5 INSTRUCTION TEMPLATE

57

3.2.2 คําสั่ง MOV คําสั่ง MOV คือรูปแบบของชุดคําสั่งในการคัดลอกขอมูลจากรีจสิเตอรตัวหนึ่งไปยังรีจิสเตอรอกีตัวหนึ่ง

หรือจากรีจิสเตอรไปยังหนวยความจํา หรือจากหนวยความจําไปยงัรีจิสเตอรใน 8086 (code สําหรับคําสั่งน้ีตองมีความยาวอยางนอย 2 ไบต)

รูปที่ 3 – 6 Coding Template ของคําสัง่ MOV ใน 8086

- 6 บิตแรก เปน opcode ของคําสั่ง (ดูใน Appendix A) - W-bit ในเวิรดแรก จะใชกําหนดวาจะทําการเคลื่อนยายขอมูลเปนไบต (W=0) หรือเปนเวิรด (W=1) - สําหรับคําสั่งน้ี operand ตัวหนึ่งจะตองเปนรีจิสเตอร ดังน้ัน 3 บิตในไบตท่ี 2 จะใชในการกําหนดวาเปน

รีจิสเตอร โดยที่ code สําหรับรีจิสเตอรแตละตวั มีดังน้ี

รูปที่ 3 – 7 Instruction Code สําหรับรีจิสเตอรของ 8086

- D-bit ในไบตท่ี 1 จะใชในการจะใชในการระบุวาจะเคลื่อนยายขอมูลออกจากรีจิสเตอรตัวที่กําหนด (D=0) หรือเคลื่อนยายขอมูลเขาไปยงัรจีิสเตอรตัวที่กําหนด (D=1)

- MOD ขนาด 2 บิต และ R/M ขนาด 3 บิต ในไบตท่ี 2 จะกําหนด address mode ของ operand

58

การกําหนดแอดเดรสของแตละชุดคําสั่งที่เปนไปได 32 วิธี (32 possible addressing mode) ถา operand อีกตัวหนึ่งเปนรีจิสเตอรตัวใดตัวหนึ่งในรีจิสเตอรท่ีใชในวตัถุประสงคท่ัวไป (general-

purpose Register) ท่ีมีอยู 8 ตัวภายใน 8086 คาของ MOD=11 สวนคา R/M จะระบุรีจิสเตอร (register) ตัวที่ตองการกําหนด

ถา operand อีกตัวหนึ่งเปนตําแหนงในหนวยความจํา (Memory) ก็มี 24 วิธีในการระบุตําแหนงในหนวยความจํา ดังน้ี - ถาคา address ไมมี displacement (Direct Address) เชน MOV CX, [BX] คาของ

MOD=00, คา R/M=111 - ถาคา address มี displacement นอยกวา 256 พรอมท้ังอางอิงมาจาก content ในรีจสิเตอร เชน

MOV CX, 43H[BX] คาของ MOD=01, คา R/M=111 - ถาคา address มี displacement ท่ีมากกวา 256 ก็จะมีขนาดยาวกวา 8 บิต เชน MOV DX,

4527H[BX] คาของ MOD=10, คา R/M=111

รูปที่ 3 – 8 MOD และ R/M bit pattern

MOV SP, BX : คัดลอกเวิรด (word) จากรีจิสเตอร BX ไปยังรีจสิเตอร SP

- opcode สําหรับคําสั่ง MOV คือ 100010 (จาก appendix A) - D = 1 (To Register)

- W = 1 (การ move word ) - REG = 100 (หมายถึง รีจิสเตอร SP) - MOD = 11 (หมายถึง Register Addressing Mode) – เก็บในรีจิสเตอร SP โดยตรง - R/M = 011 (BX)

59

รูปที่ 3 – 9 MOV SP, BX

MOV CL, [BX] : คัดลอก content จากแอดเดรสในตําแหนงที่อยูในรีจสิเตอร BX มายังรีจิสเตอร CL

- opcode สําหรบัคําสั่ง MOV คือ 100010 (จาก appendix A) - D = 1 (To Register) - W = 0 (การ move byte) - REG = 001 (หมายถึง รีจิสเตอร CL) - MOD = 00 (หมายถึง Addressing Mode โดยใชคาแอดเดรสจากรีจิสเตอร BX) - R/M = 111 ([BX])

รูปที่ 3 – 10 MOV CL, [BX]

MOV 43H[SI], DH : คัดลอกไบตจากรจีสิเตอร DH ไปยังตําแหนงในหนวยความจํา

BIU (Bus Interface Unit) จะหา effective address ไดโดยการ บวกคา displacement กับคาในรีจิสเตอร SI และจากนั้นก็จะสามารถหาคา physical address ไดโดยนําคา effective address บวกกบัคาท่ีอยูในรีจิสเตอร DS (Data Segment Register)

- opcode สําหรับคําสั่ง MOV คือ 100010 (จาก appendix A) - D = 0 (From Register)

- W = 0 (การ move byte ) - REG = 1100 (หมายถึง รีจิสเตอร DH) - MOD = 01 (คา 43 H สามารถบรรจุอยูในขนาด 1 ไบต = 0100 0011)

ถาคาน้ีมากกวา FFH -> MOD = 10

- R/M = 100 (SI)

- เพิ่มไบตท่ี 3 เพื่อระบุคา displacement ในกรณีน้ี หมายถึง 43H = 0100 0011

60

รูปที่ 3 – 11 MOV 43H[SI], DH

MOV CX, [437A H] : คัดลอก content จากตําแหนงในหนวยความจํา มายังรีจิสเตอร CX

- opcode สําหรับคําสั่ง MOV คือ 100010 (จาก appendix A) - D = 1 (To Register)

- W = 1 (การ move word ) - REG = 001 (หมายถึง รีจิสเตอร CX) - MOD = 00 (หมายถึง Direct Addressing Mode) - R/M = 110 (d 16 – Direct Addressing)

- เพิ่มไบตท่ี 3 สาํหรับแอดเดรส 7A H -> 0111 1010 - เพิ่มไบตท่ี 4 สาํหรับแอดเดรส 43 H -> 0100 0011

รูปที่ 3 – 12 MOV CX, [437A H]

61

MOV CS:[BX], DL : คัดลอกไบตจากรจีสิเตอร DL ไปยังหนวยความจาํ – ในกรณีท่ีไบตน้ันเปนชุดคําสั่ง Effective Address จะบรรจุอยูในรีจสิเตอร BX ซึ่งตามปกติจะสามารถทราบ physical address ได

โดยนําคาน้ีไปบวกกับ DS แตในกรณีน้ีมี CS ท่ีอยูหนา [BX] แสดงวาตองการใหนําคา effective address ไปบวกกับ CS เพื่อหา physical address ดังน้ันจึงเรียก CS: วา segment override prefix ซึ่งจะมีรูปแบบเปน 001XX110 (XX มีคาดังน้ี ES=00, CS=01, SS=10 และ DS=11) เพราะฉะนั้นสําหรับคําสั่งน้ีจึงมีไบตท่ี 1 เพิ่มขึ้นมาและเลื่อน opcode ไปอยูในไบตท่ี 2

- ไบตท่ี 1 = 001 01 110 (CS=01) - opcode สําหรับคําสั่ง MIOV คือ 100010 (จาก appendix A) - D = 0 (From Register)

- W = 0 (การ move byte ) - REG = 010 (หมายถึง รีจิสเตอร DL) - MOD = 00 (แอดเดรสในหนวยความจํา – ไมมีคา Displacement) - R/M =111 ([BX])

รูปที่ 3 – 13 MOV CS:[BX], DL

3.2.3 โปรแกรมภาษาแอสเซมบลีสําหรับ Assembler ถา 8086 สนับสนุนการใช Assembler ก็ใหใชโปรแกรมภาษาแอสเซมบลี เพราะนอกจากจะทําการ

แปลง statement ตางๆ ใหเปน binary code แลว Assembler ยังอนุญาตใหทําการอางอิงถงึขอมูลดวยชื่อ โดยไมจําเปนตองอางอิงดวยแอดเดรส โปรแกรมภาษาแอสเซมบลีท่ีใชในหนังสอืเลมน้ีจะใชกับ TASM 1.0 ของบริษัท Borland International หรือ MASM 5.1 ของบริษัท Microsoft ถึงแมวา Assembler ท้ัง 2 เวอรชันน้ีจะมีรูปแบบที่เหมือนกัน แตก็อาจจะมี Syntax ท่ีแตกตางกันบางเล็กนอย จึงควรตรวจสอบการใชจากคูมือโดยเฉพาะของ Assembler แตละเวอรชัน

62

รูปที่ 3 – 14 ตัวอยางโปรแกรมภาษาแอสเซมบลี

63

MOV AX, 0010H : Load Immediately word H0010 เขาไปในรีจิสเตอร AX ใช template ของคําสัง่ MOV Immediately คือ 1011, W, REG, data byte low, data byte high โดยที่ W=1 (move word),

REG=000 (AX) จะได 10111000 ( H8B ) ตามดวยคา H00 และ H10

MOV DS, AX : คัดลอกเนื้อหาในรีจิสเตอร AX ไปยังรีจสิเตอร DS (Data Segment) ใช template ของคําสั่ง MOV ระหวางรีจิสเตอร คือ 1000 1110

IN AL, 05H : นําขอมูลจากพอรต H05 มายังรีจิสเตอร AL คือ 1110 0100 0000 0101 หรือ HH 054E

ADD AL, 07H : บวกเลข 7 เขากับ content ในรีจิสเตอร AL – รูปแบบ : 00000010W, data byte, data

byte ในกรณีน้ี W=0 ดังน้ันจึงเปน 0000 0100 0000 0111 หรือ HH 0704

MOV [0000], AL : คัดลอกผลลพัธท่ีไดไปเก็บไวในหนวยความจําท่ีแอดเดรส 0000 – รูปแบบ : 1010001 W,

address low byte, address high byte ในกรณีน้ี W=0 ดังน้ันจึงเปน 10100010 00000000 00000000 หรือ HHH 00002A

INT 3 : หยุดการประมวลผลโปรแกรมของ 8086 โดยการอนิเตอรรัพท Type 3 – 11001100 หรือ HCC 3.3 รูปแบบของโปรแกรม (Program Format)

รูปที่ 3 – 15 ตัวอยางโปรแกรมการคูณเลขฐานสอง 16 บิต 2 จํานวน ซึ่งจะไดผลลัพธเปนเลขฐานสอง 32 บิต

64

จากตัวอยางจะเห็นไดวานอกเหนือจากการใชคําสั่งตางๆ แลวยงัมีสวนที่เรียกวา assembler directive หรือ pseudo operation ท่ีชี้แนะแนวทางการทํางานของโปรแกรม

3.4 Syntax ของโปรแกรมภาษา Assembly

3.4.1 SEGMENT and ENDS Directives

SEGMENT และ ENDS เปนคําท่ีใชในการกําหนดกลุมของขอมูล (Data) หรือกลุมของชุดคําสั่ง (Instruction) ท่ีตองการนํามารวมไวในสวนเดียวกัน วิธีการใชจะเหมือนกับการใชเครื่องหมายวงเล็บ โดยกลุมของขอมูล หรือกลุมของชดุคําสั่งที่อยูระหวางคําท้ังคูน้ีจะเรียกวา logical segment และทําการกําหนดชื่อใหกับแตละเซ็กเมนต เชน CODE_HERE, DATA_HERE

- ในการตั้งชื่อ : มีความยาวไดมากถึง 31 ตัวอกัษร แตไมสามารถใชชื่อท่ีเปน Instruction ได - ไมสามารถใชชองวาง (spacebar) ไดแตสามารถใช “_” ในการแยกชื่อใหอานออกไดโดยงาย

ในการประกาศ (declare) logical statement น้ันยังไมจําเปนตองกําหนด physical address เม่ือนําโมดูลตางๆ มารวมกัน หรือเชื่อมโยงไปยังโมดูลอื่น Assembler จะทําการกําหนด physical address ในหนวยความจําท่ีจะทําการโหลดโปรแกรมเขาไปเพื่อทําการ run เอง

3.4.2 การตั้งชือ่ Data และ Address – EQU, DB, DW, DD Directives โปรแกรมจะทํางานกับขอมูล (Data) 3 ประเภท คือ คาคงท่ี (Constant) – คาท่ีไมมีการเปลี่ยนแปลงใน

ขณะที่โปรแกรมทํางาน, คาตัวแปร (Variable) - คาท่ีมีการเปลี่ยนแปลงในขณะที่โปรแกรมทํางาน และคาแอดเดรส (Address) – คาท่ีกําหนดในชุดคําสั่งเพื่อระบุตําแหนงในหนวยความจํา เชน jump to address ซึ่งจะสามารถตั้งชื่อใหกับขอมูลท้ัง 3 ประเภทนี้ไดดวยการใช Directive ดังน้ี

3.4.2.1 EQU Directive

Equate ใชกําหนดชื่อใหกับคาคงที่ซึง่ใชในโปรแกรม เชน CORRECTION_FACTOR EQU

07H เปน statement ท่ีใชบอก assembler วาทุกท่ีในโปรแกรมที่พบคําวา CORRECTION_FACTOR จะหมายถึงคาคงท่ี = 7 ขอดีของการกาํหนดชื่อใหกบัคาตัวแปรจะมีก็ตอเม่ือมีการประกาศไวในตอนตนของโปรแกรม คือถาในตัวโปรแกรมมีการอางถงึคาน้ีนับสิบ นับรอยครัง้ ก็เพียงแตใชชื่อในการอางอิง เม่ือตองการทีจ่ะเปลี่ยนคาคงท่ี เชนจาก 7 เปน 9 ก็เพียงแตทําการเปลี่ยนคาท่ีประกาศไวในตอนตน ไมจําเปนตองไปเปลีย่นคาทุกท่ีในโปรแกรม ซึ่งหากเปลีย่นไมครบทุกท่ีก็จะทําใหผลลพัธท่ีไดจากการรันโปรแกรมนี้มีความผิดพลาด หรือในบางกรณีโปรแกรมก็อาจจะไมทํางานเลย

3.4.2.2 DB, DW, and DD Directives ใชในการกําหนดชื่อใหกับคาตัวแปร (Variable) ท่ีใชในโปรแกรม DB บอกประเภทของตัวแปรวามีขนาดเปนไบต (8 บิต) เชน OVEN_TEMPERATURE

DB 27H (27H คือคาเริ่มตน – initial value – ของตวัแปรนี้ แตถาไมสนใจวาคาเริ่มตนจะเปนอยางไร ใหใชเครื่องหมาย ? แทน อยางไรก็ตามควรจะมีการกําหนดคาเริ่มตนของตัวแปร เพื่อใหสามารถกลับมายังคาเริ่มตนไดโดยไมตอง reload คาตัวแปรใหม)

65

DW บอกประเภทของตัวแปรวามีขนาดเปนเวิรด (16 บิต) เชน MULTIPLICAND

DW 204A H เปนการประกาศ data word ท่ีมีคา 204AH โดยใชชื่อวา MULTIPLICAND การใช DW จะเปนการบอกให 8086 ทําการจองเนื้อท่ีวางในหนวยความจําไวสําหรับคาตัวแปร MULTIPLICAND ท่ีจะถูกโปรแกรมโหลดเขามา สําหรับ chip ของบริษัท Intel น้ันแอดเดรสแรกจะจัดเก็บ lower byte (4A) และแอดเดรสที่สองจะจัดเก็บ Higher byte (20)

DD บอกประเภทของตัวแปรวามีขนาดเปนดับเบิลเวิรด (32 บิต) เชน PRODUCT DW 2

DUP(0) จะจองเนื้อท่ีในหนวยความจําไว 2 เวิรด โดยใชชือ่วา PRODUCT สวน DUP(0) เปนการกําหนดคาเริ่มตนของทั้ง 2 เวิรดใหเปน 0 ท่ีจริงแลวในสวน DW 2 เราอาจจะสามารถใช DD แทนได แตสําหรับโปรแกรมตัวอยาง ในการประกาศ เปน DW 2 ก็เน่ืองจากวาเราตองการใชผลลัพธทีละเวิรด

รูปที่ 3 – 16

3.4.2.3 ASSUME Directive ใชสําหรับเปนตัวบอก assembler วาในขณะนี้จะใช logical segment ใด เชน ASSUME

CS:CODE_HERE, DS:DATA_HERE จะทําใหทราบวาสวนใดทีจ่ะนําเขาไปยัง Code Segment และสวนใดที่จะนําเขาไปยัง Data Segment

3.4.2.4 END Directive

เปนชื่อท่ีใชในการบอก assembler วาใหหยุดการอาน ดังน้ันคําสั่งใดๆ ท่ีเขียนไวหลังจากคําวา END จะถูกละเลยทั้งหมด

66

3.4.3 ตัวเลขประเภทตางๆ ท่ีใชใน Data Statement BINARY: ใหเขียนในรูปแบบของ 2’complement ตามทายดวยอักษร B เชน

TEMP_MAX DB 01111001B DECIMAL: ถาไมมีตัวอักษรตอทาย assembler จะอานเปนเลขฐานสิบ เชน TEMP_MAX DB 49 HEXADECIMAL: ตามทายดวยอักษร H และถาตัวแรกของเลขเปนตัวอักษรจะตองเติมเลข 0

ไวขางหนา เชน 0A H BCD: คา BCD จะเทากับ Hex ดังน้ันจึงสามารถใชอักษร H ตอทายตัวเลขได ASCII: ใชเครือ่งหมาย quote เชน BOY1 DB ‘ALBERT’ หมายความวา data item

ท่ีชื่อวา BOY1 ตองการเนื้อท่ีในหนวยความจํา 6 ตําแหนง โดยที่ตําแหนงแรกจะจัดเก็บ ASCII Code ของตัวอกัษร A, ตําแหนงทีส่องจะจดัเก็บ ASCII Code ของตวัอกัษร L, ตําแหนงทีส่ามจะจัดเกบ็ ASCII Code ของตัวอกัษร B, …

3.4.4 การกําหนดคาเริ่มตนของ Segment Registers

วิธีในการกําหนด Code Segment Base Address มีอยูหลายวิธี เชนการใชคําสัง่ G =

0010:0000 <CR> (<CR> หมายถึงการกดคีย Enter) หมายถึงใหโปรแกรม Load CS ดวยคา 0010 และ load

IP ดวยคา 0000 ดังน้ัน 8086 จะทําการ fetch และ execute Instruction ต้ังแต address 00100 (CS+ IP) 3.4.5 การเขาถงึขอมูลท่ีใชช่ือโดยคําสั่งในโปรแกรม

3.4.5.1 Direct Addressing เชน MOV AX, MULTIPLICAND 3.4.5.2 Naming Address หรือ Labels เชนถาตองการให 8086 กลบัไปยังคําสั่งใดหลายๆ

ครั้ง แทนที่จะเขียนคําสั่งน้ันซ้ําตอไปอีก ก็ใหใชคําสั่ง JMP (Jump) ตามดวยชื่อ ตัวอยางเชน NEXT : IN AL, 05H ; -- นําขอมูลเขามาทางพอรต 05 H JMP NEXT ; -- นําขอมูลเขามาทางพอรต 05 H ใหมอีกครั้ง 3.5 เครื่องมือในการพัฒนาโปรแกรมภาษาแอสเซมบลีสําหรับใชกับ Assembler

3.5.1 Editor

เปนโปรแกรมที่ใชในการสรางไฟลของโปรแกรมที่มี statement ภาษาแอสเซมบลี โปรแกรม Editor จะจัดเก็บไฟลน้ีในรูปแบบของ ASCII Code สําหรับตัวอักขระ และตัวเลขตางๆ ตามลําดับ เพื่อนําไปเก็บใน RAM ไฟลของโปรแกรมที่สรางขึ้นดวยโปรแกรม Editor น้ีเรียกวา Source File ซึ่งจะตองนําไปผานกระบวนการตางๆ กับ Assembler เพื่อใหโปรแกรมแกรมสามารถทาํงานได ถาคุณจะใช TASM หรือ MASM ไฟลเหลาน้ีจะตองมีสวนตอขยายเปน .ASM (ไฟลตัวอยางในรูปที่ 3-15 ชื่อ MULTIPLY.ASM)

3.5.2 Assembler

เปนโปรแกรมที่ใชในการแปลความหมายของ assembly statement ใหเปน Binary Code โดย Assembler จะสรางไฟลขึ้น 2 ไฟล ไฟลหน่ึงเรียกวา Object File ท่ีมีสวนตอขยาย .OBJ ซึ่งจะบรรจ ุBinary

67

Code ของ Instruction และขอมูลท่ีเกี่ยวกับแอดเดรสของชุดคําสั่ง ซึ่งรายละเอียดของไฟลน้ีจะถกูโหลดเขาไปในหนวยความจําและ Run สวนอีกไฟลหน่ึงเรยีกวา assembler list file มีสวนตอขยาย .LST ซึ่งจะบรรจ ุassemble language statement, binary code พรอมท้ังคา offset ของแตละชุดคําสั่ง คุณมักพิมพไฟลออกมาทางเครื่องพิมพ เพื่อดูโครงสรางของโปรแกรมทั้งหมดในการตรวจสอบขอผิดพลาด ไมวาจะเปนการพิมพผิด หรือใช syntax ผิด จากน้ันก็จะสามารถใชโปรแกรม Editor แกไขไดตามที่ตองการ

รูปที่ 3 – 17 เครื่องมือในการพฒันาโปรแกรมภาษา Assembly

68

3.5.3 Linker

เปนโปรแกรมที่ใชในการเชื่อมโยง Object Files หลายๆ ไฟลท่ีมีความสัมพันธกัน เขาดวยกันเปน Object File ขนาดใหญ ในกรณีท่ีเขียนโปรแกรมขนาดใหญซึ่งแบงออกเปนโมดูลยอย หลายๆ โมดูล โมดูลยอยท่ีมีประโยชนหลายๆ โมดูลก็สามารถจัดเก็บไวใน Library File ได เชน โมดูลโปรแกรมการหารากที่สอง (Square

Root) เม่ือตองการนําโมดูลน้ีมาใชก็เพียงแตเชื่อมโยงไปยัง Library ท่ีเก็บโมดูลน้ีไว (สําหรับเครื่องคอมพิวเตอร PC จะตองรันโปรแกรม Link ทุกครั้งถึงแมวาจะมีเพียงโมดูลเดียวก็ตาม โปรแกรม Linker จะสราง link file ท่ีบรรจุ binary code ของโมดลูท่ีนํามารวมกันท้ังหมด และยังสราง link map file ท่ีบรรจุขอมูลเกี่ยวกับแอดเดรสของโมดูลท่ีนํามาเชื่อมโยงกัน แตอยางไรก็ตามโปรแกรม Linker จะยังไมกําหนดแอดเดรสสมบูรณ (Absolute

Address) ใหกับโปรแกรม แตจะกําหนดเปนเพียงแอดเดรสสัมพัทธ (Relative Address) ท่ีเริ่มตนจากแอดเดรส 0 เพื่อใหสามารถใชสวนใดๆ ของหนวยความจําในการ run โปรแกรม การดําเนินการในรูปแบบนี้เรียกวา relocatable จากน้ันโปรแกรม Linker ก็จะสรางเปนไฟลท่ีมีสวนตอขยายเปน .EXE

3.5.4 Locator

เปนโปรแกรมที่ใชในการกําหนดแอดเดรสโดยเฉพาะวาจะทําการโหลดสวนของ object code เขาไปในสวนใดของหนวยความจําเพื่อทําการ run โปรแกรม Locator ท่ีชื่อวา EXE2BIN จะใหมาพรอมกับระบบปฏิบัติการ PC-DOS ของ IBM โดยโปรแกรมนี้จะทําหนาท่ีในการแปลงไฟล .EXE ใหเปน .BIN ท่ีระบุ physical address

3.5.5 Debugger

เปนโปรแกรมที่ชวยในการแกไขปญหาขอบกพรองของโปรแกรมที่เขียนขึ้น ในกรณีท่ีโปรแกรมไมตองการติดตอกับฮารดแวรภายนอก ใหใช Debugger ในการชวยตรวจสอบ

3.5.6 Emulator

เปนโปรแกรมที่ชวยในการแกไขปญหาขอบกพรองของโปรแกรมที่เขียนขึ้นเชนกัน แตจะพิจารณาใชในกรณีท่ีโปรแกรมมีการใชฮารดแวรภายนอกระบบ เชนมีการเชื่อมตอกับอุปกรณพวงตอเครื่องคอมพิวเตอรอยางอื่น เชนเครื่องพิมพ เปนตน

69

แบบฝกหัดทายบท 1. จงเขียนรายการขั้นตอนที่สําคัญในการพัฒนาโปรแกรมภาษา Assembly 2. จงอธิบายขอดีของการออกแบบโปรแกรมโดยวธีิ Top down ในการแกปญหาดวยการใชโปรแกรมคอมพิวเตอร 3. เพราะเหตุใดจึงควรเขียน Algorithm แสดงรายละเอียดการทํางานของโปรแกรม กอนท่ีจะเริ่มลงมือเขียน

โปรแกรมภาษา Assembly 4. โครงสรางหลักในการเขียน Algorithm ของโปรแกรม มี 3 ประเภท คืออะไรบาง จงอธิบาย 5. กําหนดใหคาในรีจิสเตอรตางๆ แสดงดังรูป

ก) จงหา Physical Address ของคําสั่งถัดไปที่จะถูก fetch และ 8086 จะ fetch มาจากที่ใด ข) จงหา Physical Address ของสวนบนสุดของ stack

6. จากคารีสิสเตอรท่ีกําหนดใหในขอ 5 จงอธิบายการปฏิบัติ และผลลัพธท่ีไดจากการ execute ชุดคําสั่งตางๆ ดังตอไปนี้

ก) MOV AX, BX ข) MOV CL, 37H

ค) INC BX

ง) MOV CX, [246BH]

จ) MOV CX, 246BH ฉ) ADD AL, DH ช) MUL BX ซ) DEC BP ฌ) DIV BL ญ) SUB AX, BX ฎ) OR CL, BL

ฏ) NOT AH

70

ฐ) ROL BX, 1

ฑ) AND AL, CH

ฒ) MOV DS, AX

ณ) ROR BX, CL

ด) AND AL, OFH

ต) MOV AX, [BX]

ถ) MOV [BX] [SI], CL 7. จงหาผลลัพธท่ีสงผลตอตําแหนงการจัดเก็บในรีจิสเตอรหรือหนวยความจํา หลังจากที่กลุมของชุดตางๆ ดังตอไปนี้

ถูก fetch เขามาทํางาน จนกระทั่งเสร็จสิ้น สมมติวาคาเริ่มตนในรีสิสเตอรแตละตัวเปนไปตามที่กําหนดใหในขอ 5 ก) ADD BL, AL

MOV [0004], BL ข) MOV CL, 04

ROR DI, CL

ค) ADD AL, BH

DAA

ง) MOV BX, 000AH

MOV AL, [BX]

SUB AL, CL

INC BX

MOV [BX], AL

8. จงหาจุดท่ีผิด (Syntax error) และเขียนคําสัง่ที่ถูกตอง ของคําสั่งตางๆ ดังตอไปนี้ ก) MOV BH, AX

ข) MOV DX, CL ค) ADD AL, 2073H ง) MOV 7632H, CX จ) IN BL, 04H

9. จงเขียน Binary Code ของคําสั่งตางๆ ดังตอไปนี้ ก) MOV BL, AL

ข) MOV [BX], CX ค) ADD BX, 59H[DI] ง) SUB [2048], DH จ) XCHG CH, ES:[BX] ฉ) ROR AX, 1 ช) OUT DX, AL ซ) AND AL, 0FH ฌ) NOP ญ) IN AL, DX

71

10. จงอธิบายฟงกชนัการทํางานของ DIRECTIVE และชุดคําสั่งตางๆ ในโปรแกรมดังรูปขางลาง

11. จงอธิบายวิธีการในการพัฒนาโปรแกรมภาษา Assembly และ Debug โดยใชเครื่องมือในการพัฒนาโปรแกรม

เชน Editor, Assembler, Linker, Locator Emulator และ Debugger 12. จงเขียน Pseudo Code แสดงการทํางานของ Flow Chart ในรูปที่ 3 – 17