770 likes | 971 Views
วิชาการโปรแกรมภาษาแอสเซมบลี้ รหัส 3105-2015 3 คาบ / สัปดาห์ 2 หน่วยกิต. ความรู้ทั่วไปเกี่ยวกับโปรแกรมแอสเซมบลี้. ลักษณะของภาษา ทำไมต้องเขียนด้วย Assembly ฟังก์ชันในภาษาระดับสูงไม่ตรงกับความต้องการ หรือ มีแต่ขาดประสิทธิภาพ
E N D
วิชาการโปรแกรมภาษาแอสเซมบลี้วิชาการโปรแกรมภาษาแอสเซมบลี้ รหัส 3105-2015 3 คาบ / สัปดาห์ 2 หน่วยกิต
ความรู้ทั่วไปเกี่ยวกับโปรแกรมแอสเซมบลี้ความรู้ทั่วไปเกี่ยวกับโปรแกรมแอสเซมบลี้ • ลักษณะของภาษา • ทำไมต้องเขียนด้วย Assembly • ฟังก์ชันในภาษาระดับสูงไม่ตรงกับความต้องการ หรือ มีแต่ขาดประสิทธิภาพ • ส่วนของโปรแกรมที่ที่ถูกเรียกใช้บ่อย มักถูกเขียนด้วย Assembly • การจัดการกับเหตุการณ์บางอย่างที่เกิดขึ้นบ่อย ๆ
ลักษณะงานที่เขียนโดยโปรแกรม Assembly • เกี่ยวข้องกับ Hardware โดยตรง • Memory • Register
ข้อดีของโปรแกรมแอสเซมบลี้ข้อดีของโปรแกรมแอสเซมบลี้ • ความเร็วการทำงานสูงสุด • ขนาดของโปรแกรมเมื่อ Assembler แล้วเล็กมากๆ • ประสิทธิภาพในการควบคุมการทำงานของโปรแกรม
ข้อเสียของโปรแกรมแอสเซมบลี้ข้อเสียของโปรแกรมแอสเซมบลี้ • ความยุ่งยากในการเขียนโปรแกรม • เครื่องมือในการทำงานมีมาก
สิ่งที่เราต้องทราบก่อนที่จะเขียน Assembly • ความรู้เกี่ยวกับระบบคอมพิวเตอร์ที่เราจะเขียน • สถาปัตยกรรมของ CPU ที่ใช้ในระบบ • Software ที่ใช้ในการพัฒนาโปรแกรม • Editor • Assember • linker • Debugger
ลักษณะโครงสร้างของหน่วยความจำลักษณะโครงสร้างของหน่วยความจำ 8 บิต 0001 0002 0003
ลักษณะโครงสร้างของหน่วยความจำ MP 16 บิต 8 บิต • หน่วยความจำจะถูกแบ่งเป็น Block ละเท่าๆ กัน • กำหนดชนิดของข้อมูลที่จะเก็บ • Code • Data 0000:0000 1 Segment XXXX:YYYY 1 Segment 1 Segment
สถาปัตยกรรมของ CPU 16 บิต 80486 80386 80286 ชุดคำสั่ง 8088
สถาปัตยกรรมของ CPU 16 บิต • รีจิสเตอร์ (Register) • รีจิสเตอร์ทั่วไป (General purpose register) ชื่อรีจิสเตอร์ ขนาด การแบ่งครึ่ง 8 bit AX 16 Ah Al BX 16 Bh Bl CX 16 Ch Cl DX 16 Dh Dl SI 16 - - DI 16 - - BP 16 - - SP 16 - -
รีจิสเตอร์ทั่วไป • AX (Accumulator) เก็บข้อมูลทั่วไป ทำคำสั่งคูณ หาร I/O • BX (Base Register) ชี้ Offset address ข้อมูลใน Data Segment • CX (Counter Register) ตัวนับรอบในคำสั่งที่ทำงานเป็น Loop • DX (Data Register) เก็บข้อมูลทั่วไป ทำคำสั่งคูณ หาร I/O ในบางกรณี ใช้ร่วมกับ AX เพื่อเก็บผลลัพธ์
รีจิสเตอร์ทั่วไป • SI (Source Index) ชี้ Offset address ข้อมูลใน Data Segment ที่เกี่ยวข้องกับคำสั่ง String • DI (Destination Index) เหมือน SI แต่ DI ใช้ชี้ตำแหน่งปลายทาง • SP (Stack pointer) ชี้ Offset address บนสุด ของข้อมูลใน Stack • BP (Base pointer) ชี้ Offset address ล่างสุด ของข้อมูลใน Stack
สถาปัตยกรรมของ CPU 16 บิต • รีจิสเตอร์ (Register) • เซกเมนต์รีจิสเตอร์ (Segment register) ชื่อรีจิสเตอร์ ขนาด การแบ่งครึ่ง 8 bit CS 16 - - DS 16 - - SS 16 - - ES 16 - -
เซกเมนต์รีจิสเตอร์ • CS (Code segment) ชี้ Segment address ที่เก็บกลุ่มคำสั่ง ที่ซีพียูจะทำการ Execute) • DS (Data segment) ชี้ Segment address ที่เก็บกลุ่มข้อมูล ที่จะถูกประมวลผลด้วยชุดคำสั่ง • SS (Stack segment) ชี้ Segment address ที่เก็บข้อมูล Stack • ES (Extra segment) ชี้ Segment address ที่เก็บกลุ่มข้อมูล ที่จะถูกประมวลผลด้วยชุดคำสั่ง เพื่อช่วย DS ในคำสั่งที่เกี่ยวข้องกับ String
สถาปัตยกรรมของ CPU 16 บิต • รีจิสเตอร์ (Register) • รีจิสเตอร์พิเศษ (Special purpose register) ชื่อรีจิสเตอร์ ขนาด การแบ่งครึ่ง 8 bit IP 16 - - Flag 16 - -
รีจิสเตอร์พิเศษ • IP (Instruction pointer) ชี้ Offset address ของคำสั่งใน Code segment ที่เป็นคำสั่งต่อไปที่จะถูก Execute (CS:IP) • FLAG แสดงสถานะ (status) ของซีพียูในขณะนั้น ที่เป็นผลมาจากการ Execute แต่ละคำสั่ง โดยแต่ละบิตจะแทนสถานะของซีพียู ซึ่งคำสั่งแต่ละคำสั่งจะมีผลไม่มากก็น้อย
b15 b13 b11 b9 b7 b5 b3 b1 b14 b12 b10 b8 b6 b4 b2 b0 - - - - O D T S Z - A - P - C I แฟลกรีจิสเตอร์ (FLAG) • C (Carry flag) แฟลกตัวทด แสดงสถานะของการทดหรือการยืม • P (Parity flag) แฟลกพาริตี้ แสดงสถานะของจำนวนบิตที่เป็น “1” ใน Low order bit ว่าเป็นคู่หรือคี่ (จำนวนคู่ P=1) • A (Auxilary flag) แฟลกทดช่วย แสดงสถานะของการทดหรือการยืมหมือนกับ Carry แต่เป็นคำสั่งเกี่ยวกับ BCD • Z (Zero flag) แฟลกศูนย์ แสดงสถานะเมื่อซีพียูทำคำสั่งแล้วได้ผลลัพธ์เท่ากับ ศูนย์
b15 b13 b11 b9 b7 b5 b3 b1 b14 b12 b10 b8 b6 b4 b2 b0 - - - - O D T S Z - A - P - C I แฟลกรีจิสเตอร์ (FLAG) • S (Sign flag) แฟลกเครื่องหมาย แสดงสถานะเมื่อผลลัพธ์เป็นลบ • T (Trap flag) ใช้กำหนดให้ซีพียูทำงานเป็นแบบ Single step • I (Interrupt flag) แฟลกอินเตอร์รัพท์ กำหนดให้ซีพียูยอมรับการขัดจังหวะหรือไม่ (ยอมรับ I=1) • D (Direction flag) แฟลกทิศทาง กำหนดทิศทางการทำงานของคำสั่ง String (ทิศทางจากน้อยไปมาก D=0) • O (Overflow flag) แฟลกค่าเกิน
ลำดับขั้นการเขียนโปรแกรมลำดับขั้นการเขียนโปรแกรม Start Editor *.ASM Assembler *.OBJ Error yes No *.EXE Linker Debugger Stop
รูปแบบการเขียนโปรแกรมแอสเซมบลี้รูปแบบการเขียนโปรแกรมแอสเซมบลี้ DOSSEG .MODEL Small .STACK 128 .DATA .CODE MOV Ah,4CH INT 21H END พี้นที่ในการเขียนจองหน่วยความจำ พี้นที่ในการเขียนโปรแกรม
รายละเอียด • DOSSEG เป็นคำสั่งเทียมใช้บอกโปรแกรมแอสเซมเบลอ ว่า เขียนโปรแกรมตามรูปแบบของบริษัทไมโครซอฟ • .MODEL Small เป็นการระบุขนาดของโปรแกรมที่เราจะเขียนซึ่งจะมีผลต่อ Data Segment และ Code Segment
คำสั่งที่ใช้แทน Small ได้ Data Segment Code Segment คำสั่ง • Tiny Data และ Code อยู่ใน Segment เดียวกัน • Small ไม่เกิน 1 Segment ไม่เกิน 1 Segment • Mediumไม่เกิน 1 Segment เกิน 1 Segment ได้ • Compact เกิน 1 Segment ได้ ไม่เกิน 1 Segment • Large เกิน 1 เกิน 1
รายละเอียด • .STACK 128 เป็นคำสั่งเทียมบอกจุดเริ่มต้นบริเวณที่เป็น Stack segment ตัวเลข 128 คือขนาดที่จองมีหน่วยเป็น Byte • .DATA เป็นคำสั่งเทียมใช้บอกจุดเริ่มต้นบริเวณที่เป็น Data segment • .CODE เป็นคำสั่งเทียมใช้บอกจุดเริ่มต้นบริเวณที่เป็น Code segment • END เป็นคำสั่งเทียมบอกว่าโปรแกรมจบเพียงเท่านี้
การทำงานของโปรแกรม Application OS BIOS Hardware
โครงสร้างโปรแกรมในแต่ละบรรทัดโครงสร้างโปรแกรมในแต่ละบรรทัด [name] [operation] [operand] [;comment] • name หรือ label เป็นการตั้งชื่อให้กับคำสั่งในบรรทัดนั้น ๆ • ตัวอย่าง start: xxx xxx goto start
โครงสร้างโปรแกรมในแต่ละบรรทัดโครงสร้างโปรแกรมในแต่ละบรรทัด [name] [operation] [operand] [;comment] • operation เป็นคำที่ใช้บอกลักษณะการกระทำของบรรทัดนั้น ๆ ว่าให้ทำอะไร ปกติจะเป็นคำสั่งจริงของไมโครโปรฯ • ตัวอย่าง MOV xxx ADD xxx
โครงสร้างโปรแกรมในแต่ละบรรทัดโครงสร้างโปรแกรมในแต่ละบรรทัด [name] [operation] [operand] [;comment] • operand เป็นข้อมูลที่ถูกกระทำโดย operation ที่เขียนข้างหน้า • ตัวอย่าง MOV AX,BX ADD Bh NOP
โครงสร้างโปรแกรมในแต่ละบรรทัดโครงสร้างโปรแกรมในแต่ละบรรทัด [name] [operation] [operand] [;comment] • Comment จะเป็นส่วนอธิบายความหมายของบรรทัด ว่าคำสั่งนั้นใช้ทำอะไร • ตัวอย่าง MOV CX,10 ;กำหนดให้โปรแกรมทำงาน 10 ครั้ง xxx xxx
กติกาในการตั้งชื่อ ตัวแปร ,label , โปรแกรมย่อย • ต้องขึ้นต้นด้วยตัวอักษรเท่านั้น • ความยาวของชื่อต้องไม่เกิน 31 ตัวอักษร • ต้องไม่เป็น Reserve word • อนุญาตให้ใช้เครื่องหมายเหล่านี้ในชื่อได้ ‘ _ ’ , ‘ @ ’ , ‘ ? ‘ , ‘ $ ‘ • ตัวอักษรเล็กหรือใหญ่ถือว่าเป็นตัวเดียวกัน (no case sensitive)
กฎการใช้ค่าคงที่ต่าง ๆ • ค่าคงที่ที่เป็นจำนวนเต็ม • ปิดท้ายด้วยตัว B เมื่อเป็นเลขฐาน 2 เช่น 1000B • ปิดท้ายด้วยตัว Q เมื่อเป็นเลขฐาน 8 เช่น 1000Q • ปิดท้ายด้วยตัว D หรือไม่เขียนเมื่อเป็นเลขฐาน 10 เช่น 1000 , 1000D • ปิดท้ายด้วยตัว H เมื่อเป็นเลขฐาน 16 เช่น 1000H และตัวเลขที่ขึ้นต้นด้วยตัวอักษรต้องเขียนเลข 0 นำหน้าเสมอ เช่น 0A5H • ค่าคงที่ที่เป็น string จะต้องเขียนอยู่ภายใต้เครื่องหมายคำพูดเปิดและปิด ‘_____’ , “_____”
การจองพื้นที่เพื่อเก็บข้อมูลและการตั้งค่าเริ่มต้นการจองพื้นที่เพื่อเก็บข้อมูลและการตั้งค่าเริ่มต้น .DATA .CODE การจองพี้นที่ตรงนี้
การจองพื้นที่เพื่อเก็บข้อมูลและการตั้งค่าเริ่มต้นการจองพื้นที่เพื่อเก็บข้อมูลและการตั้งค่าเริ่มต้น .DATA [name] [directive] [initialize] [;comment] • Name: ชื่อประจำบรรทัด หรือ ชื่อของตัวแปร • directive : เป็นคำสั่งเทียมใช้ระบุขนาดของหน่วยความจำ • DB (Defined byte) เก็บข้อมูล 8 บิต • DW (Defined word) เก็บข้อมูล 16 บิต • DD (Defined double word) เก็บข้อมูล 32 บิต
การจองพื้นที่เพื่อเก็บข้อมูลและการตั้งค่าเริ่มต้นการจองพื้นที่เพื่อเก็บข้อมูลและการตั้งค่าเริ่มต้น .DATA [name] [directive] [initialize] [;comment] • initialize : เป็นการระบุค่าเริ่มต้นที่เราจะจอง • comment : คำอธิบาย
ไปลองใช้โปรแกรมกันเถอะไปลองใช้โปรแกรมกันเถอะ Editor Assembler Link debugger
กลุ่มคำสั่ง Data Transfer MOV {Register | Memory} , {Register | Memory | immediate} • ตัวอย่าง MOV CX,0125H MOV Al,05H MOV AX,BX MOV Ah,Bl MOV Bl,[Data_1] MOV [Data_2],Ah MOV Byte PTR[data_2],50
กลุ่มคำสั่ง Data Transfer XCHG {Register | Memory} , {Register | Memory } • ตัวอย่าง XCHG AX,BX XCHG Ah,Bl XCHG Bl,[Data_1] XCHG [Data_2],Ah
กลุ่มคำสั่ง Data Tranfer LEA Register word , Variable • ตัวอย่าง LEA SI,Data_1 LEA DI,Data_2 MOV Al,[SI] MOV Bh,[DI]
ตัวอย่างโจทย์ เขียนโปรแกรมกำหนดค่าให้กับรีจิสเตอร์ดังนี้AX = 100 , Bl = 70 , CX = 300 , DX = AX MOV AX,100 MOV Bl,70 MOV CX,300 MOV DX,AX MOV Ah,4CH INT 21H END DOSSEG .MODEL Small .STACK 128 .DATA .CODE MOV AX,@data MOV DS,AX
ตัวอย่างโจทย์ เขียนโปรแกรมกำหนดค่าให้กับรีจิสเตอร์ดังนี้AX = 100 , Bl = 70 , CX = 300 , DX = AX เก็บค่า Bl ลงที่ Data_1เก็บค่า CX ลงที่ Data_2สำเนาข้อมูลจาก Data_2 ไปยัง Data_3 DOSSEG .MODEL Small .STACK 128 .DATA Data_1 DB 00 Data_2 DW 0000 Data_3 DW 0000 .CODE MOV [Data_1],Bl MOV [Data_2],CX MOV AX,[Data_2] MOV [Data_3],AX MOV Ah,4CH INT 21H END
ป้อนโปรแกรมลงเครื่อง เพื่อดูว่าผลได้ผล ตามที่เราต้องการหรือไม่
กลุ่มคำสั่ง ควบคุมลำดับการทำงาน • แบบไม่มีเงื่อนไข • JMPlabel • แบบมีเงื่อนไข • Jconditiontrue label • Jflag_nametrue label
กลุ่มคำสั่ง ควบคุมลำดับการทำงาน • แบบไม่มีเงื่อนไข • JMPlabel • ตัวอย่าง • start: MOV AX,100 • MOV CX,20 • JMP start
คำสั่งเกี่ยวกับการเปรียบเทียบคำสั่งเกี่ยวกับการเปรียบเทียบ CMP {Register | Memory} , {Register | Memory | immediate} (ใช้เปรียบเทียบเพื่อผลของคำสั่งใช้ตัดสินใจในคำสั่ง jump) • ผลการเปรียบเทียบ - flag Z = 1 ถ้าผลการเปรียบเทียบแล้วเท่ากัน - flag Cy = 1 ถ้าผลการเปรียบเทียบแล้ว opr1 < opr2 - flag Cy = 0 , Z = 0 ถ้าผลการเปรียบเทียบแล้ว opr1 > opr2
ใช้ N เพื่อให้ ตรงข้ามได้ กลุ่มคำสั่ง ควบคุมลำดับการทำงาน • แบบมีเงื่อนไข (เงื่อนไขเป็นจริงกระโดดไป true label) • Jconditiontrue label • condition : • G >>>Greater than <<< A (Above) • L >>>Lass than <<< B (Below) • E >>>Equal
กลุ่มคำสั่ง ควบคุมลำดับการทำงาน xxx CMP Ah,05H JG greater yyy yyy JMP cont greater: yyy yyy cont: xxx xxx ตัวอย่าง เงื่อนไขเป็นเท็จ เงื่อนไขเป็นจริง
กลุ่มคำสั่ง ควบคุมลำดับการทำงาน • แบบมีเงื่อนไข (เงื่อนไขเป็นจริงกระโดดไป true label) • Jflag_nametrue label • JCXZ true label • flag_name : • Z >>> z = 1 เมื่อผลลัพธ์เป็น 0 • Cy >>> Cy = 1 เมื่อมีตัวทดหรือตัวยืม
กลุ่มคำสั่ง ควบคุมลำดับการทำงาน xxx CMP Ah,05H Jz equal yyy yyy JMP cont equal: yyy yyy cont: xxx xxx ตัวอย่าง เงื่อนไขเป็นเท็จ เงื่อนไขเป็นจริง
ตัวอย่างโปรแกรม .DATA data_1 DB 09 data_2 DB 00 .CODE MOV Bh,[data_1] CMP Bh,10 JG Exit MOV byte PTR[data_2],05 Exit: MOV Ah,4CH INT 21H END start Bh <---- [data_1] yes Bh > 10 no [data_2] <--- 5 เงื่อนไขเป็นเท็จ เงื่อนไขเป็นจริง Exit
เขียนโปรแกรมตรวจสอบข้อมูลในหน่วยความจำและใส่ค่าดังนี้เขียนโปรแกรมตรวจสอบข้อมูลในหน่วยความจำและใส่ค่าดังนี้ JOB 1 Data_1 < 10 ใส่ข้อมูล 05 ----> data_2 Data_1 > 10 ใส่ข้อมูล 15 ----> data_2 Data_1 = 10 ใส่ข้อมูล 10 ----> data_2 start Bh <---- [data_1] 1 yes no Bh > 10 Bh = 10 [data_2] <--- 15 no yes [data_2] <--- 5 [data_2] <--- 10 1 Exit
ลองป้อนโปรแกรมลงเครื่องลองป้อนโปรแกรมลงเครื่อง เพื่อดูว่าผลได้ผล ตามที่เราต้องการหรือไม่