Document Assembly

65
Ratiwat Paresri Page 1 29/6/03 ระบบโครงสรางคอมพิวเตอร ประกอบดวย 3 สวน คือ หนวยประมวลผลกลาง (Central Processing Unit : CPU) หนวยความจํ(Memory : RAM , ROM) อุปกรณอินพุต เอาตพุต (I/O Devices) การติดตอและทํางานรวมกันตองอาศัยเสนทางในการสงผานขอมูล ที่ทําการสงทั้งสวนที่บอก ตําแหนงของอุปกรณนั้น (Address Bus) เสนทางของขอมูลที่ทําการสง (Data Bus) และเสนทางของสวนที่ควบคุมอุปกรณนั้นหรือ สัญญาณ ( Control Bus) ดังนั้น บัส (BUS)ภายในคอมพิวเตอร หมายถึง กลุมของสัญญาณที่ใชในการติดตอขอมูลตางๆ ของระบบคอมพิวเตอร ใน คอมพิวเตอรมีบัส อยู 3 ประเภท คือ แอดเดรสบัส (Address Bus) บัสขอมูล (Data Bus) และบัสควบคุม (Control Bus) 1. แอดเดรสบัส (Address Bus) จะประกอบดวยสัญญาณแอดเดรสหลายเสนขึ้นอยูกับรุนของ CPU เชน CPU 8088 หรือ 8086 จะมีทั้งหมด 20 เสน หรือ 20 บิต จะอางตําแหนงของหนวยความจําและตําแหนงพอรต 2 20 หรือ 1,048,576 หรือ 1 MB และ CPU รุนใหมๆจะมีสายสัญญาณแอด เดรสไดมากขึ้น เชน 24 เสน อางตําแหนงได 16 MB ในสวนของแอดเดรสบัสนีจะเปนบัสที่สงขอมูลออกจาก CPU ทิศทางเดียว “Unidirectional bus” 2. บัสขอมูล (Data Bus) เปนเสนทางที่ใชสงขอมูลเขาออกใหกับตัว CPU โดยทํ างานรวมกับแอดเดรสบัส ขอมูลจะวิ่งได 2 ทิศทาง เปนประเภท “directional bus” จะขนอยูกับรุนของ CPU เชน 8088 จะมีบัสขอมูล 8 เสน สงขอมูลไดครั้งละ 1 ไบต สวน 80286 จะใชบัสขอมูล 16 บิต จะทําการสงขอมูลไดครั้งละ 2 ไบต 3. บัสควบคุม (Control Bus) เปนกลุมของสัญญาณที่ใชควบคุมอุปกรณตางๆ ที่ตออยูกับ CPU เชนสัญญาณอาน-เขียนขอมูล สัญญาณอินเทอรรัพทตางๆ ไมโครโพรเซสเซอร

description

เขียนโปรแกรมภาษาแอสแซมบลี

Transcript of Document Assembly

Page 1: Document Assembly

Ratiwat Paresri Page 1 29/6/03

ระบบโครงสรางคอมพิวเตอร

ประกอบดวย 3 สวน คือ หนวยประมวลผลกลาง (Central Processing Unit : CPU) หนวยความจํ า (Memory : RAM , ROM)อุปกรณอินพุต เอาตพุต (I/O Devices) การติดตอและทํ างานรวมกันตองอาศัยเสนทางในการสงผานขอมูล ที่ทํ าการสงทั้งสวนที่บอกตํ าแหนงของอุปกรณนั้น (Address Bus) เสนทางของขอมูลที่ทํ าการสง (Data Bus) และเสนทางของสวนที่ควบคุมอุปกรณนั้นหรือสัญญาณ ( Control Bus)

ดังนั้น บัส (BUS)ภายในคอมพิวเตอร หมายถึง กลุมของสัญญาณที่ใชในการติดตอขอมูลตางๆ ของระบบคอมพิวเตอร ในคอมพิวเตอรมีบัส อยู 3 ประเภท คือ แอดเดรสบัส (Address Bus) บัสขอมูล (Data Bus) และบัสควบคุม (Control Bus)

1. แอดเดรสบัส (Address Bus)จะประกอบดวยสัญญาณแอดเดรสหลายเสนขึ้นอยูกับรุนของ CPU เชน CPU 8088 หรือ 8086 จะมีทั้งหมด 20 เสน หรือ

20 บิต จะอางตํ าแหนงของหนวยความจํ าและตํ าแหนงพอรต 220 หรือ 1,048,576 หรือ 1 MB และ CPU รุนใหมๆจะมีสายสัญญาณแอดเดรสไดมากขึ้น เชน 24 เสน อางตํ าแหนงได 16 MB ในสวนของแอดเดรสบัสนี้ จะเปนบัสที่สงขอมูลออกจาก CPU ทิศทางเดียว“Unidirectional bus”

2. บัสขอมูล (Data Bus)เปนเสนทางที่ใชสงขอมูลเขาออกใหกับตัว CPU โดยทํ างานรวมกับแอดเดรสบัส ขอมูลจะวิ่งได 2 ทิศทาง เปนประเภท

“directional bus” จะขนอยูกับรุนของ CPU เชน 8088 จะมีบัสขอมูล 8 เสน สงขอมูลไดครั้งละ 1 ไบต สวน 80286 จะใชบัสขอมูล 16 บิตจะทํ าการสงขอมูลไดครั้งละ 2 ไบต

3. บัสควบคุม (Control Bus)เปนกลุมของสัญญาณที่ใชควบคุมอุปกรณตางๆ ที่ตออยูกับ CPU เชนสัญญาณอาน-เขียนขอมูล สัญญาณอินเทอรรัพทตางๆ

ไมโครโพรเซสเซอร

Page 2: Document Assembly

Ratiwat Paresri

16 Bit Microprocessor Address Data

Bus Bus

Segment Register

Internal data Bus

Bus interface Unit (BIU)

Address generationและ bus Control

R ง ค ข ก

CSESSSDSIP

AH ALBH BLCH CLDH DL

BP DI SI SP

ALU

s

InstructionQueue

Flag

Page 2 29/6/03

Page 3: Document Assembly

Ratiwat Paresri Page 3 29/6/03

เครื่อง 8 bit 8088Data BusControl Bus รับสงขอมูลแบบ 8 bitAddress Bus

เครื่อง 16 bit 8088 ,80286,80386Data Bus → 8 bit ,16 bit อุปกรณในการติดตั้ง

Control Bus → 8 bit ,16 bit กบั CPUAddress Bus → 8 bit ,16 bit อยูใน CPU

ตัวอยาง 8 bit 16 bit

Slot(สลอต)ชองในการติดตอกัน (แผนวงจรรวม)อุปกรณ

SXเครื่อง 32 bit 80486 DX | (เพนเทียม)Petium

Dx2 Dx4

16 bit 32 bit 32 bit

Slot Data Bus Control Bus 16 bit

Address bus32 bit

AT Bus VS Bus PIC Bus(16/32 bit) (32 /64 bit)

Main Board

32 bit

CPU

Page 4: Document Assembly

Ratiwat Paresri Page 4 29/6/03

20 bit(32 bit)

Address (64 bit)280=

280 =BUS Pentium

Data bus 32 bit 8 bit

Control bus 8 bit

8088 20 bit (16 bit ) Address

BUSData bus

(16 bit )Control bus

( 16 bit )32 bit 32 bit

32 bit

64 bit Address BusCP

PCI

32 bit = ?

CPU 808φ

8086

80286

CPU

IRQ

Address

Page 5: Document Assembly

Ratiwat Paresri Page 5 29/6/03

CPU 8086 > 8088,80286

(16 bit)16 bit PSWAX Reg. พื้นฐาน 1 byte = 8 bitBXCX 8=H= High byteDX 8=L =Low byte

(ปลายทาง) Destination Index

( ตนทาง) Source Index Base Pointer Stack Pointer

Instruction, Pointer (เก็บตํ าแหนงของคํ าส่ังถัดไป)

16 Bit Pointer Register

Index Register A=5 16/16

1φφH = BP SP MOV

1φφH• Com≤ 64KB X.COM ROM Bios 100H = 256KB

X. B x B X. BAT

FlagAH8 AL8

BH8 BL8

CH8 CL8

DH8 DL8

DI SI BP SP IP

MOV

EAX

Page 6: Document Assembly

Ratiwat Paresri Page 6 29/6/03

8080 8088

Microprocessor 80286 (CPU) 80386

80486 Pentium

กี่บิต เชน 8 bit , 16bit, 32bit, 64 bitRegister กํ าหนดการทํ างาน (+ , - )(รีจีสเตอร) เปนหนวยความจํ าขนาดเล็กที่อยูใน (CPU) ที่สามารถทํ าการคํ านวณเคลื่อนยายตํ าแหนงตางๆได เครื่อง 64 bit Pentium 133 Mhz ,350 ,480Pentium pro , Pentium 166 Mhz

CPU 8080 ( =8bit ) =( Z-80 ) มี Register 8 ตัว

(ตรวจสอบคา)=flag A, B , C , D , H , L = 8 bit = Accumulator Register ( เก็บคาในการคํ านวณ )

( Program counter ) ( IP ) ชี้ตํ าแหนงคํ าส่ังถัดไปStack pointer push pop( SP ) TCP FILO IF I<10 then DIR I = I+1

PSW

A

C

E

L H

D

B

SP

PC

Page 7: Document Assembly

Ratiwat Paresri Page 7 29/6/03

Microprocesser 8080/8086

8086 8080

AXBXCXDX

การ Map จุด Register ระหวาง 8080 กับ 80868080 เปน Chip Microprocessor ระดบั 8 บิต มีการประมวลครั้งละ 8 บิต ภายใน Microprocessor มี

Accumulator (Register A ) 1ตัว มรีีจีสเตอรลํ าดับที่ 2 อีก 6 ตัว (B,C,D,E, H,และ L ) รองรับการคํ าคํ านวณทางคณิตศาสตรแบบ 8 บิต (ถาเปน Register คู กส็ามารถอาง Address ไดถึง 16 bit ได เขาถึง ได 2 … bit หรือ 64kbyte) 8086/8080 ขนาด 16 bit การอาง Register จะมีการอางแบบ 16 bit

Flags AH AL BH BL CH CL DH DL

PSW A C E L

B D H

DI SI

BP SP IP

SP PC

Page 8: Document Assembly

Ratiwat Paresri Page 8 29/6/03

AX BX CX DX

Segment ( เซกเมนต) : คือ Block ของหนวยความจํ าที่เริมตน ณ. ตํ าแหนงที่คงที่ สามารถหาได จากคาของ เซกเมนตรีจีสเตอร (Segment Register)8086 มี Segment Register อยู 4 ตัว ซึ่งสามารถชี้ไปยังตํ าแหนงใดๆ ในแอดเดรส 1 MB ก็ได

Flags AH AL BH BL CH CL DH DL

แอคคิวมูลเตอร ( Accumulator) หรือ Primary Accumulatorเบสพอยเตอร (Base Pointer) หรือ Accumulator and Base Registerเคานตรีจีเตอร (Count Register) หรือ Accumulator and Counterรีจีสเตอรขอมูล (Data Register) หรือ Accumulator and I/O Address

ทั้งหมดเรียกวารีจีสเตอรทั่วไป(General Register)

DISIBPSPIP

รีจีสเตอรปลายทาง (Destination Index)รีจีสเตอรตนทาง(Source Index)สแต็กเตอรเบสพอยเตอร(Stask Base Pointer)พอยตเตอร (Instruction Pointer)

Index Register

CSDSSSES

โคดเซกเมนต ( Code Segment )ดาตาเซกเมนต(Data Segment)สแต็กเซกเมนต (Stack Segment)เอ็กซตราเมนต (Extra Segment)

Segment Register

Page 9: Document Assembly

Ratiwat Paresri Page 9 29/6/03

ตัวโปรแกรม DS=ES หนวยความจํ า CS-(code Segment Register ) ใชสํ าหรับเรียกหรือ กระโดดไปยังตํ าแหนงที่กํ าหนดภายในขอบเขตของ Code Segment

DS-(Data Segment Register) ใชสํ าหรับอางอิงหนวยความจํ าสวนใหญSS ภายในขอบเขตของเซกเมนตขอมูล D ( Segment Register) คํ าส่ัง PUSH และ POP จะเขาถึงขอมูล

ใน Stack ดังนั้นการอางอิงหนวยความสามารถทํ าไดโดยใชคาสัมพันธ จากรีสเตอร BP ซึ่งจะชี้ไปยัง Stack Segment ES -(Extra Segment Register) เซกเมนตนี้สํ าหรับเปน Segment ปลายทาง ของคํ าส่ัง ประมวลผล String

SI

DI SS Stack

Page 10: Document Assembly

Ratiwat Paresri Page 10 29/6/03

Register ( รีจีสเตอร) หนวยความจํ าขนาดเล็กที่มีอยุใน CPU

Accumulator (คํ านวณ)Base Register (ทั่วไป)Counter Register (ต๋ัวนับ)Data Register (ขอมูล)

Destination Index Source Index

Base Pointer Stack Pointer Instruction Pointer

Code segment Data Segment Stack Segment Extra Segment

Segment : คือ Block ของหนวยความจํ าที่เริ่มตน ณ ตํ าแหนงคงที่ สามารถ หาไดจากคาของ Segment Register

Pointer and Index Register (รีจสีเตอรตัวชี้ และอินเด็กซ)SP (Stack Pointer) ใชชีห้นวยความจํ าที่เปน stack โดยใชรวมกับ รีจีสเตอร SSBP (Base Pointer) ใชชี้ตํ าแหนงของขอมูลคลายกับรีจีสเตอร SP แตชี้ตํ าแหนงของขอมูล ทั่วไปSI (Source Index) ใชรวมกับรีจีสเตอร DS ใชชีตํ้ าแหนงของหนวยความจํ าขอมูลDI (Destination Index) คลายกับ SI แตจะท ํางานเกี่ยวกับสตริง และทํ างานรวมกับรีจีสเตอร BS

Flag AH AL BH BL CH CL DH DL

DI SI

BP SP IP

CSDSSSES

Page 11: Document Assembly

Ratiwat Paresri Page 11 29/6/03

Segment Registers (รีจีสเตอรเซกเมนต): เปนรีจีสเตอรในสวนของ BIU ทีใ่ชในการอางตํ าแหนงหนวยความจํ าเมื่อตองการอาน

เขยีนขอมูล โดยจะแบงหนวยความจํ าออกเปน SegmentCS : ใชเก็บคาเซกเมนตแอดเดรสเอาไว หรือตํ าแหนงของโปรแกรมใน code segment โดยจะ ท ํางานรวมกับรีจีสเตอร ชี้คํ าสั่ง IP ซึง่เปนคาออฟเซต ในการชี้ตํ าแหนงคํ าสั่งโปรแกรมDS : ใชเก็บคาตํ าแหนงเซกเมนตสวนที่เปนขอมูล หรือ data Segment โดยทัว่ไปจะใชในการอาง แอดเดรสที่เก็บขอมูลสตริง ขอมูลที่อยูใน DS จะถกูน ํามาบวกคา ออฟเซต เพื่ออางตํ าแหนง หนวยความจํ าที่ตองการติดตอSS : ใชเก็บตํ าแหนงเซกเมนต สวนที่เปนหนวยความจํ าแสตก หรือ Stack segment โดยจะทํ างาน รวมกับรีจีสเตอร SP หรือตัวชี้แสตกES : ใชชี ้แอดเดรส หนวยความจํ าที่เปน extra segment โดยใชรวมกับรีจีสเตอร DIรีจีสเตอรคํ าสั่ง (Instruction Pointer)

จะท ํางานรวมกับรีจีสเตอร CS โดยจะใชเก็บตํ าแหนงคํ าสั่งถัดไปที่จะใชไมโครโพรเซสเซอรทํ างาน

รีจีสเตอรแฟลก (Flags Register)ใชเกบ็สถานะตาง ๆ จากการประมวลผลของไมโครโพรเซสเซอร เมื่อไมโครโพรเซสเซอรทํ า

คํ าสั่ง ผลลัพธที่ไดอาจมีผลตอแฟลกเพื่อบอกสถานะของผลลัพธที่ไดแบงเปน 2 สวน- แฟลกสถานะ (Status Flags)- แฟลกควบคุม (Control Flags) โดยมีคาบิตตาง ๆเชน เมื่อมีการลบเลขแลวไดคา Ø แฟลก ZE (Zero flag) จะถูกเซต็เปน 1 (เปน flag

สถานะ) ถาแฟลก IF (interrupt flag) ทีอ่ยูในกลุมของ flag ควบคุม ถูกเซต็หมายความวาอุปกรณภายนอกสามารถขัดจังหวะ (interrupt)

OF (Overflow Flag) : เปนบติกรณีผลลัพธที่ไดจากการคํ านวณมีคาเกินกวาที่Register จะเก็บได

DF (Direction Flag) : เปนบติก ําหนดทิศทางการเคลื่อนที่ของขอมูลสตริงวาจะใหเคลื่อนที่จากซาย ขวา หรือ ขวา ซาย

Page 12: Document Assembly

Ratiwat Paresri Page 12 29/6/03

IF (Interrupt Flag) : เปนบิตกํ าหนดใหยอมรับการ interrupt จากภายนอก ถาเปน1 หมายความวา CPU ถูกอินเทอรรัพตจากภายนอกได แตถาเปน Ø หมายความ

วา CPU จะถูกอินเทอรรัพต จากภายนอกไมได TF (Trap Flag) : เปนบติทีบ่อกใหไมโครโพรเซสเซอรทํ างานทีละคํ าสั่ง ถาบิตนี้ถูก

เซ็ตเปน 1 CPU จะท ํางานแบบซงิเกิลสเตป (Single Step) ซึง่ท ําใหเราสามารถดูผลการทํ างานในแตละคํ าสั่งได

Bus Interface Unit (BIU): ท ําหนาทีเ่ชือ่มตอบัสในการสงขอมูลตาง ๆ ควบคุมการเขาถึงหนวยจํ า และการติดตอกับ

อุปกรณภายนอกตาง ๆ ของตัวไมโครโพรเซสเซอร หนวยควบคุมบัส (Bus Control) รีจีสเตอรเซกเมนต (Segment register) วงจรลอจกิทีใ่ชอางตํ าแหนงหนวยความจํ า (memory Address logic)

Execute Unit (EU): ท ําหนาที่ประมวลผลรหัสคํ าสั่ง และขอมูลที่ไดรับมาจาก BIU การเปลี่ยนแปลง หรือการ

กระท ํากับขอมูลใด ๆ จะตองเกิดจากสวน EU ประกอบดวยรีจสีเตอรที่ใชงานทั่วไป AX BX CX SP (stack Pointer) BP (Base Pointer) SI (Source Index) DI (Destination Index)

วงจรการทํ างานของคอมพิวเตอรอานคํ าสั่ง (Read) ถอดรหัสคํ าสั่ง (fetch) ท ํางานตามคํ าสั่ง (Execute)เรียกวา fetch and execute cycle การท ํางานคํ าสั่งหลาย ๆ คํ าสั่งตอกัน เรียกวา การ

ท ํางานโปรแกรม

Page 13: Document Assembly

Ratiwat Paresri Page 13 29/6/03

โครงสรางแฟล็ก 8086/8088 ที่ใชในการทดสอบการทํ างานของซีพียู แฟล็กสถานะ แฟล็กควบคุม

OF DF IF TF SF ZF AF PF CF15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0ลํ าดับของบิต คือ 0-15 ( จํ านวน 16 บิต) CF (Carry Flag)PF (Parity Flag)AF (Auxiliary Flag)ZF (Zero Flag)SF (Sign Flag)TF (Trap Flag)IF (interrupt Enable Flag),Of ( Overflow Flag) หนาทีก่ารท ํางาน และความหมายของแฟลกSet(=1) Clear(=0) ตัวยอ ชื่อแฟลก็ ตํ าแหนงของบิต ความหมาย(Yes) (No)CY NC CF Carry Flag 0 มคีา1 ถาการบวกมีการทดไปขางหนา Carry หรือ การลบเกิดการขอยืมจากขางหนา Borry มคีา 0 กรณีนอกจากนี้ที่กลาวมาแลว ไมมีการทด หรือ ขอยืม นอกจากนี ้CF ยังใชเก็บคาบิตที่ถูก Shift หรือ Rotateออก จาก รีจสีเตอร หรือ หนวยความจํ า

PE Po PF Parity Flag 2 จะตรวจสอบสํ าหรับ 8 bit แรก ไมใช 16 บิต(Even) (Odd) มคีา1เมื่อผลการปฎบัิตการ มีคาของบิตเปน 1 จํ านวนคู (Even parity)(คู) (ค่ี) มีคา0เมื่อผลการปฎบัิตการ มีคาของบิตเปน 1 จํ านวนคี่ (Odd parity)

AC NA Af Auxiliary Carry Flag เรียกวา” ใชในการปรับคา เลขฐาน10 ”Packed decimal number” ใชลักษณะเดียวกับ CF

Page 14: Document Assembly

Ratiwat Paresri Page 14 29/6/03

ZR NZ ZF Zero Flag 6 มคีา1 เมื่อผลการปฎบัิติการ ใหคาเปน 0(ใน PSW) มคีา0 เมื่อผลการปฎบัิติการ ไมใหคาเปน 0

NG PL SF Sign Flag 7(Negative) ( Positive) ดุบิตที่ 15 ของผลลัพธ ใช เมื่อมีการปฎิบัติการเกี่ยวกยัคา บวก ลบ แฟลก็นีจ้ะมีคา 0หรือ 1ตามบิตที่ 15 ของผลลัพธ

TF Trap Flag 8 ใชในการหาขอผิดพลาด (Debug) ของโปรแกรม ซึ่งไมโครโปรเซส เซอร 8088 ปฎิบัติการในโหมด Single Step

EI DI IF Interrupt Endle Flag 9(Enable) (Disable) มคีา 1 ไมโคร โปรเซสเซอร 8088 จะรับรูการ Internet

มคีา 0 ไมโคร โปรเซสเซอร 8088 จะไมรับรูการ Internet

DN UP DF Direction Flag 10Decrement Increment มคีา 1 ไมโคร โปรเซสเซอร 8088 จะลบคาออกจาก IndexRegister

โดยอตัโนมัติหลังจากปฏิบัติการบน StringSet(=1) Clear( =0) ตัวยอ ชื่อแฟล็ก ต ําแหนงของบิต ความหมาย(Yes) (No)

มคีา 0 ไมโคร โปรเซสเซอร 8088 จะเพิ่มคาใหแก Index Rehister โดยหลังปฏิบัติการบน String

DF =1 ไมโคร โปรเซสเซอร 8088 จะปฏิบัติการบน String จาก ขวา ไปซาย

DF =0 ไมโคร โปรเซสเซอร 8088 จะปฏิบัติการบน String จาก ซาย ไปขวา

OV NV OF Overflow Flag 11

Page 15: Document Assembly

Ratiwat Paresri Page 15 29/6/03

ใชบอก 3 ขอ คือ1) มคีา 1ถาบวก ลบ เลข 2 ตัว ทํ าใหเกิดผลลัพธ มากเกินกวาที่

จะบรรจเุนื้อที่ที่กํ าหนดไว ถาไมเกินจะมีคาเปน 02) หรือ มีคาเปน 1 เมื่อ Sign Bit ของ Operand เกดิการเปลี่ยนคาขณะ ที่ทํ า Arithmetic Shift ถา OF =0 จะไมมีการเปลี่ยนแปลง

3)OF และ CF ใชรวมกันในการบอกความยาวของผลคูณ ถาครึ่งบน ของผลคูณไมใช 0 OF และ CF จะไมมีคาเปน 1

****Overflow นีใ้ชคิดบิตที่ 15 (เร่ิมนับที่0) ของผลลัพธ แฟล็กนี้จะเซ็ตเปน 1 เมื่อผลลัพธมากเกนิไป หรือนอยเกินไปที่จะเก็บที่ Register ปลายทาง****

=ในการดีบัก(Debbug) เมือ่พิมพคํ าวา “ Debug” จะไดดังตอไปนี้ -นีคื่อเครื่องหมายพรั๊อม (Prompt) เปนการเตรียมพรอมรับคํ าสั่งจาก Debug ตัวอยางเชน –R เปนคํ าสั่งในการตรวจสอบคาในจีสเตอรตางๆ

General Register Pointer Index RegisterAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1A03 ES=1A03 SS=1A03 CS=1A03 IP=0100 NV UP EI NZ NA PO NC

Segment Register Pointer Flags

1A03:0100 OF ADD AX,BX Segment : Offset Address Mnemonic

(นีมอนกิ คือคํ าสั่ง) ใน 1 Segment สามารถอางอิง Offset ได 164 =64K

Page 16: Document Assembly

Ratiwat Paresri Page 16 29/6/03

Flags ( แฟลก )16 bits จะมีคาของแตละ บิต• แฟลกควบคุม ( Control Flag )• แฟลกตรวจสอบสถานะ ( Status Flag )

CF (Carry Flag ) : เก็บตัวทดPF ( Parity Flag ) : ตรวจสอบ เลขคู , ตรวจสอบเลขคี่AF ( Auxiliary Flag ) : ตัวทดชวย , BCDZF ( Zero Flag ) : แฟลกศูนยSF ( Sign Flag ) : แฟลกเครื่องหมาย + , -TF ( Trap Flag ) : แฟลกจัดจังหวะ บอกไมโครโพรเซสเซอรทํ างานที่ละ 1 คํ าส่ังIF ( Interrupt Flag ) : Contrel flagDF ( Direction Flag ) : Contrel flagOF ( Overflow Flag ) : ตรวจสอบผลลัพธที่ไดจากการคํ านวณวามีขนาดเกินกวาคาที่

Register จะรับได∅111 : จํ านวนเลขคี่∅∅11 : จํ านวนเลขคู CF - NC ( No Carry ) ไมมีตัวทด

- CY ( Catty ) มีตัวทด

การกํ าหนดคาใหกับ Register1. Mov ชื่อรีจีสเตอร , คาที่จะกํ าหนดให

เชน - Mov AX ,∅ 3- Mov AL , ∅ 5- Mov AX , ∅5F1- Mov AH , ∅2

Clear รีจีสเตอร ip- Rip

: ∅1∅∅

2. แลกคาระหวาง Reg + RegMov ชื่อ Reg , ชื่อ Reg

เชน Mov AX , BXตัวอยาง - r bx

Page 17: Document Assembly

Ratiwat Paresri Page 17 29/6/03

การเขียนโปรแกรมภาษา แอสแซมบลี้ (Assembly ) เขียนได 2 แบบ

1) ใชโปรแกรมภาษา แอสแซมบลี้ คือ TASM (Turbo Assmbluy) หรือ MASM (MacroAssembly ) โดยทั่วไปเขียนดวยวิธีนี้

2) ใชโปรแกรม Debug (ดีบัก) แตดีบักไมใชโปรแกรม Assembler แตสามารถเขียนโปรแกรมภาษา แอสแซมบล้ี ส้ันๆ ได ถาเปนโปรแกรมยาวๆไมควรใช ในการใชดีบัก สะดวกวาใช MASM หรือ TASM การพิมพและการรันโปรแกรมสามารถทํ าใน Debug ไดทันที ถาใน Assembler ตองใชตัวพิมพโปรแกรม (Text Editor) ใชตัว Assembler และใชโปรแกรม Link และ Exe2bin เพือ่เปล่ียนแปลง .Com ได เปรียบเทียบการทํ างานระหวาง Debug กับ Assembler

Debug Assembler1. Run ไดงาย 1. Run ไดยาก2. ไมมีโปรแกรมในสวนหัว (Heading Program) 2. มโีปรแกรมในสวนหัวมาก3.เปนค ําสั่งที่ใกลเคียงกลับภาษาเครื่องมาก 3. การเขียนคํ าสั่งจะตองมีรูปแบบ4. ความสามารถไมสูงมากนัก 4. ความสามารถสูงมาก5.ใชกับโปรแกรมสั้นๆไดดี 5. ใชกับโปรแกรมยาวๆไดดี

คํ าสั่งที่ใชในการดีบัก (Debug)วิธีเขาสูการดีบัก (Debug)• ออกไปที่ Dos Prompt จะได C:\>• พมิพคํ าวา Debug จะไดสัญลักษณ “-”- E คือ Enter ตามดวยตํ าแหนงที่จะใสขอมูลลงไป (ปอนขอมูลขนาด 1 byte หรือ หลายไบต)

เชน E100 หมายถงึ การใสขอมูลในตํ าแหนง 100h (ตํ าแหนง Offset)- A คือ คํ าสั่ง Assembler การปอนขอมูลเขาไปในหนวยความจํ า โดยการใชคํ าสั่ง

(Mnemonic Symbols) ไมตองปอนตัวเลขฐาน 16 เหมือนกับคํ าสั่ง E เชน A100 หลังจากนั้นใหใสคํ าสั่งไป ตัวอยาง ADD AX,BX

- U คือ คํ าสั่ง Unassembler เปนค ําสัง่ที่ทํ าการแปลงคาของคํ าสั่งนั้นเปนโปรแกรมกลับคืนมาใหเราดู เมื่อนํ าขอมูลเขาไปแบบ A หรือ E จะท ําการแปลงเปนสัญลักษณ Mnemonic ไปเปนเลขฐาน 16 แตคํ าสั่ง U จะท ําการแปลงเลขฐาน 16 เปนรหัส Mnemonicรูปแบบ – U จะเปนการดูโปรแกรมทั้ง Segment

Page 18: Document Assembly

Ratiwat Paresri Page 18 29/6/03

U ตํ าแหนง Offset เริ่มตน, ตํ าแหนง Offset สดุทาย หมายถึงการดูโปรแกรมเปนชวง

- G คือ คํ าสั่ง GO เปนการประมวลผลคํ าสั่งที่ปอนเขาไปทั้งหมด เชน G- T คือ คํ าสั่ง Trace เปนค ําสั่งที่ใชในการประมวลผลครางละ 1 คํ าสั่ง เชน T- D คือ Dump Address เปนการดตํู าแหนงการเก็บขอมูลนั้น ข้ึนมาปรากฏบนหนาจอ เชน D

ตามดวยคาของตํ าแหนง ตัวอยางเชน D100 เปนการดูขอมูลตัวเลขฐาน 16 ที่จัดเก็บในเครื่องในตํ าแหนง Offset 100h

Register (รีจีสเตอร) คือ หนวยความจํ าชนิดซึ่งแตกตางจาก ROM (Random Only Memory: เปนหนวยความจํ าที่อยูติดกับแผนวงจรหลักของเครื่อง ไมสามารถเพิ่มขยายขนาดได) และRAM (Random Access Memory : เปนหนวยความจํ าที่สามารถเพิ่มขยายขนาดได) ซึ่งเปนเพยีงทีพ่กัขอมลูหรือคอยเก็บขอมูลไวเทานั้นเอง แต รีจีสเตอร นั้นสามารถใชในการคํ านวณนั้นไปเกบ็ไว เปนหนวยความจํ าที่อยูใน ไมโครโปรเซสเซอร ถาเปนของ 8088 จะมีขนาด 16 บิต ดังนั้นรีจีสเตอรจะมีขนาด 16 บิตดวย

รูปประกอบตัวอยางSegment : Offset 03 EB 42 90 75 03 EB 41-90 2C 30 72 32 3C 0A 73

08F1 : 0100 0308F1 : 0101 EB08F1 : 0102 4208F1 : 0103 9008F1 : 0104 7508F1 : 0105 0308F1 : 0106 EB

08F1 : 010F 7308F1 : 0110

01010102

Page 19: Document Assembly

Ratiwat Paresri Page 19 29/6/03

SEGMENT (เซกเมนต) 8088 Register มขีนาด 1 WORD คามากที่สุดที่รีจีสเตอรจะเก็บไดคือ 65535 ดังนั้นจะ

ตองใช Register 2 ตัว8088 ท ําการแบงหนวยความจํ าเปน Segment โดยที่แตละ Segment จะถกูอางถึงโดย

เซกเมนต รีจีสเตอร (เชน CS) และ Address ภายใน Segment จะถกูอางโดยรีจีสเตอรอีกตัวหนึ่ง(เชน IP) เรียก Address ภายในนี้วา offset (ออฟเซต)

* ภายใน Segment หนึง่ ๆ จงึอางหนวยความจํ าไดเพียง 1 WORD (64K)

Page 20: Document Assembly

Ratiwat Paresri Page 20 29/6/03

รูปประกอบตัวอยางSegment : Offset 03 EB 42 90 75 03 EB 41-90 2C 72 323C OA 7308F1: 010008F1 : 0100

010101020103010401050106

01

08f1 : 0110 ตัวอยาง การทํ างานของการดีบัก- RB X ; เปนการกํ าหนดคาลงไปใน รีจีสเตอร BXBX 0000: 45BF ; ใสคา 1234 ฐาน 16 ลงไป- E 1003756 : 0100 E4.01; ใสคา 01 ลงไป- E 1013756 : 0101 85.D8 ; ใสคา D8 ลงไปแลวใช –R เชค็คาในรีจีสเตอรดู จะกลายเปนคํ าสั่ง ADD AX,BX มรีหสัเทากับ 01D8เมือ่ตองการประมวลผล ใชคํ าสั่ง T จะไดผลลัพธเก็บไวใน Register AX และเราสามารถตรวจสอบคํ าสั่งที่เครื่องเขียนลงไปได โดยการใชคํ าสั่ง Uในการจดจ ําคาตวัเลขของคํ าสั่งนั้นยากตอการจํ า ทํ าใหไมสะดวกในการทํ างานฉะนั้นจึงมีวิธีแกไขคือเราสามารถพิมพคํ าสั่งลงไปในการดีบักได โดยใชคํ าสั่งตอไปนี้- A100 คือคํ าสั่ง Assembler ทีตํ่ าแหนงที่ 100h ซึง่การเขียนโปรแกรมนั้นจะตองเขียนตั้งแตตํ าแหนงนีข้ึ้นไปไมสามารถเขียนในตํ าแหนงที่ต่ํ ากวานี้ไดเนื่องจาก เปนตํ าแหนงซึ่งเปนพื้นที่ของ

03EB42907503EB

73

Page 21: Document Assembly

Ratiwat Paresri Page 21 29/6/03

Rom-Bios, Video Ram, ตาราง Interupt เปนสวนที่หามเขียนทับเพราะ Dos และเครื่องตองอาศัยหนวยความจํ าสวนนี้ในการทํ างานตัวอยางคํ าสั่งในการบวก- A10008F1 : 0100 ADD AX,BX ; หมายเหต ุจะตองมีการกํ าหนดคาใหกับ รีจีสเตอร AX และ BX กอน08F1 : 0102- U 100, 102 ; ตรวจสอบดูคาของคํ าสั่งวาเปน 01D8 จริงหรือไม- T ; ประมวลผลคํ าสั่ง- R ; ตรวจสอบดูคาของรีจีสเตอรใดที่เปลี่ยนไป และตํ าแหนง IP- Q ; ออกจากดีบักคํ าสั่งตาง ๆการลบ (SUBTRACT) รูปแบบ SUB AX,BX รีจีสเตอร AX จะเปนตัวตั้ง BX จะเปนตัวลบ เมื่อลบเรียบรอยแลว จะเก็บผลลัพธไวที่ AX โดยการใชคํ าสั่ง SUB AX,BX (มคีาเทากับ 29D8)การคูณ (Multiply) รูปแบบ MUL BX ผลลัพธที่ไดจะเก็บไวในรีจีสเตอร AX และ DX โดยการใชคํ าสั่ง MUL BXคือคํ าสั่ง Multiply

โดยไมเหมือนกับคํ าสั่ง MOV,ADD,SUB เพราะมีรีจีสเตอรเดียว การคูณนี้เปนการคูณเลข16 บิต หากคูณกันแลวอาจเกิน 16 บิต ดังนั้นจะมีรีจีสเตอร DX ไวเกบ็สวนที่เกินขึ้นมา จะได DX(เก็บคา 16 บิตบน) และ AX(เก็บคา 16 บิตลาง)การหาร (Divide) รูปแบบ DIV BX ผลลัพธที่ไดจะเก็บไวในรีจีสเตอร AX และ DX โดยไมเหมือนกับคํ าสั่งMOV,ADD,SUB

เพราะมรีีจสีเตอรเดียว จะไดทั้ง เศษ และ จํ านวนเต็ม ดังนั้นจะมีรีจีสเตอร DX ไวเก็บสวนทีเ่ปนเศษ และ AX จะเกบ็คาที่เปนจํ านวนเต็ม*** หมายเหต ุในการท ํางานเกี่ยวกับคํ าสั่งที่อยูใน ดีบัก หากมีการทํ าคํ าสั่งกอนหนานั้นแลว 1 คํ าส่ังจะทํ าให IP เปลีย่นต ําแหนงในการชี้ขอมูลออกไป จะตองมีการกํ าหนดคา IP ใหชี้ตรงกับตํ าแหนงที่เขียนคํ าสั่งลงไป เชน

Page 22: Document Assembly

Ratiwat Paresri Page 22 29/6/03

- A100 ; คือ การเขียนโปรแกรมคํ าสั่งเริ่มในตํ าแหนง 100h เพราะฉะนั้น IP จะตองเทากับ 100ดวย ***การขัดจังหวะ (Interrupt) รูปแบบ INT หมายเลขของอินเตอรรัพต

เปนค ําสั่งการเรียกใชโปรแกรมยอย หรือ กระโดดไปยังตารางการขัดจังหวะ (InterruptTable)

โปรแกรมยอยนั้นเปน โปรแกรมที่อยูบนเครื่อง เชน การแสดงขอความบนจอภาพ, การรับคาตวัอกัษรจากแปนพิมพ, การอาน-เขียนดิสก เปนตน ตัวอยาง

INT 21 เปนการขัดจังหวะ โดยกระโดดไปยังตาราง อินเตอรรัพต เพื่อการทํ างานบางอยาง และอางถึงฟงกชัน่การใชงานตาง ๆ เชน

MOV AH,02 ; เปนการกํ าหนดคาฟงกชัน่หมายเลข 2 คือการแสดงผลออกมาบนจอภาพ

INT 21 ; เปนการอางถึงตารางอินเตอรรัพตของDOS เพือ่การเรียกใชฟงกชั่น

INT 20 เปนการบอกการจบการทํ างานของโปรแกรมเมื่อทํ างานเสร็จมักจะอยูหลังคํ าสั่งINT 21คํ าสัง่ในการใสขอมูลเขาไปในรีจีสเตอร หรอืยายขอมูลระหวางรีจีสเตอรMOV รจีสีเตอร 8 บิตตัวที่ 1, รีจีสเตอร 8 บิตตัวที่ 2 ; เปนการยายรีจีสเตอรจากตัวที่ 2 มาที่ตัวที่1 เชน

MOV AH,DL ; เปนการยายขอมูลเปนไบต เชน AX = 0123, DX = 4DF1 เมือ่ทํ าการยายจะไดAX = F134 และ DX จะไมเปลี่ยนแปลงMOV รจีสีเตอร 16 บิต, รีจีสเตอร 16 บิต ; เปนการยายรีจีสเตอรจากตัวที่ 2 มาตัวที่ 1 เชน

MOV DX,AX ; เปนการยายขอมูลเปนเวิรด เชน AX = 4567, DX = A654 เมือ่ทํ าการยายจะไดDX = 4567 และ AX จะไมเปลี่ยนแปลงMOV รีจีเตอร 16 บิต, คาขอมูล ; เปนการยายคาขอมูลมาไวที่รีจีสเตอร 16 บิต เชน

MOV AH, 02 ; เปนการยายคา 02 ไปไวในรีจีสเตอร AHMOV รจีสีเตอร 8 บิต, คาขอมูล ; เปนการยายคาขอมูลมาไวที่รีจีสเตอร 8 บิต เชน

MOV DL, 41 ; เปนการยายคา 41h ไปไวในรีจีสเตอร DL

Page 23: Document Assembly

Ratiwat Paresri Page 23 29/6/03

ข้ันตอนการบันทึกขอมูลเก็บไวในแฟมเมือ่มกีารพมิพคาตาง ๆ ในดีบักเรียบรอยแลวหากเราบันทึกเก็บไวเปนแฟมนามสกุล .COM (ซึ่งมีขนาดไมเกิน64 Kbyte) ท ําได ดังนี้- N ชื่อโปรแกรม.COM เปนการตั้งชื่อใหกับโปกแกรม (Initialize) หลงัจากนั้นจะกํ าหนดขนาด

เนือ้ที่ของแฟมที่จะจัดเก็บ- RCX เปนการก ําหนดขนาดพื้นที่ในการจัดเก็บแฟมนั้น ๆ ขนาดที่จะเก็บดูไดจาก ตํ าแหนง

Offset ในบรรทัดสุดทาย วาเปนเทาไหร โดยท ําการหาจาก ตํ าแหนงที่เร่ิมตนเขียน - ตํ าแหนงสุดทายที่เขียนเสร็จ

- W เปนการกํ าหนดบันทึกเก็บไว (Writing)ตัวอยางโปรแกรม c/>debug***โปรแกรมในการพิมพรหัส ASCII ออกมาบนจอภาพ ออกมาเรื่อยๆ-A 100Segment : 0100 MOV DL,O ; ใสตัวอักษรตัวแรกในรีจีสเตอร DLSegment : 0102 MOV AH,02 ; ก ําหนดฟงกชัน่การแสดงผลออกบนจอภาพSegment : 0104 INT 21 ; เรียกการขัดจังหวะจาก DOSSegment : 0108 JMP 102 ; กระโดดกลับไปแสดงอักษรตัวถัดไปขึ้นมาSegment : 010A ; กด Enter-G-Nascl.com ; บันทกึไวในชื่อแฟม ascl .com-RCX ; ก ําหนดรีจีสเตอรที่ใชเก็บขนาดแฟม: 000A ; ขนาดของแฟม

Page 24: Document Assembly

Ratiwat Paresri Page 24 29/6/03

C:> Debug (แสดงคาของจอภาพ)- A1φφ ฟงกชั่นหมายเลข 2H แสดงวา*ออกจอภาพ-: 100 MOV AH ,φ2-: 102 MOV DL , 2A-: ----- INT 21 DOS

-: ----- INT 20 รหัส Ascii-: ----- ↵-: --------g ( go)

ตัวอยางโปรแกรม c/>debug***โปรแกรมในการพิมพรหัส ASCII ออกมาบนจอภาพ ออกมาเรื่อยๆ-A 100Segment : 0100 MOV DL,O ; ใสตัวอักษรตัวแรกในรีจีสเตอร DLSegment : 0102 MOV AH,02 ; กํ าหนดฟงกชั่นการแสดงผลออกบนจอภาพSegment : 0104 INT 21 ; เรียกการขัดจังหวะจาก DOSSegment : 0108 JMP 102 ; กระโดดกลับไปแสดงอักษรตัวถัดไปขึ้นมาSegment : 010A ; กด Enter-G-Nascl.com ; บันทึกไวในชื่อแฟม ascl .com-RCX ; กํ าหนดรีจีสเตอรที่ใชเก็บขนาดแฟม: 000A ; ขนาดของแฟม-W ;บันทึกลงไว*** หมายเหตุโปรแกรมนี้จะเปนโปรแกรมพิมพรหัสแอสกี้ออกมา 256 ตัวพิมพไปเรื่อย หากตองการหยุดใหกดctrl +Break ****

Page 25: Document Assembly

Ratiwat Paresri Page 25 29/6/03

คํ าส่ังเพิ่มเติมคํ าส่ังเพ่ิมเติมคา INC (Increment) เปนการเพิ่มคาครั้งละ 1 ใชในรีจีสเตอร ตัวใดก็ไดรูปแบบ INC ช่ือรีจีสเตอรที่จะเพ่ิม (ตองมีการกํ าหนดคารีจีสเตอรขึ้นมากอน)

เชน MOV DL,O ;กํ าหนดคาใหกับรีจีสเตอร DL INC DL ; เพิ่มคาในรีจีสเตอร DL ขึ้นอีก 1 (DL =DL+1)

คํ าส่ังในการรวนรอบ LOOPIรูปแบบ LOOP ตํ าแหนงที่ตองการใหวนรอบ (ตํ าแหนง OFFSET)

คํ าส่ังในการวนรอบนี้จะเกี่ยวของกับ รีจีสเตอร CX (Counter Registe )จะตองมีการกํ าหนดคาในรีจีสเตอรนี้ขึ้นมากอนวามีจํ านวนครั้งในการวนรอบกี่ครั้ง เมื่อใดที่ทํ าการ RUN หรือ Excute คํ าส่ัง LOOP ก็จะลดคาของ CX ลงครั้งละ 1 ๆไปเรื่อย จนกระทั่ง CX มีคา =0 ก็จะทํ างานตามคํ าส่ังถัดไปตอจาก LOOP

ตัวอยาง บันทึกไวในแฟม ASC2. Com-A100Segment : 0100 MOV CX , 100 ; กํ าหนดจํ านวนครั้งในการนับที่ CX = 256ครั้งSegment :0103 MOV DL , 0 ;ใสคา แอสกี้ตัวแรก 0 ไวในรีจีสเตอร DLSegment :0105 MOV AH , 02 ; กํ าหนด Function การแสดงผลออกจอภาพคือ funcion 2Segment :0107 INT 21 ; เรียกใช Interrupt จาก Dos (เพื่อคา ฟงกชั่นมาใชงาน)Segment :0109 INC DL ; เพิ่มคา แอสกี้ขึ้นอีก 1 (ที่กํ าหนดไวในรีจีสเตอร DL )Segment :010B LOOP 105 ; กระโดดไปที่ตํ าแหนง 105 เพื่อแสดงคาของรหัสแอสกี้ตัว ถัดไป (รวมทั้งการลดคาใน Register CX ลงครั้ง ละ 1 จนกระทั่ง CX = 0)Segment : 010D INT 20 ; จบโปรแกรมSegment : 010F ; Enter-G ; ทดสอบโปรแกรม-RCX ; กํ าหนดเนื้อที่ในการเก็บแฟมนี้: OOOF-W ; บันทึกเก็บไว-Q ; ออกจาก ดีบัก*** หมายเหตุ คา CX = 100h มีคา = 1×162= 256 ครั้ง และเมื่อพิมพคาของรหัสแอสกี้ครบ 256 ตัวโปรแกรมก็จะจบการทํ างาน ไมเหมือนโปรแกรมกอนหนานี้ซึ่งตองใชการกด Ctrl + Break ****

Page 26: Document Assembly

Ratiwat Paresri Page 26 29/6/03

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

-A100คือคํ าสั่ง Assembler ทีตํ่ าแหนงที่ 100 h ซึง่เปนการเขียนโปรแกรมนั้นจะตองเขียนตั้งแตตํ าแหนงนีข้ึ้นไปไมสามารถเขียนในตํ าแหนงที่ต่ํ ากวานี้ไดเนื่องจาก เปนตํ าแหนงซึ่งเปนพื้นที่ของ Rom - Bios, video Ram, ตาราง Interrupt เปนสวนที่หามเขียนทับเพราะ Dos และเครื่องตองอาศยัหนวยความจํ าสวนนี้ในการทํ างานตัวอยาง คํ าสั่งในการบวก-A10008F1 :0100 ADD AX ,BX ; หมายเหตุ จะตองมีการกํ าหนดใหกับ รีจีสเตอร AX และ BX กอน08F1:0102-U 100, 102 ; ตรวจสอบดูคาของคํ าสั่งวาเปน 01D8 จริงหรือไม-T ; ประมวลผลคํ าสั่ง-R ;ตรวจสอบดูคาของรีจีสเตอรใดที่เปลี่ยนไป และตํ าแหนง IP-q ; ออกจากดีบักคํ าสั่งตางๆการลบ ( SUBTRACT) รูปแบบSUB AX,BX รีจีสเตอร AX จะเปนตัวตั้ง BX จะเปนตัวลบ เมื่อลบเรียบรอยแลว จะ

เก็บผลลัพธไวที่ AX โดยการใชคํ าสั่ง SUB AX ,BX (มคีาเทากับ29D8)

การคูณ (Multiply) รูปแบบ MUL BXผล ลัพธที่ไดจะเก็บไวในรีจีสเตอร AX และ DX โดยการใชคํ าสั่งMUL BX คือคํ าสั่ง Multiplyโดยไมเหมือนกับคํ าสั่ง MOV ,ADD ,SUB เพราะมรีีจีสเตอรเดียว การคูณเปนการคูณตัว 16 บิต หากคูณกนัแลว อาจเกิน 16 บิต ดังนั้นจะมีรีจีสเตอร DX ไวเกบ็สวนที่เกินขึ้นมา จะได DX (เกบ็คา 16 บิตบน) และ AX (เกบ็คา 16 บิตลาง)

การหาร (Divide) รูปแบบ DIV BXผลลัพธที่ไดจะเก็บไวในรีจีสเตอร AX และ DX โดยไมเหมือนกับคํ าสั่งMOV,ADD,SUB เพราะมรีีจีสเตอรเดียว จะไดทั้งเศษ จํ านวนเต็มดังนั้นจะมีรีจีสเตอร DX ไวเก็บสวนที่เปนเศษ และ AX จะเกบ็คาที่เปนจ ํานวนเต็ม

Page 27: Document Assembly

Ratiwat Paresri Page 27 29/6/03

**** หมายเหต ุ ในการท ํางานเกี่ยวกับคํ าสั่งที่อยูใน ดีบัก หากมีการทํ าคํ าสั่งกอนหนานั้นแลว 1 คํ าสั่งจะทํ าให IP เปลีย่นต ําแหนงในการชี้ขอมูลออกไปจะตองมีการกํ าหนดคา IP ใหชี้ตรงกบัตํ าแหนงที่เขียนคํ าสั่งลงไป เชน

-A100 ;คือการเขียนโปรแกรมคํ าสั่งเริ่มในตํ าแหนง 100h เพราะฉะนั้น IP จะตองเทากับ100 ดวย *** การขัดจังหวะ (Interrupt) รูปแบบ INT หมายเลขของอินเตอรรัพต เปนค ําสั่งการเรียกใชโปรแกรมยอย หรือ กระโดดไปยังตา รางการขัดจังหวะ (Interrupt Table)โปรแกรมยอยนั้นเปนโปรแกรมที่อยูบนเครื่อง เชน การแสดงขอความบนหนาจอภาพ , การปรับคาตัวอักษรจากแปนพิมพ, การอาน-เขียน ดีกส เปนตน ตัวอยาง INT 21 เปนการขัดจังหวะ โดยกระโดดไปยังตาราง อิน เตอรรัพต เพื่อทํ างานบางอยาง และอางถึงฟงกชัน่การใชงานตางๆ เชน MOV AH,02 ;เปนการก ําหนดคาฟงกชันหมายเลข 2 คือ การแสดงผลออกมาบนหนาจอภาพ

การแกไขโปรแกรม, com (เมือ่มกีารบันทึกเก็บไวแลว โดยใชการ Debug)c:/ > Debug ชื่อโปรแกรม ,com (ทีต่องการแกไข)-L ; เปนการ load โปรแกรมมาไวในหนวยความจํ า-U ตํ าแหนงเริ่มตน ,ตํ าแหนงปลายทาง (ของโปรแกรมที่ตองการดู หรือ แกไข)-A ตํ าแหนงที่ตองการแกไข ; เชน ลดจํ านวนรอบลงจากโปรแกรม ASC2.COM แกไขตํ าแหนง

-A100 MOV CX,OFหลงัจากนัน้กบั็นทึกเก็บไวใหมได โดยไมตองทํ าการพิมพทุกๆบรรทัดของโปรแกรมเดิม

Page 28: Document Assembly

Ratiwat Paresri Page 28 29/6/03

การเขียนโปรแกรมภาษาแอสเซมบี้ลโดยการใช Turbo Assembly

จะตองมีการบอกสวนตางๆของคํ าส่ัง ที่จะเขียนสวนของ Code Segment : เปนสวนที่เก็บคํ าส่ังที่ใชในการเขียน กระทํ ากับ Register CS ดังนั้น

ตองกํ าหนด รีจีสเตอร CS ใหเปน Segment ดวยตัวอยาง ชื่อ Segment บอกวาเปน Segment (ซึ่งเปนคํ าเฉพาะ)

Code_Seg Segmentคํ าสั่ง PROC และ ENDP

คํ าส่ัง PROC เปนคํ าส่ังเริ่มตนของ Procedure สามารถถูกเรียกใชจากโปรแกรมอื่นได และคํ าส่ัง ENDP บอกจุดจบของ Procedure

คํ าสั่ง ENDเปนคํ าส่ังบอก Assembler วาหมดโปรแกรมเทานี้

คํ าสั่ง Segment และ ENDSเปนการกํ าหนด Segment ใหกับ Code Segment หรือกับ Data Segment รวมทั้งอาจจะ

เปน Stack Segment เมื่อกํ าหนดแลวจะตองมีการบอกจุดส้ินสุดของ Segment ดวย คือ ENDS รูปแบบชื่อ Data_seg Segment ;จุดเริ่มตน ของ Data Segment

...Data_seg ENDS ;จุดส้ินสุด

Code_seg Segment ;จุดเริ่มตน ของ Code Segment...Code_seg ENDS ;จุดส้ินสุด

คํ าสั่ง DB,DW,DD และ EQU• คํ าส่ัง DB (Define Byte) กํ าหนดเนื้อที่ 1 ไบตในหนวยความจํ า (1 ตัวอักษร =1 ไบต)• คํ าส่ัง DW (Define Word) กํ าหนดเนื้อที่ 2 ไบตในหนวยความจํ า• คํ าส่ัง DD (Define Double Word) กํ าหนดเนื้อที่ 4 ไบต• คํ าส่ัง EQU กํ าหนดคาใหกับตัวแปรหรือสัญลักษณ

ตัวอยางช่ือโปรแกรม PROC near ; แบบ .Com

Far ; แบบ .EXE หรือ Procedure .

.

.ช่ือโปรแกรม ENDP

Page 29: Document Assembly

Ratiwat Paresri

เมื่อโปรแกรมเริ่มทํ างาน รีจีสเตอร CS จะชี้ไปที่จุดเริ่มตน Code Segment รีจีสเตอร DSและ ES ชี้ไปที่ตํ าแหนงที่อยูที่สามารถกลับสู DOS ได เมื่อโปรแกรมทํ างานเสร็จ

ดังนั้นจะตองเปลี่ยนให รีจีสเตอร CS ชี้ไปที่ Code Segment ของโปรแกรมคํ าส่ังเทียม ASSUME

จะใชบอกตัว Assembler เกี่ยวกับการใช เซกเมนตรีจีสเตอร ในการอางอิง Label ของ Segmentซึ่งเปนการบอกวาให Segment Register ชี้ไปที่ไหน ตัวอยาง

Code_Seg

ไหน ทํ าใหเกิด

ตัวอจุดเร

จุดจ

คํ าส่ังปฏิบัติก1. Machin

Assemb2. Assem

program3. Macro 4. Pseud

เงื่อนไขห

รูปแบบการเข

[ ลาเบล(Labl field

Label : เปนจุดMnemonic (น

ASSUME CS:Code_seg , DS:Data_Seg

Page 29

เปนการบอกรายละเอียดแกตัว Assembler วารีจีสเตอร CS นั้น ชี้ไปยัง Segment ที่ชื่อวา

ถาไมมีการบอกรายละเอียดเลย ตัวแอสเซมเบอร ก็จะไมรูวา เลเบลที่ใชอยูใน Segmentขอผิดพลาดขึ้นได คือ No or Unreachable CS

ในการกํ าหนด ASSUME นั้น สวนของ Code Segment จะตองมีการกํ าหนดทุกครั้งยางิ่มตน -> ช่ือของตัวแปร Segment Segment

ASSUME CS:………….., DS...

บ ->ช่ือของตัวแปร Segment Ends Code_Seg

ารปฏิบัติการภาษาแอสเซมบี้ลแบงออกเปน 4 ชนิด คือe instruction เปนคํ าส่ังที่ทํ าใหเกิดการปฏิบัติการ (execution) ชุดของler’s instruction setbler instruction เปนคํ าส่ังที่บอก แอสเซมเบลอร ใหทํ าการระหวางแอ

instruction เปนคํ าส่ังที่บอกแอสเซมเบอรใหทํ าการกับชุดคํ าส่ังที่ไดบอo instruction คํ าส่ังที่บอกใหแอสเซมเบอร รูวาควรทํ าอยางไรกับขอมูลรือขอแม Macro และ Listing ปกติคํ าส่ังเหลานี้ จะไมผลิตคํ าส่ังภาษาเค

ียนโปรแกรมภาษา Assembly แบงออกเปน 4 เขต (field)

e) ] นีโมนิค (Mnemonic) [ Operanded ] field หรือ หรือoperation Code Address field

(ขอความ) ที่บอกถึงสวน(ชื่อ) ของโปรแกรม จะมีหรือไมมีก็ไดีโมนิก) เปนคํ าส่ังในการทํ างาน จะตองมีเสมอในทุกคํ าส่ัง

Code_Seg

29/6/03

:……………...

คํ าส่ังอยูในชุดคํ าส่ัง

สเซมบี้ล Source

กไวกอนแลว การกระโดดไปอยางมีรื่องให

[Comment] field

Page 30: Document Assembly

Ratiwat Paresri Page 30 29/6/03

.MODEL SMALL

.CODEORG 100H

Operand จะมีหรือไมก็ไดขึ้นอยูกับคํ าสั่งตัวอยางLabel Mnemonic Operand Comment

START : Mov AX,BX ;กํ าหนดคาใหกับรีจีสเตอร AX

วิธีการจัดการหนวยความจํ า (โมเดลหนวยความจํ า : Memory Model)8086 จะมี 3 Modelและจุดเริ่มตนของ Code Segment

โครงสรางของโปรแกรม .COM

ใน File .EXE ไมจํ าเปนตองกํ าหนด เปนการบอกจุดเริ่มตนการเขียน โปรแกรมของ .COM

จะตองมีการกํ าหนดรูปแบบของการใชหนวยความจํ ากอนที่จะใช .CODE, .DATA , .STACK ซึ่งเรียกวา ไดเรกทีฟ (Directive) ชวยกํ าหนดขอบเขตเซกเมนต

รูปแบบ ความหมาย• Tiny ขนาดใหญไดมากที่สุด 64 Kbytes ซึ่งเปนรูปแบบของไฟลประเภท .COM ซึ่ง Code

Segment และ Data Segment อยูภายใน Segment เดียวกัน• Small ขนาดใหญไดมากที่สุดไมเกิน 2 เทาของ Tiny (128 Kbytes) ซึ่งขอมูลทั้งหมดอยูภายใน

ขนาด 1 Segment (64 kB) และ คํ าส่ังทั้งหมดก็อยูภายในขนาด 1 Segment คือ ทั้งขอมูลและคํ าส่ังถูกเขาถึงไดแบบใกล (Near)

• Medium ขอมูลทั้งหมดอยูภายในขนาด 1 Segment (64 kB) แต คํ าส่ังทั้งหมดมีขนาด > 1Segment ได

• Compact ขอมูลทั้งหมดมีขนาด > 1 Segment (64 kB) ได แตไมมี Array 1 มิติใดขนาดเกิน 64KB คํ าส่ังทั้งหมดจองอยูภายในขนาด 1 Segment

• Large ทั้งขอมูลและคํ าส่ังมีขนาดเกิน 1 Segment ได แตไมมี array ตัวใดมีขนาดเกิน 64 K ได(อางอิง Address ไดสูงสุด 1 MB)

• Huge

รูปแบบ HUGE ไมมีใชในเทอรใบ Assemlolev (TASM)note ในการเขียนโปรแกรม Assemloly บน Sea 86 นั้น ทุกๆ อยางในโปรแกรมตองอยูใน Segmentใด Segment หนึ่ง ทํ าใหการบอก Addreis ตองใช Register 2 ตัวคือ 1. บอก Segment ( CS ) โดยบอกเปนคู คือ CS : IP หรือ DS : DX

2. บอก OFFSET ( IP )

Page 31: Document Assembly

Ratiwat Paresri Page 31 29/6/03

ทุกอยางทํ าใน Segment เสมอ Assembler จึงตองรู Segment ใดที่เรากํ าลังอางถึงอยู คํ าส่ัง คือ จุดเริ่มตนของ Code Segment ตองมีใน File . Com เสมอ

( ใน . BXB ไมจํ าเปน ) จึงเปนการบอกให Assembler เริ่มทํ าการ Assmbly ที่จุดซึ่งหางจากจุด เริ่มตน ของโปรแกรม มา100 H ไบต (256 ไบต ในฐาน 10 ) เพราะในไฟล . Com ตองกัน น.ท 256 ไบตแรกของโปรแกรมเอาไวสํ าหรับเก็บขอมูลขาวสารที่ไดจากระบบปฏิบัติการ (คือ DOS ) ลักษณะสวนนี้เปนสวนที่มากอนตัวโปรแกรมจริงๆ เราเรียกวา บริเวณ PSP ( Program Segment Prefix )ปกติ CS จะชี้ไปยัง Code Segment ซึ่งเปนสวนที่ Assemblep ทํ าการ Assimbly ดังนั้นบริเวณที่มี Address CS : 0000 - CS : 00FF คือ บริเวณ PSP- บริเวณ PSP เมื่อ DOS load ไฟล . Com เชน Protect . Com จะมีการสรางบริเวณ PSP สํ าหรับไฟล

.Com นั้นๆ ขึ้น และตองอยูที่ 256 Byte แรกของ Segment เดียวที่มีทั้ง Code และ Data Segment อยูนั้นดวย (ไมมีใน File . EXE )

เมื่อ File . Com ถูก Lood โดยระบบปฏิบัติการ Om ของ Segment Pegister ทั้ง 4(CS,DS,SS,ES) จะชี้ไปยังจุดเริ่มตนของ Segment เดียวกัน สํ าหรับ Stack ในไฟล . Com ดอสกํ าหนด ใหอยูสวนทายสุดของ Segment เพราะการโตของStack จะโตจาก Address สูง Address ตํ่ า

CS : 0000 250 ไบต

CS : 00FF

CS : FF00 256 ไบต สํ าหรับ Stack CS : FFFF

พื้นที่ขอมูลในไฟล . COM

มีการเก็บขอมูลไดหลายวิธี , เมื่อมีการ Lood ไฟล . COM เขามาไวใน Memory Dos จะมองหาที่วางที่มีขนาดเปนจํ านวนเทา ของ 16 bytes (ซึ่งเปนขนาดของหนวยความจํ า 1 paragraph ) ไฟลของ Dos ที่ทํ าหนาที่นี้คือ Command . Com และทํ าการกํ าหนดใหคาใน CS,DS,ES และ SS ใหชี้ไปยังคาเดียวกัน และAssembler จะมองชื่อ Label เปน offset จาก DS เมื่อมีการกํ าหนด Om ให DS แลวเราถึงจะสามารถอางถึงชื่อLabel ที่เราใชแทนขอมูลในพื้นที่ ขอมูลของเราอยูได

ORG 100 H

PSP

Page 32: Document Assembly

Ratiwat Paresri Page 32 29/6/03

เราสามารถพิมพขอความ “ DISK PULL “ ไดโดยใช Interrupt ของ DOS เบอร 21 H บริการที่(FuncHon ) 9 ฃึ่งตองกํ าหนด DS : DX ดังนี้

° MODEL SMALL ° CODE OPG 100 H ENFRY : JMP PROG = NAME : MESSAGE DB “ Disk Full$ “ : PROG_NAME PROC NEAR LEA DX , MESSAGE MOV AN , 9 INT 21 H

“$” บอกจุดส้ินสุดของขอมูล สติวงศ คํ าส่ัง LEA DX, MESSAGE ทํ าหนาที่ Lood effective address หรือoffset จริงๆ ชื่อฉลาก MESSAGE ไปเก็บไวใน Register DA เนื่องจาก เรากํ าลังทํ างาน กับ trle .com ซึ่งมีSegment เดียว จึงไมตองกํ าหนดคาใหแก DS อีกเมื่อ ASSEMBLY โปรแกรม มันจะเก็บ Address ชื่อของฉลาก MESSAGE เอาไวโดยอัตโนมัติ เชน ถาMESSAGE มีขนาด 3 byte ในโปรแกรม.. . คํ าส่ัง LEA จะพบวา MESSAGE อยูที่ระยะทาง 103hไบต จาก OS : 000 และ MESSAGE ถูกแทนที่ดวย103h ในทุกที่มีการใช ฉลาก MESSAGEDB “ AB” สราง

TINY Small Large Code + Data + Stack

CSDSSSES

Code Data + Stack

CS DSSSES

CS SS

DS DSES

CODE

STACK

DATA

Page 33: Document Assembly

Ratiwat Paresri Page 33 29/6/03

วธิกีารจะจัดการหนวยความจํ า(โมเดลหนวยความจํ า : Memory Model ) 8086 จะมีโมเดล(Model)

- Tiny ขนาดโตสุดไมเกิน 64 Kbyte- Small ขนาดโตสุดไมเกิน 2 เทา Tiny (128 Kbyte)- Large อางอิง Address ไดสูงสุด 1 MB

Tiny Small LargeCS SS

DS ES

อธิบายTiny Model : มีขนาดเทากับตํ าแหนงที่ 8080 สามารถอางอิงไดโดยที่ Code Segment และ Data segment จะถูกจัดเก็บในหนวยความจํ าพื้นที่เดียวกัน

Code + Data + Stack

CSDSSSES

Code Data + Stack

CS DSSSES CODE

STACk

DATA

Page 34: Document Assembly

Ra

ขัน้ตอนการแปลภาษาแอสเซมบี้ล

คห W E

Assembler Object File Linker

AssemblyLanguage

(.ASM)

tiwat Paresri Page 34

าร complie ในภาษา Assemblyในที่นี้ใน Turbo Assembly ในการทํ างานจะตองมีการพิมพ โปรแกรม ดวยตัวชวย

(Edifor) บันทกึใหเปน นามสกุล . ASM กอนตัวอยาง Editor ทีท่ ําการใชงาน เชน Qedit , EditPlus ,NotePad, MsW

จะได Objecf filename objecf filename [ ชือ่แฟมที่ complie .objecf] : ↵ เปนแฟม .Obj Source listing [ NUL.LST] : ↵ เปน listing File Cross reference [ NUL . CRF] : ↵ “NUL” ก็คือ (NO File )าซึ่งอยูใน […] คือ “Default value”ากไมมีขอผิดพลาดเกิดขึ้นจะได

arning Severerrors Errorsφ φากมขีอผิดพลาดเกิดขึ้นตองกลับไปแกไขกอนที่จะทํ าการ Link โปรแกรม ( .Ob

TASM ชื่อแฟมที่เขียนดวย Edifor.ASM

Executed file(.EXE)

29/6/03

พิมพ

ord หรืออ่ืนๆ

j)

Page 35: Document Assembly

Ratiwat Paresri Page 35 29/6/03

: ∅∅∅3 - a 1∅∅ : ∅1∅∅ Nov AX , BX : ∅1∅2 - t Ax = ∅∅∅3

หลักการเขียน โปรแกรม Assembly- กํ าหนด Segment- กํ าหนด Data ขอมูลเชน - Ds 1 Dup (‘ ∅ ‘ ) - Ds ขอความ ( ∅ )

Call โพรชีเยอร Cls - screen proc nearCall โพีซีเยอร รับคา

ตัวอยาง การเขียนโปรแกรม ( Test . ASM )STIEG SEGMENT

Stack DB 64 DUP ( ? )สแตก STSEG ENDS ; ______________________________________________________________________________

DTSEG SEGMENTDATA1 DB 52H

Data DATA2 DB 2Ahขอมูล Sum DB ?

DTSEG ENDS; ------------------------------------------------------------------------------------------------------------------------

CDSEG SEGMENTMAIN PROC

Code ASSUME CS : CDSEG ,คํ าส่ัง DS : DTSEG ,

SS : STSEG

Page 36: Document Assembly

Ratiwat Paresri

MAIN ENCDSEG EN

ENบันทึก ใชที่ Directorie

เปล่ียน ทั้งหมดที่จุด CPRO _ ONE SEG* MAIN PRO

ASSMOMoINTMoINT

* MAIN EN PRO_ ONE EN

EN

-บันทึก เปน ชื่อ EX1. A

Mov AX , DTSEGNov DS , AXNov AL , DATAZNov BL , DATAZADD AL , BLMov sum , AL

Page 36 29/6/03

Mov AH , 4CH INT 21DP - End ProgramDSD MAINs ที่เก็บ TASM

DSEG MENTC FARGME CS : PRO _ ONE

V DL, Ø1v AH , Ø2 21 Hv AH , 4CH 21HDPDSD MAIN *

SM

Page 37: Document Assembly

Ratiwat Paresri Page 37 29/6/03

การอางแอดเดรส ของไมโครโปรเซสเซอรCPU สามารถเขาถึงหรืออางตํ าแหนงของขอมูลไดหลายทาง ประเภทของการอางตํ าแหนงที่เก็บขอมูล เรียกวา

“Addressing Mode” โดยทั่วไปการอางแอดเดรสมีทั้งแบบติดตอกับหนวยความจํ า และไมติดตอกับหนวยความจํ า จากตัวอยางคํ าส่ัง MOV

MOV Destination , Sourceเปนการนํ าขอมูลจากตํ าแหนงตนทางไปยังปลายทาง โดย Destination เปนตัวกระทํ า1(Operand1) และ

Source เปนตัวกระทํ า2 (Operand2)การอางตํ าแหนงขอมูลที่นิยมกันมี 7 โหมด1. register2. immediate3. direct4. register indirect5. based register6. indexed relative7. based indexed relative

A. Register Addressing Modeเปนการอางตํ าแหนงโดยการใชรีจีสเตอรชี้ตํ าแหนงของขอมูลที่ทํ าการติดตอ หรืออางขอมูลระหวางรีจีสเตอรโดย

ตรง ทํ าไดกับ รีจีสเตอรทั้ง 8 บิต และ 16 บิต หากใชกับ 8 บิต ตองทํ ากับรีจีสเตอร 8 บิต (AH,AL,BH,BL,CH,CL,DH,DL)หากใชกับ 16 บิตตองกระทํ ากับ รีจีสเตอร 16 บิต(AX,BX,CX,DX,SI,DI,SP,BP) รีจีสเตอรทั้งสองตองมีขนาดเทากัน และคาของรีจีสเตอรตนทางจะไมเปล่ียนคํ าส่ัง ตัวกระทํ า (Operand) คํ าอธิบาย

MOV BX, DX ;นํ าคาจาก DX มาเก็บใน BXMOV ES, AX ; นํ าคาจาก AX มาเก็บใน ESADD AL, BH ;บวกคาใน BH กับคาใน ALMOV AL, BL ;นํ าคาจาก BL มาเก็บใน AL แบบ 8 บิตMOV CH, CL ;นํ าคาจาก CL มาเก็บใน CH แบบ 8 บิตMOV AX, CX ;นํ าคาจาก CX มาเก็บใน AX แบบ 16 บิตMOV SP, BP ;นํ าคาจาก BP มาเก็บใน SP แบบ 16 บิตMOV DS, AX ;นํ าคาจาก AX มาเก็บใน DS แบบ 16 บิตMOV SI, DI ;นํ าคาจาก DI มาเก็บใน SI แบบ 16 บิตMOV BX, ES ;นํ าคาจาก ES มาเก็บใน BX แบบ 16 บิตMOV ECX, EBX ;นํ าคาจาก EBX มาเก็บใน ECX แบบ 32 บิตMOV ES, DS ;ทํ างานไมไดเพราะยายจาก เซกเมนต ไปเซกเมนตMOV BL, DX ;ทํ างานไมไดเพราะขนาดรีจีสเตอรไมเทากันMOV CS, AX ; ทํ างานไมไดเพราะยายจากรีจีสเตอรไปเซกเมนต

Page 38: Document Assembly

Ratiwat Paresri Page 38 29/6/03

B. Immediate Addressing Modeเปนการติดตอกับขอมูลโดยตรง โดยไมตองใชหนวยความจํ า การอางแอดเดรสจะใหคาคงที่ซึ่งเปนคาของขอมูล

อาจเปน 8 ไบต หรือเวิรดขอมูล 16 บิต มาใหกับโอเปอแรนดปลายทาง

คํ าส่ัง ตัวกระทํ า(Operand)

ขนาด คํ าอธิบาย

MOV BL, 45 8 บิต ;นํ าไบตขอมูล 45 ฐานสิบ (2DH) มาเก็บใน BLMOV AX, 45H 16 บิต ;นํ าเวิรดขอมูล 0045H มาเก็บใน AXMOV SI, 0 16 บิต ;นํ าเวิรดขอมูล 0000H มาเก็บใน SIMOV CH, 100H 8 บิต ; นํ าไบตขอมูล 100 ฐานสิบ (64H) มาเก็บใน CHMOV AL, ‘A’ 8 บิต ;นํ ารหัส ASCII ของ A มาเก็บใน ALMOV CL, 11001110B 8 บิต ;นํ าไบตขอมูลเลขฐานสอง 11001110 มาเก็บใน CLMOV EBX, 12340000H 32 บิต ;นํ าขอมูล 12340000H มาเก็บใน EBXMOV ESI, 12 32 บิต ;นํ าขอมูล 12 ฐานสิบขนาด 2 เวิรด มาเก็บใน ESIMOV EAX, 100Y 32 บิต ;นํ าขอมูลเลขฐานสอง 100 ขนาด 2 เวิรด มาเก็บใน EAX

C. Direct Addressing Modeเปนการติดตอกับขอมูลจากตํ าแหนงหนวยความจํ าที่ถูกอางถึง ดังนั้นจะตองคํ านวณหาตํ าแหนงของหนวยความ

จํ าทางกายภาพที่ถูกอางถึง โดยคาโอเปอแรนดของคํ าส่ังจะเปนคาออฟเซตของหนวยความจํ า ตัวอยาง จงหาตํ าแหนงของหนวยความจํ าที่เก็บขอมูล ถาหาก DS =1512H และคํ าส่ังตอไปนี้

MOV AL, 99H ;ยายคา 99H ไปไวที่รีจีสเตอร ALMOV [3518],AL ;

1512:3518 หรือ 15120H + 3518 = 18628Hดังนั้นคํ าส่ังที่หนวยความจํ าตํ าแหนง 18628H จะมีคา 99Hอยู

อาจจะมีการแบงออกเปน 2 ประเภท คือ1. Direct Addressing :โดยใชคํ าส่ัง MOV ระหวางตํ าแหนงหนวยความจํ ากับ register AL,AXหรือ EAX2. Displacement Addressing :เปนการอางขอมูลจากตํ าแหนงขอมูล

หากคอมพิวเตอรทํ าคํ าส่ัง MOV AL,Data และ Data เปนคาหนวยความจํ าตํ าแหนง 1234H ในภาษาแอสเซมบี้ลจะมีคาเทากับการทํ าคํ าส่ัง MOV AL,[1234] แตตํ าแหนง 1234นี้จะเปนตํ าแหนงเซกเมนตของขอมูลอาจมองวาเปนการทํ าคํ าส่ัง MOV AL,DS:[1234] ได ตัวอยางที่ 1 การยายขอมูลโหมดจริง จากตํ าแหนงที่มีคาออฟเซตเปน 1234H และมีคาเซกเมนตเปน 1000H ทํ าใหขอมูลที่อยูใน Address จริงตํ าแหนง 11234H ถูกอานเขาไปเก็บในรีจีสเตอร AL จากการ MOV AL,[1234]

EAX AH 8AH 11235HEBX 8A 11234HECX 11233H

11232H เมื่อ DS มีคา = 1000H

ตัวอยางที่ 2 MOV [7000H], AX ถา รีจีสเตอร DS มีคาเปน 1000H และคาในรีจีสเตอร AX เปน1234H

Page 39: Document Assembly

Ratiwat Paresri Page 39 29/6/03

เพราะฉะนั้น จํ าทํ าการยายคาไปเก็บไวในตํ าแหนงที่มีแอดเดรสจริง เปน 17000H และ 17001H MOV [7000H], AX

Address Memory AH AL16FFF AX 12 3417000 3417001 121700217003

DS 1000_ +Disp: 700

17000

คํ าส่ัง ตัวกระทํ า(Operand)

ขนาด คํ าอธิบาย

MOV 8 บิตMOV 16 บิตMOV 16 บิตMOV 8 บิตMOV 8 บิตMOV 8 บิตMOV 32 บิตMOV 32 บิตMOV 32 บิต

Page 40: Document Assembly

Ratiwat Paresri Page 40 29/6/03

โปรแกรมการจัดระบบงาน DOS1. BOOt Pecord เก็บที่ Secfer แรกของแผน Dis (512 ไบต) เปนโปรแกรมสั้นๆ2. IO. SYS เปนสวนเพื่อขยาย Rom- BI0S จดัการควบคุมอุปกรณ Input / output3 MS DOS.SYS จะประกอบดวย Routine การบริหารของ DOS ( Service Buffer)

4.COMMAND.COM

Transient CommandResident Command

หลกัการเขียนโปรแกรมภาษา ASSEMBLY เบื้องตน1. ไมจ ําเปนตองกํ าหนดตํ าแหนงเริ่มตนเหมือนกับการเขียน Debug ก็ได .com

จากเดิม Debug ใช A1φφ ก ําหนดตํ าแหนง เร่ิมเขียนแตใน ASSEMBLY ( แอสเซมบลี้) ใช

Org 1φφ ตํ าแหนง

ยอมาจาก “Origin”2. การเขียน ASSEMBLY จะตองมกีารบอกสวนของคํ าสั่งที่จะเขียน เรียกวา “CodeSeqment” กระทํ ากับรีจีสเตอร CS ดังนัน้จะตองกํ าหนดรีจีสเตอร CS ใหเปนSegment ดวยตัวอยาง ชื่อ Segment บอกวาเปนเชน Code- Seg Segment คํ าเฉพาะ

Internal Command External Command

Page 41: Document Assembly

Ratiwat Paresri Page 41 29/6/03

ระบบจัดการ ( Disk Operating System )- หนาที่ของ DOS- รีจีสเตอร IP- หนวยความจํ า Buffer- การใชรีจีสเตอร IP (Instruction Pointer )- การใชรีสเตอร BP เปน Pointer- การสงขอความไปที่ Printer- การสงรหัสควบคุมไปให printer

คํ าสั่ง DB ( Define byte) เปนการกํ าหนด ขอความ Dw (Define word) (String) ซึง่เปนคํ าสั่งเทียบ ( PsedoCode)

DOS Fundtion การเรียกใชฟงกชัน่การขัดจังหวะของ DOS- Key board Input (การรับขอมูล จากแปนพิมพ)- Print String (การพิมพขอความออกบนจอภาพ)- Buffered keyboard Input (การเก็บคาตัวอักษรจากคียบอรดเพื่อนํ าไปแสดงผล- Printer Output (การพมิพตัวอักษรออกเครื่องพิมพ

ฟงกช่ันคียบอรดอินพุท

Reg AH=1 INT 21

ค ําที่สงกลับคือ อักขระใน Reg AL* ตองกด + เพื่อออกจากฟงกชั่นนี้ Ctrl Break

Page 42: Document Assembly

Ratiwat Paresri Page 42 29/6/03

∗ การ CALL ไปที่โฟรซิเยอรนั้นเมื่อพบคํ าส่ัง RET จะยอนกลับมาที่โปรแกรมหลัก CALL และจะตองมีการเก็บตํ าแหนง (Address) ที่จะทํ างานตอจากคํ าส่ัง CALL เอาไวที่ใดที่หนึ่งกอนที่จะกระโดดไปทํ างาน ในโปรแกรมยอย [ คือการนาไปเก็บลงไวในสแต็ก ( STACK)]

เมื่อเสร็จจากโปรแกรมยอยนี้แลว จะนํ า Address ที่เก็บไวนี้มาเซตคา IP เพื่อที่จะสามารถรับคํ าส่ังCALL ได

ดังนั้น STACK ก็เปนสวนที่ใชเก็บคา Address ในการสงคากลับ (Return Address ) จะถูกชี้โดยรีจีสเตอร SP ( Stack pointer ) และอยูใน Segment ที่ชี้โดย SS ( Stack Segment )∗ ลักษณะการเก็บขอมูลในสแต็กและการนํ ามาใชงาน คือ เขากอน- ออกหลัง (Last –In-first Out ; LIFO)∴ STACK จะถูกชี้โดยคูรีจีสเตอร SS : SP และ ที่อยูของสแต็กจะอยูบนหนวยความจที่เผ่ือไวนั่นเอง เนื่องจากSTACK มีทั้งขนาดไมคงที่ ดังนั้น จึงมีลักษณะโตจากบน ลาง

Segment offset SS : SP เก็บตัวอยางที่อยูของคํ าส่ังที่ทํ างาน ตอจาก CALL

Page 43: Document Assembly

Ratiwat Paresri Page 43 29/6/03

คํ าส่ังในการเลื่อนบิต และแครี่แฟล็ก ( Rotate and carry flag) ในการบวกเลขฐาน 16 ถาหากตัวตั้ง เทากับ FFFFh และตวับวกเทากับ Ih เพราะฉนัน้ จะไดผลลัพธ 10000h มผีลลัพธ 5หลัก ซึ่งเกินขนาดที่รีจีสเตอรจะรับไดเนื่องจากรีจีสเตอรมีเพียง 2 ไบตหรือ 1เวริด (4หลัก)เทานั้น ดังนั้นในหลักที่ 5 จะตองมีการนํ ากับไปเก็บไวที่แฟล็กตัวทด(Carry Flag) คือ CF ซึ่งแตละแฟลก็มขีนาด 1 บิต เก็บคาเพียง 0 กับ 1 เทานั้น 0 เทากับ Reasetคือไมมีตัวทด = CY (Carry ) สามารถตรวจสอบไดจากคํ าสั่ง R ในดีบัก แฟลก็ตัวทดจะอยูในบิตที่0

การกํ าหนดคาของแฟลก็ ใชคํ าสั่งเหมือนกับการกํ าหนดคาในรีจีสเตอรตัวอื่น คือ-RF หลงัจากนั้นจะปรากฏตัวอักษรคาตางของแฟลก็ขึ้นมา เราสามารถใสคาตัวอักษรลงไปไดเลยเชน ตองการกํ าหนดใหตัวทดมีคาเปน 1 ก็ ตัวอักษร CY (หมายเหตุ การใสตัวอักษรตางๆลงไปเพื่อการกํ าหนดแฟล็กใหดูในชีต)

ในการเลื่อนบิตแตละบิต ในรีจีสเตอร ไปทางซายสุดเขาแฟลก็ตัวทดนั้น เราจะใชคํ าสั่งRCL (Rotate Carry Left ) จะไดคาในแฟลก็ตวัทดเลื่อนไปที่บิตขวาสุดของรีจีสเตอรนั้นดวย ตัวอยาง

CF BL

RCL BL,1คาในแฟล็กตัวทด (CF) มคีาเทากับเทากับ 1 (คือ CY ) และคาในรีจีสเตอร BL ,มคีาเทากับ01101101 = 6Dh

เมือ่มีการหมุน (Rotate Carry Left ) โยการใชคํ าสั่ง RCL BL,1 ผลลัพททีไ่ดจะเปนดังนี้เมื่อหมุนเพียง 1 รอบ BL =11011011 มคีาเทากับ DE และคาในแฟลก็ตัวทดเทากับ 0 หรือ NC เพราะฉนัน้หากตองการใหคากับมาเปนเหมอีนเดมิ เราจะตองหมุนทั้งสิ้น 9 คร้ัง เมื่อเปนเลขฐาน 16 จะใชการหมนุ 17 คร้ัง นํ ามาใช ประโยชนในการแปลงคาเลขฐาน 16 เปนเลขฐาน 2 หรือรหัสแอสกี้ เปนเลขฐาน 2

1 01101101

Page 44: Document Assembly

Ratiwat Paresri Page 44 29/6/03

คํ าส่ังในการบวกผานแฟล็กตัวทด (ADD With Carry Flag) ADC คํ าสั่ง ADC จะแตกตางจาก ADD คือน ําคาใน Carry มารวมในการบวกดวย หมายถึงเมื่อมีการบวกเลข 2 จํ านวนแลวยังไป บวกคาในแฟลก็ตวัทดขนาด 1 บิตดวย ตัวอยาง** ก ําหนดคาในแฟล็กตัวทด CF ใหมีคาเปน CY (เปนการเซ็ตคาในแฟลก็ตัวทดใหเปน 1 ) โดยการใชคํ าสั่ง –RF แลวพิมพคํ าวา CY ลงไป หลงัจากนั้น ทํ าการบวกคาในรีจีสเตอร DL พรอมคาในแฟลก็ตวัทดดวย ดังนี้ ตองการกํ าหนดคาในรีจีสเตอร DL =0 กอน คือรหัสแอสกี้ 30

ADC DL ,30เพราะฉนัน้จะไดในรีจีสเตอร DL = 31 (Oh +1h)

Page 45: Document Assembly

Ratiwat Paresri Page 45 29/6/03

• ฟงกช่ัน Buffered keyboard •เปนการอานขอความจากคียบอรดReg AH= φAHDS: DX เก็บตํ าแหนงแอดเอรสของ BuffrerINT 21หมายเหตุ ไบตแรกของบัฟเฟอร = จํ านวนตัวอักขระที่รับไดมากที่สุด

ไบตที่สอง = จํ านวนอักขระจริงๆ ที่พิมพเขาไปตัวอยาง C: / > Debug

1bit φ1φ9=2 bit- a1φφ MOV DX, 1φ9 ; กํ าหนดตํ าแหนงของจํ านวนตัวอักษร-:01φφ MOV AH, φA ; เรียกใช function หมายเลข φA-:φ1φ3 INT AH, φA-:φ1φ5 INT 21-:φ147 INT 2φ-:φ1φ9 DB 2φ ; กํ าหนดความกวางของอักษร-:φ10A ↵ ที่จะรับ =32 ตัว(20h)*ตัวอักษรที่พิมพลงบน keyboard จะถูกเก็บอยูสวนหนึ่งใน Buffer หนวยความจํ าไบตแรก (จากตํ าแหนง φ1φ9) จะเก็บคาสูงสุดของตัวอักษรที่สามารถเก็บใน Buffer (เชน 20H(32 ตัว))ถาพิมพตัวอักษรมากกวานี้จะเกิดเสี่ยงสัญญาณขึ้น และเคอรเซอร จะไมเล่ือนไปทางขวาอีก (มีคํ าไดเพียง 1ไบต= 2559ตัว)ไบตที่สอง ตอจากตํ าแหนงเริ่มตนของการกํ าหนดความยาวตัวอักษร จะเปนคาตัวอักษรที่แทจริง (พิมพลงไป)จนกวาจะกด Enter

จากขางบน -W - D144,12f-n STRING.com -u1φφ,1φ8 ตรวจสอบคาที่เก็บไว- Rcx -G เรียกโปรแกรมใชงาน : φφφA

Page 46: Document Assembly

Ratiwat Paresri Page 46 29/6/03

Packed Pixels และ Color Plaues2. เทคนิค ในการแสดงภาพออก จอ VSA และ EQAPacked Pixels จํ านวนสีทั้งหมด ในแตละ pixel จะถูกรวมกันเขามาเปน WORD ในหนวย

ความจํ าขอมูล ( Memory Data )ตัวอยาง รวมกัน 4 bit เปน 1 pixel

1 -----------------------------

จอภาพ

Mode 4,5,13 DAC

Color Planesจะแยกแยะหนวยความจํ าออกเปนหลายๆ Planes แตละ Plan ท ําหนาที่แตกตางกัน

ใน Color Planes นัน้ อาจจะใชการแสดงผลทั้งแบบ Planar pixels และ จํ าลองเปนโหมด Packedpix

1 0 1 1

Page 47: Document Assembly

Ratiwat Paresri Page 47 29/6/03

CODE_SEG SEGMENTASSUME CS : CODE _SEG , DS : Data _SegORG 1φφH

P_A PROC NEARMOV DL,’A’ I=1φMOV CX,1φ IF I≤10

P_LOOP :

CALL W_R Q P_A. ASMLOOP P_LOOP ลดคาใน Reg .CX ลดลง 1

INT MOV AH,4CH = EXE ZF ( ZERS flag) =φINT 2H

P_A ENDPW_R PROC Near

MOV Ah,2 แสดงผลลัพธINT 2lHINC DL เพิ่มคํ า DL ที่ละ 1RET RETURN

W_R ENDP AB HCODE SEG ENDS

END P_AData_Seg Segment

S DS “ INPUT DATA “ 131 1φData_Seg ENDS

Page 48: Document Assembly

Ratiwat Paresri Page 48 29/6/03

ROM-BIOS มีหลักการทํ างานเปน 3 สวนใหญๆ

POST ทํ าหนาที่ตรวจสอบอุปกรณมาตราฐานมีอยูกับเครื่อง เชน FD ,HD , RAM

Initialize ทํ าหนาที่สราง Interrupt Vector เปนตัว คอยดูแลการจัดการ Interrupt สราง Boot Record . ( Disk → CPU)

ตัวจัดสรร Interrupt ทางดาน H.W

มีตัวจัดการเรียกวา “ ตัวบริการขัดจังหวะ “Program Registers

MOV ah ,1INT 21 รับคาจาก keyboard 1 ตัว

หรือ MOV ah , φ6 - เล่ือนจอภาพขึ้นINT 10 จอภาพMOV ah, φ7 - เล่ือนจอภาพลงINT 16 แปนพิมพ

แมคโคร (Macros)แมคโครเปนชื่อของสัญลักษณที่ใชแทนกลุมคํ าส่ังภาษาแอสแซมบลีซึ่งสามารถเรียกใชไดหลายครั้งใน

โปรแกรมแมคโคร (macros) กับโพซีเยอร (procedures) จะมีการทํ างานแตกตางกัน โพซีเยอรจะถอดรหัสทุกครั้งที่มีการเรียกใช สวนแมคโครจะถอดรหัสเพียงครั้งเดียวและสามารถเรียกชื่อแมคโครใชไดเลยหรืออาจมองวาแมคโครเปนชื่อของคํ าส่ังที่โปรแกรมใชได แตโพซีเยอรจะตองเรียกโดยใชคํ าส่ัง CALL และ RET

Start-up

POST Initialize

Disk Boct

ExtensionInitialize

Hard WareInterruptHandling

ServiceHandling

Page 49: Document Assembly

Ratiwat Paresri Page 49 29/6/03

การกํ าหนดแมคโครแมคโครเปนบล็อกของชื่อคํ าส่ังตางๆ การกํ าหนดจะตองเปนไปตามรูปแบบของ MASM ซึ่งใชคํ าส่ัง

เทียมในการกํ าหนดดังนี้macro_name MACRO d1,d2,…..dn

statementsENDM

จะเห็นวาแมคโครจะเปดดวย MACRO และปดดวย ENDM สวน d1,d2…..dn จะเปนพารามิเตอรที่จะสงผานไปในแมคโครซึ่งจะมีหรือไมมีก็ไดเรียกพารามิเตอรนี้วา dummy parameters และแมคโครนี้จะเรียกใชในสวนใดของเซกเมนตโปรแกรมก็ไดโดยเรียกชื่อ macro_name ตัวอยางเชนถาจะเขียนแมคโครสํ าหรับแสดงตัวอักขระอยางงายสามารถเขียนไดดังนี้

PUTCHAR MACRO ; เริ่มตนแมคโครMOV AH,2INT 21HENDM ; จบแมคโคร

เมื่อเราตองการจะแสดงตัวอักขระสามารถเขียนโปรแกรมไดโดยเรียกชื่อแมคโครใชไดเลยดังตัวอยางตอไปนี้

.CODE MAIN PROC

……..MOV DL,’A’PUTCHARMOV DL,’B’PUTCHAR……...

จะเห็นวาตัวอยางแมคโครที่กลาวมาเปนแมคโครที่ไมมีการผานคาตัวแปร การเรียกใชแมคโครจะเรียกชื่อแมคโครและตามดวยคาที่จะสงใหแมคโคร หรือถาหากเขียนแมคโครแสดงผลสตริงจะสามารถเขียนไดดังนี้

DISP_MSG MACROMOV AH,9INT 21HENDM

แมคโครนี้ชื่อวา DISP_MSG ถาหากตองการเรียกใชสามารถทํ าไดดังนี้ LEA DX,ABC

DISP_MSGLEA DX,DEFDISP_MSG

Page 50: Document Assembly

Ratiwat Paresri Page 50 29/6/03

จะเห็นวาแมคโครจะถูกเรียกใชสองครั้ง ในการใชแตละครั้งจะตองใหรีจิสเตอร DX ชี้ไปที่หนวยความจํ าเก็บขอมูลกอน เมื่อโปรแกรมถูกแอสเซมเบลอรการทํ างานจะเปนดังคํ าส่ังตอไปนี้

LEA DX,ABCMOV AH,9INT 21HLEA DX,DEFMOV AH,9INT 21H0

ตัวอยางที่ 9.1 จงเขียนแมคโครในการยายขอมูลเวิรดหนึ่งไปยังอีกเวิรดหนึ่งวิธีทํ า ใหแมคโครชื่อ MOVW

MOVW MACRO WORD1,WORD2 PUSH WORD2 POP WORD1 ENDM

แมคโครนี้ชื่อวา MOVW และมี WORD1,WORD2 เปน dummy arguments ในการกํ าหนดargument นั้นจะถูกสงผานไปแทนคาพารามิเตอรที่กํ าหนดในแมคโคร อยางเชนตัวอยางที่ 9.2ตัวอยางที่ 9.2 จะใชแมคโคร MOVW ในตัวอยางที่ 1 ยายคาจาก B ไป A เมื่อ A กับ B เปนตัวแปรแบบเวิรดวิธีทํ า เขียนคํ าส่ังไดดังนี้

MOVW A,Bเมื่อเรียกใชแมคโครคา WORD1 จะถูกแทนดวยตัวแปร A และคา WORD2 จะถูกแทนดวยตัวแปร B

ผลลัพธที่ไดจะเปนการทํ างานดังนี้PUSH BPOP A

ตัวอยางที่ 9.3 จงเขียนแมคโครเลื่อนขอมูลในรีจิสเตอร AX ไปทางซายสี่ครั้งวิธีทํ า สรางแมคโครชื่อ SHL_AX โดยใชคํ าส่ัง SHL

SHL_AX MACRO SHL AX,1 SHL AX,1 SHL AX,1 SHL AX,1 ENDM

ในแมคโครสามารถใชคํ าส่ังเทียม REPT ได โดยอาจเขียนไดเปน SHL_AX MACRO

REPT 4 SHL AX,1

Page 51: Document Assembly

Ratiwat Paresri Page 51 29/6/03

ENDM ENDM

ตัวอยางที่ 9.4 จงเขียนแมคโครแสดงผลสตริงวิธีทํ า ในการแสดงผลสตริงเราสามารถใชอินเทอรรัพตตามรูปแบบดังนี้

MOV AH,9INT 21H

ในที่นี้จะสรางแมคโครชื่อ SEND_MSG ซึ่งเขียนโปรแกรมไดดังนี้ SEND_MSG MACRO ADDR

LEA DX,ADDRMOV AH,9INT 21HENDM

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

SEND_MSG ABCโปรแกรมจะทํ างานโดยชี้ไปที่ตํ าแหนงขอมูล ABC และแสดงผลออกหนาจอ ซึ่งเทากับการทํ าคํ าส่ังตอ

ไปนี้LEA DX,ABCMOV AH,9INT 21H

ตัวอยางโปรแกรมในรูปที่ 9.1 จะเปนการเขียนแมคโครแสดงขอความออกทางหนาจอ เมื่อโปรแกรมทํ างานจะพิมพขอมูลออกทางหนาจอสองบรรทัด

.MODEL SMALLSEND_MSG MACRO STRING ;เร่ิมแมคโครช่ือ SEND_MSG

LEA DX,STRING ;ใหรีจิสเตอรDXช้ีไปที่เซกเมนตขอมูลของอากิวเมนตSTRINGMOX AH,9 ; เรียกฟงกชันแสดงขอมูลสตริงINT 21HENDM ; จบแมคโครชื่อ SEND_MSG

; สิ้นสุดสวนกํ าหนดแมคโคร.STACK 100H.DATA

STRING_1 DB “ THIS IS COMPUTER.’,0AH,0DH,’ $”STRING_2 DB “ MR.TEERAWAT PRAKOBPHON’,0AH,0DH,” $ “; สิ้นสุดสวนกํ าหนดขอมูล

.CODEMAIN PROC

MOV AX,@DATA

Page 52: Document Assembly

Ratiwat Paresri Page 52 29/6/03

MOV DS,AXSEND_MSG STRING_1 ; เรียกแมคโครใหแสดงขอมูลใน STRING_1SEND_MSG STRING_2 ; เรียกแมคโครใหแสดงขอมูลใน STRING_2MOV AH,4CHINT 21H ; จบการทํ างานออกมาที่ DOS

MAIN ENDPENDP MAIN

ตัวอยางที่ 9.5 จงเขียนแมคโครกํ าหนดตํ าแหนงบนหนาจอในการแสดงขอมูลโหมดตัวอักษรวิธีทํ า การกํ าหนดแมคโครแบบนี้ตองมีการผานคาสองคาคือตํ าแหนงคอลัมนและตํ าแหนงแถวและกํ าหนดตํ าแหนงบนหนาจอโดยเรียนอินเทอรรัพต 10H ในที่นี้จะเขียนแมคโครชื่อ LOCATE

LOCATE MACRO ROW,COLUMN ; สงผานคาคอลัมนและคาแถวPUSH AX ; เก็บคา AXPUSH BX ; เก็บคา BXPUSH DX ; เก็บคา DXMOV BX,0MOV AH,2MOV DH,ROW ; ใสคาแถวใน DHMOV DL,COLUMN ; ใสคาแถวใน DLINT 10HPOP DX ; คือคาในรีจิสเตอรตางๆPOP BXPOP AXENDM

สํ าหรับโปรแกรมในรูปที่ 9.2 เปนการเขียนโปรแกรมในรูปที่ 9.1 ใหม โดยเพิ่มแมคโคร กํ าหนดตํ าแหนงบนหนาจอ แมคโครเคลียรหนาจอ และแสดงการเรียกใชแมคโครตางๆ

.MODEL SMALLSENE_MSG MACRO STRING ; เร่ิมแมคโครพิมพขอมูลสตริง

LEA DX.STRINGMOV AH,9INT 21HENDM

CLEARSCREEN MACRO ; เร่ิมแมคโครเคลียรหนาจอPUSH AXPUSH BXPUSH CXPUSH DXMOV AX,0600HXOR CX,CX

Page 53: Document Assembly

Ratiwat Paresri Page 53 29/6/03

MOV DX,184FHMOV BH,61HINT 10HPOP DXPOP CXPOP BXPOP AXENDM

LOCATE MACRO ROW.COLUMN ;เร่ิมแมคโครกํ าหนดคาตํ าแหนงบนหนาจอPUSH AXPUSH BXPUSH DXMOV BX.0MOV AH,2MOV DH,ROWMOV DL,COLUMNINT 10HPOP DXPOP BXPOP AXENDM

; สิ้นสุดการกํ าหนดแมคโคร.STACK 100H.DATA

STRING_1 DB “THIS IS COMPUTER.’,0AH,0DH,’ $ “STRING_2 DB ‘MR.TEERAWAT PRAKOBPHON’,0AH,0DH,’ $ “

.CODEMAIN PROC

MOV AX,@DATAMOV DS,AXCLEARSCREENLOCATE 10,15SEND_MSG STRING_1LOCATE 15,15SEND_MSG STRING_2MOV AH,4CHINT 21

MAIN ENDPEND MAIN

การใชลาเบลในแมคโครถาหากตองการเขียนกลุมคํ าส่ังตอไปนี้เปนแมคโคร

Page 54: Document Assembly

Ratiwat Paresri Page 54 29/6/03

CMP AL,10JNC NOADDADD AL,7

NOADD; ADD AL,30HMOV DL,ALMOV AH,2INT 21H

ตํ าแหนงที่เปนลาเบล NOADD โปรแกรมแอสเซมเบลอรจะแจง Error ออกมา ถาหากในแมคโครตองการใชลาเบลจะตองมีการประกาศลาเบลเสียกอน โดยจะประกาศเปนตัวแปร LOCAL เพื่อบอกวาตัวแปรนี้เปนลาเบลในแมคโคร ซึ่งสามารถทํ าไดดังนี้

HEXOUT MACROLOCAL NOADDCMP AL,10JNC NOADDADD AL,7

NOADD ADD AL,30HMOV DL,ALMOV AH,2INT 21HENDM

เมื่อแมคโคร HEXOUT ถูกเรียกใช แอสเซมเบลอรจะรูจักตัวแปรใหมที่เปนลาเบลชื่อ NOADD

การกํ าหนดเงื่อนไขในแมคโครในแมคโครสามารถเขียนโปรแกรมแบบเงื่อนไขได พิจารณาแมคโครตอไปนี้SHIFT MACRO SIZE

IF SIZE EQ8 SHR AL,1

ELSE SHR AX,1

ENDIFENDM

ในแมคโครจะใชตัวแปร SIZE เปนพารามิเตอรที่รับขอมูลเขาไป โดยภายในแมคโครจะใชคํ าส่ัง SHRเล่ือนขอมูลมรีจิสเตอร AL ไปทางขวาหนึ่งครั้ง ถาคา SIZE มีคาเทากับ 8 การทํ างานตามเงื่อนไขจะอยูระหวางคํ าส่ัง IF กับ ELSE และ ELSE กับ ENDIF และการตร วจสอบเงื่อนไขสามารถใชคํ าส่ังเทียมตางๆ ไดดังนี้

Page 55: Document Assembly

Ratiwat Paresri Page 55 29/6/03

คํ าส่ังเทียม การตรวจสอบEONELTGTLEGE

EqualNot equalLest thanGreater thanLess then or equalGreater than or equal

ตัวกํ าหนดการแมคโครในแมคโครสามารถใชตัวดํ าเนินการได โดยมีส่ีตัวดังนี้

ตัวดํ าเนินการ การทํ างาน%

<..>;;&

ExpressionLiteral character stringMacro commentSubstitute

ตัวอยางเชนถาใชตัวดํ าเนินการ % กับคาพารามิเตอร value ที่รับเขาไป ดังตัวอยางแมคโครตอไปนี้MOV_AL MACRO VAL

MOV AL,VALENDM

จากนั้นเรียกแมคโครดวย MOV_AL 2*30 หรือเรียกดวย MOV_AL % 2*30 ผลลัพธจากการทํ างานจะตางกันดังนี้

MOV_AL 2*30 ไดเปน MOV AL,2*30MOV_AL %2*30 ไดเปน MOV AL,60

คํ าส่ัง REPTคํ าส่ัง REPT เปนคํ าส่ังเทียมของแมคโคร ซึ่งตางจากคํ าส่ัง REP โดยจะใชในการทํ าซํ้ าซึ่งมีรูปแบบ

คํ าส่ังดังนี้REPT expression

StatementsENDM

คํ าส่ังนี้จะทํ าใหเกิดการทํ างานซํ้ าระหวางคํ าส่ัง REPT และ ENDM ตัวอยางเชนการกํ าหนดตัวแปร Aเปนตัวแปรอารเรย 5 ตัวสามารถเขียนไดดังนี้

A LABEL WORDREPT 5

Page 56: Document Assembly

Ratiwat Paresri Page 56 29/6/03

DW 0ENDM

เมื่อแอสเซมเบลอรแปรความหมายจะไดผลดังตอไปนี้A DW 0

DW 0DW 0DW 0DW 0

ตัวอยางที่ 9.6 จงเขียนแมคโครกํ าหนดคาเริ่มตนในบล็อกหนวยความจํ าตั้งแตคาแรกจนถึงคา Nวิธีทํ า

BLOCK MACRO NK = 1REPT N DW K K = K + 1ENDMENDM

จะเห็นวาในแมคโครจะใชเครื่องหมาย = แทนคํ าส่ังเทียม EQU ในการกํ าหนดคาตางๆ ใหกับตัวแปรถาหากตองการกํ าหนดคาอารเรยตั้งแต 1 ถึง 100 จะเขียนไดดังนี้

A LABEL WORDBLOCK 100

จงทํ าใหคาตางๆ เปนดังตอไปนี้A DW 1

DW 2….DW 100

ตัวอยางที่ 9.7 จงเขียนแมคโครกํ าหนดคาเริ่มตนจํ านวน n เวิรด แตละตํ าแหนงมีคาเปน 1!,2!,n!วิธีทํ า เขียนไดดังนี้

FACTORIALS MACRO NM = 1FAC = 1REPT NDW FAC

Page 57: Document Assembly

Ratiwat Paresri Page 57 29/6/03

M = M + 1FAC = M * FACENDMENFM

ถากํ าหนดอารเรยชื่อ B ในการหาคาของ 8! จะเขียนไดดังตอไปนี้B LABEL WORD

FACTORIAL 8เนื่องจาก 8! มีคาเทากับ 40320 ดังนั้นจะตองมีเนื้อที่ในการเก็บขอมูล 16 บิต คาตางๆ จะเปนดังตอ

ไปนี้B DW 1

DW 2DW 6DW 24DW 120DW 720DW 5040DW 40320

ตัวอยางที่ 9.8 จากตัวอยางที่ 9.3 จงเขียนแมคโครใหมโดยใชคํ าส่ัง REPTวิธีทํ า เขียนใหมไดดังนี้

SHL_AX MACROREPT 4

SHL AX,1ENDM

ENDMแมคโคร IRP (indefinite repeat) เปนคํ าส่ังของแมคโครที่ใชในการทํ างานซํ้ าๆ มีรูปแบบดังนี้

IRP d,<a1,a2,….an>Statements

ENDMแมคโครจะทํ างานซํ้ าๆ โดยผานคาเขาไปใน a1,a2,…an ตัวอยางเชน ถาตองการเขียนแมคโครให

เก็บคาและคืนคาของรีจิสเตอรตางๆ สามารถทํ าไดดังนี้SAVE_REGS MACRO REGS

IRP D,<REGS>PUSH DENDM

Page 58: Document Assembly

Ratiwat Paresri Page 58 29/6/03

ENDM

RESTORE_REGS MACRO REGSIRP D,<REGS>POP DENDMENDM

ถาหากเราตองการเก็บคาของรีจิสเตอร AX,BX,CX และ DX เราสามารถเรียกใชแมคโครไดดังนี้SAVE_REGS MACRO <AX,BX,CX,DX> ผลลัพธที่ไดจะมีคาเทา

กับการทํ าคํ าส่ังตอไปนี้PUSH AXPUSH BXPUSH CXPUSH DX

ในทํ านองเดียวกันถาหากตองการคืนคาใหกับรีจิสเตอร DX,CX,BX และ AX จะเรียกใชแมคโครไดดังนี้RESTORE_REGS <DX,CX,BX,AX>

คํ าส่ังเทียม LOCALในการเขียนโปรแกรมที่มีการทํ าซํ้ าจะตองกํ าหนดตํ าแหนงที่จะใหโปรแกรมกระโดดหรือการกํ าหนดลา

เบลในแมคโครจะใชคํ าส่ัง LOCAL ในการกํ าหนดตํ าแหนง โดยคํ าส่ังนี้จะใชไดในแมคโครเทานั้น เมื่อแอสเซมเบลอรแปลคํ าส่ังในการเรียกใชแมคโครแตละครั้งคาลาเบลจะแตกตางกัน การใชงานจะตองวางตามหลังคํ าส่ังแมคโคร รูปแบบของคํ าส่ังเปนดังนี้

LOCAL list_of_labeles

ตัวอยางที่ 9.9 จงเขียนโปรแกรมเปรียบเทียบขอมูลสองเวิรดในรีจิสเตอร AX วาคาใดมากกวาวิธีทํ า

GET_BIG MACRO WORD1,WORD2LOCAL EXITMOV AX,WORD1CMP AX,WORD2JG EXITMOV AX,WORD2

EXITENDM

ถาหากมีการเปรียบเทียบตัวแปรเวิรด FIRST,SECOND และ THIRD จะเรียกใชแมคโครดังนี้GET_BIG FIRST,SECONDผลลัพธที่ไดจะเปน

Page 59: Document Assembly

Ratiwat Paresri Page 59 29/6/03

MOV AX,FIRSTCMP AX,SECONDJG ??0000MOV AX,SECOND

??0000:ตอไปเรียกGET_BIG SECOND,THIRDผลลัพธที่ไดจะเทากับ

MOV AX,SECONDCMP AX,THIRDJG ??0001MOV AX,THIRD

??0001จะเห็นวาในการเรียกใชแมคโครแตละครั้งคาลาเบลจะแตกตางกัน โดยคาลาเบลจะเริ่มจาก 0000H

ถึง FFFFH โดยใชเครื่องหมาย ?? นํ าหนา

แมคโครเอาตพุตการใชโครงสรางแบบแมคโครในการเขียนแมคโคร HEX_OUT เพื่อแสดงเวิรดขอมูลเลขฐานสิบหกที่มี

4 หลัก อัลกอริทึมของมันเปนดังนี้1.FOR 4 time DO2.MOV BH to DL3.shift DL 4 time to the right4.IF DL < 105.THEN6.convert contents of DL to a character in ‘0’…’9’7.ELSE8.convert contents of DL to a character in ‘A’..’F”9.END_IF10.output character11.Rotate BX lift 4 times12.END_FOR

ตัวอยางโปรแกรมรูปที่ 9.3 เปนโปรแกรมตัวอยางการเขียนแมคโคร HEX_OUT เพื่อแสดงขอมูลตัวเลขในรีจิสเตอร AX ออกมาเปนเลขฐานสิบหก

MODEL SMALL

Page 60: Document Assembly

Ratiwat Paresri Page 60 29/6/03

SAVE_REGS MACRO REGSIRP D,<REGS>PUSH DENDMENDM

RESTORE_REGS MACRO REGSIRP D,<REGS>POP DENDMENDM

CONVERT_TO_CHAR MACRO BYTLOCAL ELESE_EXITCMP BYT,9JNLE ELSE_OR BYT,30HJMP EXIT

ELSE_:ADD BYT,37H

EXIT: ENDM

DISP_CHAR MACRO BYTPUSH AXMOV AH,2MOV DL,BYTINT 21HPOP AXENDM

HEX_OUT MACRO WRDSAVE_REGS <BX,CX,DX>MOV BX,WRDMOV CL,4REPT 4MOV DL,BHSHR DL,CLCONVERT_TO_CHAR DL

Page 61: Document Assembly

Ratiwat Paresri Page 61 29/6/03

DISP_CHAR DLROL BX,CLENDM

RESTORE_REGS <DX,CX,BX>ENDM

.STACK

.CODE

MAIN PROCMOV AX,1AF4HHEX_OUT AXMOV AH,4CHINT 21H

MAIN ENDPEND MAIN

โปรแกรมรูปที่ 9.4 เปนโปรแกรมทดสอบแมคโคร โดยจะเขียนแมคโครในการรับสงขอมูลแปลงเลขฐาน 10 เปนเลขฐานสิบหก และรอรับคาคีย C จากแปนพิมพ

:Program TESTMAC.ASM:Test macro expansion:

.MODEL SMALL

.DATASMSG1 DB ‘This message was output by the DISP_MSG macro.’,0DH,0AH,’$’SMSG2 DB ‘This message was output by theSEND_MSG macro.’,0DH,0AH,’$’SMSG3 DB ‘decimal equals $’SMSG4 DB ‘hexadecimal.’,0DH,0AH,’$’WMSG DB ‘Hit <C> to continue….$DISP_MSG MACRO

MOV AH,9 ;;display string functionINT 21H ;;DOS callENDM

SEND_MSG MACRO ADDRLEA DX,ADDR ;;set up pointer to string

Page 62: Document Assembly

Ratiwat Paresri Page 62 29/6/03

MOV AH,9 ;;display string functionINT 21H ;;DOS callENDM

DISP_CHAR MACRO DATAMOV DL,DATA ;;load ASCII characterMOV AH,2 ;;display output functionINT 21H ;;DOS callENDM

CRLF MACRODISP_CHAR 0DHDISP_CHAR 0DHENDM

NUM_OUT MACRO DATA,BASEIF BASE EQ 10MOV AL,DATA ;;load numberMOV BL,100 ;;load divisorCALL DEC_OUT ;;find and display 100’s digitMOV BL,10 ;;load divisorCALL DEC_OUT ;;find and display 10’s digitADD AL,30H ;;add ASCII bias to 1’s digitDISP_CHAR AH ;;display digitELSEMOV AL,DATA ;;load numberPUSH AX ;;save itMOV CL,4 ;;load shift counterSHR AL,CL ;;shift upper nibble downCALL HEX_OUT ;;display MS hex digitPOP AX ;;get number backCALL HEX_OUT ;;display LS hex digitENDIFENDM

HIT_C MACROLOCAL WAIT_C,EXITSEND_MSG WMSG

WAIT_C MOV AH,1 ;;read keyboard function

Page 63: Document Assembly

Ratiwat Paresri Page 63 29/6/03

INT 21H ;;DOS callCMP AL,’c’ ;;is character a ‘c’?JZ EXITCMP AL,’C’ ;;is character a ‘C’?JNZ WAIT_C ;;no, repeat until it is

EXIT: CRLF ;;output cr and ifENDM

;;จบแมคโคร เริ่มโปรแกรมหลัก.CODE.STARTUPLEA DX,SMSG1 ;set up pointer to messageDISP_MSG ;display messageSEND_MSG SMSG2 ;display second messageDISP_CHAR ‘H’ ;output ‘Hi.’DISP_CHAR ‘I’DISP_CHAR ‘.’CRLF ;and cr and ifNUM_OUT 100,10 ;display 100 in decimalSEND_MSG SMSG3 ;display decimal messageNUM_OUT 100,16 ;display 100 in hexadecimalSEND_MSG SMSG4 ;display hex messageHIT_C ;wait for a c/CHIT_C ;wait for another c/C.EXIT

HEX_OUT PROC NEARAND AL,0FH ;clear upper nybbleAND AL,30H ;add ASCII biasCMP AL,’9’+ 1 ;do we need alpha fix?JC NOADD7ADD AL,7 ;add alpha bias

NOADD7 DISP_CHAR AL ;display hex digitRET

HEX_OUT ENDPDEC_OUT PROC NEAR

Page 64: Document Assembly

Ratiwat Paresri Page 64 29/6/03

SUB AH,AH ;prepare for divisionDIV BL ;find digitADD AL,30H ;add ASCII biasPUSH AX ;save remainderDISP_CHAR AL ;display digitPOP AX ;get remainder backXCHG AH,AL ;save new numberRET

DEC_OUT ENDPEND

การใชคํ าส่ังเทียม EXTRN และ PUBLICการเขียนโปรแกรมภาษาแอสเซมบลีนั้นเราสามารถเขียนโปรแกรมเปนสวนๆ หรือออกแบบโปรแกรม

แบบโมดูล (modular design) ซึ่งจะทํ าใหการพัฒนาโปรแกรมขนาดใหญ สามารถทํ าเปนโพซีเยอรยอยๆ ไดแลวนํ าโปรแกรมแตละสวนมาลิงคกันใหเปนโปรแกรมใหญได คํ าส่ัง EXTRN จะใชบอกวาชื่อโพซีเยอรที่ตามมาจะอยูคนละไฟลของโปรแกรมที่กํ าลังเขียน คํ าส่ัง PUBLIC จะเปนการบอกวาชื่อโพซีเยอรนี้สามารถใหโปรแกรมอื่นเรียกใชงานได โปรแกรมในรูปที่ 9.5 เปนโพซีเยอรงายๆ ที่ใชแสดงเลขฐานสองทางหนาจอจะเห็นวามีการประกาศ PUBLIC และตามดวยชื่อโพซีเยอรเอาไว เพื่อใหโปรแกรมอื่นเรียกใชงานได

;Procedure DISPBIN .ASM: Display value of AL in binary on the screen;

.MODEL SMALL

.CODEPUBLIC DISPBIN ;for linking

DISPBIN PROC FARMOV CX,8 ;set up loop counter

NEXT: SHL AL,1 ;move bit into Carry flagPUSH AX ;save numberJC ITIS1 ;was the LSB a 1?MOV DL,30H ;load ‘o’ characterJMP SAY01 ;go display it

ITIS1: MOV DL,31H ;load ‘1’ characterSAY01: MOV AV,2 ;display character function

INT 21H ;DOS callPOP AX ;get number backLOOP NEXT ;and repeat

Page 65: Document Assembly

Ratiwat Paresri Page 65 29/6/03

RETDISPBIN ENDP

END

สํ าหรับโปรแกรมในรูปที่ 9.6 เปนโปรแกรมหลักที่จะเรียกใชโปรแกรมยอย DISPBIN จะเห็นวามีการประกาศ EXTRN เอาไว

:Program TESTBIN.ASM: Test the DISPBIN display procedure.:

.MODEL SMALL

.CODEEXTRN DISPBIN : FAR ;for linking.STARTUPSUB AL,AL ;clear counter

AGAIN PUSH AX ;save counterCALL DISPBIN ;display counter in binaryMOV DL,20H ;load blank characterMOV AH,2 ;display character functionINT 21H ;DOS callMOV AH,2 ;output a second blankINT 21HPOP AX ;get counter backINC AL ;increment inJNZ AGAIN ;and repeat until counter equals zero.EXITEND

หลังจากแอสเซมเบลอรโปรแกรมทั้งสองใหเปนออปเจ็กไฟล เราสามารถนํ าโปรแกรมทั้งสองมาลิงครวมกันได โดยใชคํ าส่ังนี้

LINK TESTBIN + DISPBIN,,,.จะไดไฟลเปน TESTBIN .EXE ซึ่งสามารถรันไดโดยตรง