ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
ได้พิมพ์โดยเจือ สโตเกอร์ ได้เปลี่ยน 6 ปีที่แล้ว
1
Introduction to Computer organization & Assembly Language
2
คอมพิวเตอร์ Hardware Software DEFINING A PERSONAL COMPUTER Hardware
Computer hardware is all of the electrical and mechanical equipment involved in the production, storage, distribution or reception of electronic signals. It is more than just moving parts or heavy equipment; it is essentially all of the components or devices that you can physically hold or touch. Software Software is what actually makes the computer work and is another word for a computer program or set of programs. Basically, programs are structured lists of instructions that cause the computer to behave in a specified manner. These instructions range from directing the computer to perform very simple activities, like adding two single digits, to the performance of extremely complex functions, such as calculating the distances between stars. Software
3
ความสัมพันธ์ของ Hardware และ Software
USER ซอฟต์แวร์ประยุกต์ ซอฟต์แวร์ประยุกต์ System Library System Library ซอฟต์แวร์ระบบ เครื่องคอมพิวเตอร์
4
Computer Components HD CPU Output Devices Input Devices
Secondary Memory CPU Main Memory Input Devices HD
5
การทำงานของเครื่องคอมพิวเตอร์
ชุดคำสั่งและข้อมูลจะถูกเก็บอยู่ในหน่วยความจำ CPU (microprocessor)ดึงข้อมูลและชุดคำสั่งมาจาก หน่วยความจำ อุปกรณ์อินพุต (Keyboard , Mouse , etc.) CPU ประมวลผลข้อมูล CPU นำข้อมูลผลลัพธ์ที่ถูกประมวลผลแล้วไปยัง อุปกรณ์เอาท์พุต (Monitor , Printer , etc.)
6
โปรแกรมคอมพิวเตอร์ เราไม่สามารถทำงานต่างๆได้ โดยอาศัยเพียงแต่เครื่องคอมพิวเตอร์อย่างเดียว เครื่องคอมพิวเตอร์สามารถทำงานได้รวดเร็ว แต่ไม่สามารถที่จะตัดสินใจหรือแก้ปัญหาใดๆได้ด้วยลำพัง มนุษย์จะต้องเป็นผู้กำหนดและสั่งการคอมพิวเตอร์ให้ทำงานให้ได้อย่างที่มนุษย์ต้องการ โปรแกรมคอมพิวเตอร์ หมายถึง ชุดลำดับของคำสั่งที่กำหนดให้คอมพิวเตอร์ทำการประมวลผลข้อมูลเพื่อให้แก้ปัญหา และทำงานได้อย่างที่ต้องการ Programming = Designing and writing a computer program.
7
ชนิดของภาษาในการเขียนโปรแกรม
There are 3 kind of programming languages Machine language (0’s and 1’s) Assembly language (mov, and, or, etc…) High-level language (nearly like human word) Computer itself understands only Machine language.
8
The translation Process
Compiler /Interpreter Executable Program Source Program
9
Language translator Hello World! _ …… Machine language
Interpreter / Compiler …… main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax subl %eax, %esp pushl $.LC0 …….. …. …… Assembler Program hello; Begin writeln(“Hello world!”); End. Machine Machine language High-level language Assembly language Hello World! _
10
Compiler library Compiler Linker object file Source a b c Exe file
Read all program at a time. Translate into executable file (machine language) library Compiler Linker …. writeln(‘a’); writeln(‘b’); writeln(‘c’); object file Source a b c …. ..... Exe file
11
Interpreter a Inter- b preter c Source
Read high-level language , translate , and then execute one command at a time. Inter- preter a b c …. writeln(‘a’); writeln(‘b’); writeln(‘c’); Source
12
Assembler Turns assembly symbols into machine instructions
Process this step in microprocessor a b c Assembler …. ..... … mov A, B add B , A sub A, B push A
13
ข้อดีและข้อเสียของภาษาแอสเซมบลี
สามารถเขียนโปรแกรมให้มีขนาดเล็กที่สุด โปรแกรมที่ได้สามารถทำงานด้วยความเร็วสูง สามารถเขียนโปรแกรมจัดการกับฮาร์ดแวร์ได้โดยตรง ข้อเสีย เขียนโปรแกรมได้ยาก แก้ไขโปรแกรมลำบาก ไม่มีโครงสร้างข้อมูลระดับสูง เช่น Array ไม่สามารถนำโปรแกรมที่สร้างขึ้นไปใช้กับเครื่องต่าง CPU ได้
14
ขั้นตอนในการเขียนโปรแกรม
วิเคราะห์ปัญหา (Analysis) ระบุปัญหาที่ต้องการจะแก้ไข แบ่งปัญหานั้นออกเป็นปัญหาย่อยๆ ค้นหาแนวคิดและวิธีการที่จะแก้ปัญหานั้นๆ พัฒนาโปรแกรม (Implementation) เขียนโปรแกรมด้วยภาษาคอมพิวเตอร์ โดยอาศัยแนวคิดการแก้ปัญหาที่คิดไว้ก่อนหน้า Compile โปรแกรมที่เขียนขึ้นให้เป็นภาษาที่เครื่องอ่านได้ ตรวจสอบและแก้ไขจุดผิดพลาด (Testing & Debugging) ทดลองรันโปรแกรมและตรวจสอบการทำงาน หากโปรแกรมทำงานไม่ถูกต้อง หาจุดผิดให้พบ แก้ไขจุดผิดพลาดและทดลองใหม่ จนกว่าโปรแกรมจะทำงานได้ถูกต้อง
15
พัฒนาการของ Microprocessor
Intel Zilog Motorolla 4004 Z 8086,8088 Z Z i386 Z i Pentium
16
สถาปัตยกรรมคอมพิวเตอร์เบื้องต้น
17
โครงสร้างของระบบคอมพิวเตอร์
Output Devices Secondary Memory Memory CPU Input Devices HD
18
โครงสร้างของระบบคอมพิวเตอร์
Memory Unit Central Processing Unit Output Unit Input Unit Register ALU Control Unit
19
การทำงานของ CPU ขั้นตอนการทำงานของ CPU
Fetch Decode Excute ขั้นตอนการทำงานของ CPU อ่านคำสั่ง (Fetch) ตีความ (Decode) ประมวลผล (Excute) CPU จะทำงานตามชุดคำสั่งที่อ่านขึ้นมาจากหน่วยความจำหลักเท่านั้น เรียก Stored Program Architecture หรือ Von Neumann Architecture คำสั่งของ CPU ประกอบด้วย Opcode และ Operand Opcode : ระบุประเภทของการประมวลผล Operand : ระบุข้อมูลที่นำมาประมวลผล
20
หน่วยความจำ บิต : หน่วยที่เล็กที่สุดในการเก็บข้อมูล
ไบต์ : 8 บิต เป็นหน่วยที่ใช้ในการอ้างถึงข้อมูลในหน่วยความจำ ทุกหน่วยความจำย่อยจะมีหมายเลขเฉพาะตัว แอดเดรส [Address] เวิร์ด : 2 ไบต์ หรือ 16 บิต ดับเบิ้ลเวิร์ด : 4 ไบต์ หรือ 32 บิต นิมเบิ้ล : 4 บิต หรือ 1/2 ไบต์ การอ้างถึงข้อมูลในหน่วยความจำ หน่วยประมวลผลจะต้องสามารถระบุ แอดเดรสของข้อมูลที่ต้องการใช้งานได้
21
การเชื่อมต่อภายในระบบคอมพิวเตอร์
22
บัสและการเชื่อมต่อ เราสามารถแบ่งกลุ่มของบัสออกเป็น 3 กลุ่ม - บัสข้อมูล
อุปกรณ์ต่างๆจะเชื่อมต่อกันโดยผ่านทางกลุ่มของสายสัญญาณที่เรียกว่า บัส CPU Memory I/O Data bus Address bus Control bus เราสามารถแบ่งกลุ่มของบัสออกเป็น 3 กลุ่ม - บัสข้อมูล - บัสตำแหน่ง หรือ แอดเดรสบัส - บัสควบคุม
23
สถาปัตยกรรมของระบบ ไมโครโปรเซสเซอร์ตระกูล 80x86
บิต บิต บิต อ้างหน่วยความจำได้ 1 MB 8088 ภายใน 16 บิต แต่ติดต่อภายนอก 8 บิต เพื่อแข่งกับ Z80 80186 ไมโครโปรเซสเซอร์สำหรับระบบความคุมอุปกรณ์รอบข้าง บิต อ้างหน่วยความจำได้ 16 MB เริ่มมีความสามารถในการจัดการ หน่วยความจำ มี Virtual Memory บิต อ้างหน่วยความจำได้ 4 GB มีความสามารถในการจัดการ หน่วยความจำ ชุดคำสั่งและโครงสร้างทางซอฟต์แวร์ยังคงเป็น มาตรฐานอยู่ในปัจจุบัน 80386SX ภายในเป็น 32 บิต แต่บัสเป็น 16 บิต 80486 เพิ่มหน่วยประมวลผลทางคณิตศาสตร์ Pentium พัฒนาการประมวลผลให้เร็วยิงขึ้น
24
สถาปัตยกรรมของ 8086 8086 มีแอดเดรสบัสขนาด 20 บิต
อ้างแอดเดรสได้ 220 แบบแตกต่างกัน ( อ้างแอดเดรสได้ 1 MB ) แอดเดรสขนาด 20 บิตนี้ คือแอดเดรสที่แท้จริง (physical address) ที่หน่วยประมวลผล อ้างจากหน่วยความจำ จึงอ้างหน่วยความจำได้ 220 หน่วย 8086 มีรีจิสขนาด 16 บิต ไม่พอเพียงในการอ้างแอดเดรส (แอดเดรสมีขนาด 20 บิต) ต้องใช้รีจิสเตอร์ 2 ตัวในการอ้างแอดเดรส อ้างแอดเดรสแบบ เซกเมนต์ : ออฟเซ็ต แบ่งหน่วยความจำทั้งหมดออกเป็นส่วนย่อย ๆ ที่เริ่มต้นแตกต่างกัน [segment] แล้วระบุระยะจากจุดเริ่มต้นนั้น [offset]
25
การอ้างหน่วยความจำ แอดเดรสขนาด 20 บิต เช่น 20105h
2010:0005 1 5 2 แอดเดรสขนาด 20 บิต เช่น 20105h รีจิสเตอร์ 1 ตัวขนาด 16 บิต : segment รีจิสเตอร์ 1 ตัวขนาด 16 บิต : offset 2 1 5 2 1 5 2000:0105 2 1 F 5 2001:00F5 1 F 5 1FFF:0115
26
การอ้างแอดเดรสแบบ เซกเมนต์ : ออฟเซ็ต
การอ้างแอดเดรสแบบ เซกเมนต์ : ออฟเซ็ต การแปลงจากการอ้างแบบ เซกเมนต์ : ออฟเซ็ต เป็น physical address เลื่อนบิตของเซกเมนต์ ไปทางซ้าย 4 บิต (-> มีขนาด 20 บิต) นำค่าของออฟเซ็ตมาบวก เซกเมนต์หนึ่งมีขอบเขตตั้งแต่ offset ที่ 0000h จนถึง FFFFh [16 บิต] เซกเมนต์มีขนาด = 64 KB [65536 bytes] จุดเริ่มต้นของเซกเมนต์ต่าง ๆ เซกเมนต์ที่ 0000h เริ่มต้นที่ physical address 00000h สิ้นสุดที่ 0FFFFh เซกเมนต์ที่ 0001h เริ่มต้นที่ physical address 00010h สิ้นสุดที่ 1FF0Fh เซกเมนต์ที่ 0002h เริ่มต้นที่ physical address 00020h สิ้นสุดที่ 1FF1Fh segment 0000h 0001h 0002h 0003h
27
เซกเมนต์รีจิสเตอร์ CS : Code segment ชี้ไปยังหน่วยความจำที่เก็บโปรแกรม
Data segment Stack segment Extra segment CS : Code segment ชี้ไปยังหน่วยความจำที่เก็บโปรแกรม DS : Data segment ชี้ไปยังหน่วยความจำที่เก็บข้อมูล ES : Extra segment ชี้ไปยังหน่วยความจำที่เก็บข้อมูลอื่น ๆ SS : Stack segment ชี้ไปยังหน่วยความจำที่เป็น stack
28
คู่รีจิสเตอร์ 16 บิต และ 8 บิต
AX (Accumulator Register) BX (Base Register) AX AH AL BX BH BL CX (Counter Register) DX (Data Register) CX CH CL DX DH DL
29
ส่วนประกอบภายในไมโครโปรเซสเซอร์ 8086
ALU : มีขนาด 16 บิต ทำให้เรียก 8086 ว่าเป็น CPU 16 บิต รีจิสเตอร์ รีจิสเตอร์ทั่วไป (General-Purpose Registers) 16 บิต : AX BX CX และ DX 8 บิต : AH AL BH BL CH CL DH และ DL เซกเมนต์รีจิสเตอร์ (Segment Registers) มีขนาด 16 บิต : CS DS ES และ SS รีจิสเตอร์สำหรับอ้างอิง (Index Registers) มีขนาด 16 บิต : SI และ DI
30
ส่วนประกอบภายในไมโครโปรเซสเซอร์ 8086
รีจิสเตอร์ รีจิสเตอร์สำรับการชี้ (Pointer Registers) มีขนาด 16 บิต : BP และ SP แฟล็ก (Flags) สถานะของผลลัพธ์จากการคำนวณ รีจิสเตอร์อื่น ๆ ที่ผู้ใช้ไม่สามารถใช้ได้โดยตรง IP (Instruction Pointer) : เก็บตำแหน่งของคำสั่งถัดไป IR (Instrcution Register) : เก็บคำสั่งปัจจุบัน etc.
31
รีจิสเตอร์
32
การอ่านคำสั่ง หน่วยความจำ
33
แฟล็กรีจิสเตอร์
34
แฟล็กรีจิสเตอร์ แฟล็กทด (Carry flag) จะมีค่า 1 หากมีการทดบิตหรือขอยืมค่า แฟล็กพาริตี้ (Parity flag) จะมีค่า 1 ถ้าผลลัพธ์ที่ได้จากคำสั่งคำนวณมีจำนวนบิตที่เท่ากับ 1 เป็นเลขคู่ แฟล็กช่วย (Auxiliary flag) จะมีค่า 1 หาก 4 บิตขวามือของผลลัพธ์มีการทดหรือขอยืมค่า แฟล็กศูนย์ (Zero flag) จะมีค่า 1 หากผลลัพธ์การคำนวณมีค่าเท่ากับศูนย์ แฟล็กเครื่องหมาย (Sign flag) จะมีค่า 1 หากผลลัพธ์การคำนวณเป็นเลขลบ แฟล็กกับดัก (Trap flag) หากมีค่าเป็น 1 จะบังคับให้ไมโครโปรเซสเซอร์ปฏิบัติงานใน ภาวะ คำสั่งขั้นเดียว (single step) ซึ่งใช้ในการดีบักโปรแกรม แฟล็กอินเตอร์รัพต์ (Interrupt Enable flag) หากมีค่าเป็น 1 จะทำให้ซีพียูรับการอินเตอร์รัพต์แบบมาส์ก แฟล็กทิศทาง (Direction flag) หากมีค่าเป็น 1 จะบังคับให้คำสั่งถ่ายโอนข้อมูลเป็นกลุ่มทำงานจากแอดเดรสค่าน้อยไปหาค่ามาก หากมีค่าเป็น 0 จะบังคับมีการถ่ายโอนจากแอดเดรสค่ามากไปหาค่าน้อย แฟล็กค่าล้นหลัก (Overflow flag) ใช้สำหรับเลขแบบคิดเครื่องหมาย หากมีค่าเป็น 1 หมายถึงผลลัพธ์ของการคำนวณเป็นเลขที่มีค่ามากหรือน้อยกว่าขอบเขตที่กำหนด
35
โหมดการอ้างแอดเดรส โหมดการอ้างแอดเดรส (Addressing Mode) คือรูปแบบที่ CPU อ้างถึงข้อมูล แบ่งเป็น 3 กลุ่ม อ้างถึงข้อมูลใน รีจิสเตอร์ อ้างถึงข้อมูลในหน่วยความจำ อ้างถึงข้อมูลจากที่ระบุในคำสั่ง
36
การขัดจังหวะ การสั่งให้หน่วยประมวลผลหยุดทำงานปัจจุบันชั่วคราว แล้วกระโดดไปตอบสนองการขัดจังหวะนั้น เมื่อตอบสนองเสร็จแล้ว CPU จะกลับมาประมวลผลงานเดิมที่ค้างไว้ ตัวอย่าง เช่น ขณะที่อุปกรณ์บางชิ้นได้รับข้อมูล ได้มีการกดปุ่มบนแป้นพิมพ์ เป็นต้น การขัดจังหวะสามารถสร้างได้จาก ฮาร์ดแวร์ : ฮาร์ดแวร์อินเตอร์รัพท์ ใช้ในการแจ้งการเปลี่ยนสถานะของอุปกรณ์รอบข้างต่างๆ และต้องการการจัดการจาก CPU ซอฟต์แวร์ : ซอฟต์แวร์อินเตอร์รัพท์ ใช้ในการเรียกใช้บริการของระบบ (system library)
37
สถาปัตยกรรมของระบบคอมพิวเตอร์สมัยใหม่
เทคโนโลยีของหน่วยประมวลผลกลาง หน่วยประมวลผลแบบ RISC การประมวลผลแบบ ไปป์ไลน์ การประมวลผลแบบซูเปอร์สเกลาร์ ระบบบัสสมัยใหม่ หน่วยความจำแคช Memory CPU cache
38
การโอนย้ายข้อมูล
39
คำสั่งการโอนย้ายข้อมูล
คำสั่ง MOV การโอนย้ายข้อมูลระหว่างรีจิสเตอร์กับรีจิสเตอร์ การโอนย้ายข้อมูลกับหน่วยความจำ การกำหนดค่าคงที่ให้กับหน่วยความจำ รูปแบบ MOV ปลายทาง , ต้นทาง MOV reg,reg MOV reg,mem MOV mem,reg MOV reg,imm MOV mem,imm reg : รีจิสเตอร์ mem : ตำแหน่งหน่วยความจำ imm : immediate (ค่าคงที่)
40
ข้อจำกัดของคำสั่ง MOV
โอเปอร์แรนด์ทั้งสองตัวต้องมีขนาดเท่ากัน สิ่งไม่สามารถคัดลอก ข้อมูลจากหน่วยความจำไปยังหน่วยความจำโดยตรง ค่าคงที่ (immediate) ไปยังเซกเมนต์รีจิสเตอร์โดยตรง ในการคัดลอกค่าคงที่ไปยังหน่วยความจำต้องระบุขนาดของหน่วยความจำด้วย
41
ตัวอย่างการใช้คำสั่ง MOV
MOV AX,100h MOV BX,AX MOV DX,BX MOV AX,1234h MOV DX,5678h MOV AL,DL MOV BH,DH MOV AX,1000h MOV [100h],AX MOV BX,[100h] กำหนดค่า 100h ให้กับ AX จากนั้นคัดลอกไปให้ BX และ DX กำหนดค่า 1234h ให้กับ AX และค่า 5678h ให้กับ DX จากนั้นคัดลอกค่าใน DLไปให้ AL และ DH ไปให้ BH กำหนดค่า 1000h ให้กับ AX จากนั้นคัดลอกข้อมูลจาก AX ไปยังหน่วยความจำตำแหน่งที่ DS:100h และคัดลอกข้อมูลกลับมายัง BX
42
ตัวอย่างการใช้คำสั่ง MOV
กำหนดค่า 10h แบบไบต์ให้กับหน่วยความจำที่ DS:200h และแบบเวิร์ดที่ DS:300h MOV BYTE PTR [200h],10h MOV WORD PTR [300h],10h MOV AX,2300h MOV DS,AX กำหนดค่า 2300h ให้กับ DS โดยผ่านทาง AX
43
การโอนย้ายข้อมูลระหว่างรีจิสเตอร์
การโอนย้ายข้อมูลระหว่างรีจิสเตอร์สามารถทำได้ถ้าขนาดของรีจิสเตอร์ทั้งคู่เท่ากัน คู่รีจิสเตอร์ 16 บิต กับ 8 บิต MOV AX,1000h MOV AL,3Ah MOV AH,AL MOV AX,234h AX AH AL 1000h 10h 00h AX AH AL 103Ah 10h 3Ah AX AH AL 3A3Ah 3Ah AX AH AL 234h 02h 34h
44
การโอนย้ายข้อมูลกับหน่วยความจำ
การระบุตำแหน่งในหน่วยความจำ โดยทั่วไป ในการระบุตำแหน่งในหน่วยความจำเราจะระบุเฉพาะออฟเซ็ตเท่านั้น โดยออฟเซ็ตที่ระบุจะถูกนำไปประกอบกับค่าในเซ็กเมนต์ รีจิสเตอร์ที่เหมาะสม เช่นในการอ้างถึงข้อมูลออฟเซ็ตจะถูกนำไปประกอบกับ DS เป็นต้น ตัวอย่าง MOV AX,6789h MOV DX,1234h MOV [100h],AX MOV [102h],DX MOV [104h],AH MOV [105h],DL MOV BX,[104h] MOV CX,[103h] MOV [106h],CL DS:100h DS:101h DS:102h
45
MOV [100h],AX 89h MOV [102h],DX 67h 34h MOV AX,6789h MOV DX,1234h
DS:100h DS:101h DS:102h 89h 67h MOV [102h],DX 12 34 34h 12h MOV AX,6789h MOV DX,1234h MOV [100h],AX MOV [102h],DX MOV [104h],AH MOV [105h],DL MOV BX,[104h] MOV CX,[103h] MOV [106h],CL MOV [104h],AH 67 MOV CX,[103h] 67 12 67h MOV BX,[104h] 34 67 34h MOV [105h],DL 34
46
การโอนย้ายข้อมูลกับหน่วยความจำ
ข้อสังเกตในการจัดเรียงลำดับไบต์ของข้อมูล สังเกตว่าในการเก็บค่าในหน่วยความจำเมื่อเราเก็บค่าเป็น 16 บิต การเรียงไบต์ในหน่วยความจำจะเก็บค่าในไบต์ที่มีนัยสำคัญสูงไว้ในไบต์ที่มีแอดเดรสสูงกว่า และไบต์ที่มีนัยสำคัญต่ำไว้ในแอดเดรสที่มีแอดเดรสต่ำกว่า เราเรียกว่าเป็นการเรียงแบบ little endian การเรียงข้อมูลแบบนี้ใช้ในหน่วยประมวลผลตระกูล Intel ในหน่วยประมวลผลตระกูลอื่นเช่น SPARC หรือ MIPS จะเรียงไบต์กลับกันการเรียงอีกแบบนี้เราเรียกว่าการเรียงแบบ big endian
47
การโอนย้ายข้อมูลกับหน่วยความจำ
เราสามารถระบุออฟเซ็ตของหน่วยความจำทางอ้อมได้โดยผ่านทางรีจิสเตอร์ BX AX = ? MOV AX,102h MOV BX,100h MOV CX,4004h MOV DX,1201h MOV [BX],AX MOV [BX+2],CX MOV [BX+3],DX MOV [BX+4],BX MOV BX,[102h] MOV AX,[BX] DS:100h DS:101h DS:102h 02h 01h 01 04 BX 04h 40h 01 00 AX 01h 12h 00h 10h
48
การกำหนดค่าให้กับหน่วยความจำ
ลองสังเกตคำสั่งต่อไปนี้ การคัดลอกค่าไปยังหน่วยความจำจะเป็นแบบ 16 บิต (คัดลอก 0010h) หรือ 8 บิต (คัดลอก 10h) ในการเขียนค่าคงที่ลงในหน่วยความจำเราจะต้องระบุขนาดของหน่วยความจำด้วย สังเกตว่าความกำกวมนี้ไม่เกิดในกรณีของ MOV [100h],10h MOV WORD PTR [100h],10h MOV BYTE PTR [100h],10h MOV [100h],AX
49
DEBUG
50
คำสั่งทั่วไปของโปรแกรม DEBUG
คำสั่ง ? : แสดงรายการคำสั่ง คำสั่ง R (register) : จัดการกับรีจิสเตอร์ คำสั่ง D (dump) : แสดงค่าในหน่วยความจำ คำสั่ง A (assemble) : สั่งให้โปรแกรม DEBUG แปล โปรแกรมลงในแอดเดรสที่ระบุ คำสั่ง U (unassemble) : สั่งให้โปรแกรม DEBUG แสดง โปรแกรมที่อยู่ในแอดเดรสที่ระบุ
51
คำสั่งทั่วไปของโปรแกรม DEBUG
คำสั่ง T (trace) : คำสั่งตามรอยการทำงานครั้งละ 1 คำสั่ง คำสั่ง P (proceed) : คำสั่งให้ทำงานจนถึงบรรทัดถัดไป ใช้ในกรณีมีการเรียกโปรแกรมย่อยหรือมีการเรียกใช้บริการของระบบ คำสั่ง G (go) : คำสั่งเริ่มการทำงานและทำงานจนจบ
52
สิ่งควรรู้ก่อนการใช้โปรแกรม DEBUG
โปรแกรม DEBUG เป็นโปรแกรมหนึ่งที่อยู่ในชุดคำสั่งของ windows ตัวเลขต่าง ๆ ในโปรแกรม DEBUG จะเป็นเลขฐาน 16 ทั้งหมด ไม่ต้องพิมพ์ h ระบุหลังตัวเลข โปรแกรมจะเริ่มทำงานที่หน่วยความจำตำแหน่ง CS:IP เสมอ การกำหนดค่าให้กับรีจิสเตอร์ทั้งสองใช้คำสั่ง RCS และ RIP การระบุคำสั่ง (a) , การแสดงคำสั่ง (u) และการแสดงหน่วยความจำ (d) จะเริ่มต้นที่ตำแหน่งต่อจากการทำงานครั้งสุดท้ายของคำสั่งนั้นๆ ไม่ขึ้นกับค่า IP หากต้องการเปลี่ยนแปลงตำแหน่งให้ใส่ offset ตามหลังทันที เช่น a 100 เป็นต้น การใช้งานหน่วยความจำทุกครั้งจะต้องอ้างในรูปแบบ segment:offset เสมอ แต่การอ้างถึงข้อมูลส่วนใหญ่ในโปรแกรมจะใช้เพียงรีจิสเตอร์เดียว
53
แฟล็กและคำสั่งคณิตศาสตร์
54
หัวข้อการเรียน แฟล็ก คำสั่งคณิตศาสตร์
คำสั่งเกี่ยวกับการบวกและลบ คำสั่งเกี่ยวกับการคูณและหาร ผลของคำสั่งคณิตศาสตร์ต่อการเปลี่ยนแปลงของแฟล็ก การคำนวณสมการคณิตศาสตร์อย่างง่าย
55
แฟล็กรีจิสเตอร์ แฟล็ก คือรีจิสเตอร์ที่ใช้เก็บสถานะของระบบ
แฟล็กของ 8086 มีขนาด 16 บิต โดยแต่ละบิตจะแทนสถานะต่างๆ ของระบบ แฟล็กจะเปลี่ยนแปลงตามผลลัพธ์ของคำสั่งทางคณิตศาสตร์ การคัดลอกข้อมูลจะไม่ทำให้แฟล็กเปลี่ยนแปลงค่า
56
แฟล็กรีจิสเตอร์ แฟล็กทด (Carry flag) จะมีค่า 1 หากมีการทดบิตหรือขอยืมค่า แฟล็กพาริตี้ (Parity flag) จะมีค่า 1 ถ้าผลลัพธ์ที่ได้จากคำสั่งคำนวณมีจำนวนบิตที่เท่ากับ 1 เป็นเลขคู่ แฟล็กช่วย (Auxiliary flag) จะมีค่า 1 หาก 4 บิตขวามือของผลลัพธ์มีการทดหรือขอยืมค่า แฟล็กศูนย์ (Zero flag) จะมีค่า 1 หากผลลัพธ์การคำนวณมีค่าเท่ากับศูนย์ แฟล็กเครื่องหมาย (Sign flag) จะมีค่า 1 หากผลลัพธ์การคำนวณเป็นเลขลบ แฟล็กกับดัก (Trap flag) หากมีค่าเป็น 1 จะบังคับให้ไมโครโปรเซสเซอร์ปฏิบัติงานใน ภาวะ คำสั่งขั้นเดียว (single step) ซึ่งใช้ในการดีบักโปรแกรม แฟล็กอินเตอร์รัพต์ (Interrupt Enable flag) หากมีค่าเป็น 1 จะทำให้ซีพียูรับการอินเตอร์รัพต์แบบมาส์ก แฟล็กทิศทาง (Direction flag) หากมีค่าเป็น 1 จะบังคับให้คำสั่งถ่ายโอนข้อมูลเป็นกลุ่มทำงานจากแอดเดรสค่าน้อยไปหาค่ามาก หากมีค่าเป็น 0 จะบังคับมีการถ่ายโอนจากแอดเดรสค่ามากไปหาค่าน้อย แฟล็กค่าล้นหลัก (Overflow flag) ใช้สำหรับเลขแบบคิดเครื่องหมาย หากมีค่าเป็น 1 หมายถึงผลลัพธ์ของการคำนวณเป็นเลขที่มีค่ามากหรือน้อยกว่าขอบเขตที่กำหนด
57
แฟล็กศูนย์ (Zero-flag)
จะมีค่าเป็น 1 เมื่อผลลัพธ์มีค่าเท่ากับศูนย์ นอกจากกรณีนี้จะมีค่าเป็น 0 MOV AL,10h ADD AL,E0h ADD AL,20h SUB AL,10h Z=? Z=1 Z=0 AL=0 AL=20h AL=10h
58
พาริตี้แฟล็ก (Parity-flag)
จะมีค่าเป็น 1 เมื่อผลลัพธ์มีจำนวนบิตที่มีค่าเป็นหนึ่งเป็นเลขคู่ MOV AL,14h ADD AL,20h ADD AL,10h SUB AL,8h SUB AL,10h P=? P=0 P=1 AL=34h AL=44h AL=3Ch AL=2Ch
59
แฟล็กทด (Carry-flag) จะมีค่าเป็น 1 เมื่อมีการทดหรือการยืมในการคำนวณ
พิจารณาตัวเลขแบบไม่คิดเครื่องหมาย MOV AL,77h ADD AL,50h SUB AL,A0h ADD AL,27h C=? C=0 C=1 AL=C7h AL=17h AL=77h AL=9Eh
60
แฟล็กเครื่องหมาย (Sign-flag)
จะมีค่าเป็น 1 เมื่อผลลัพธ์มีค่าลบ พิจารณาตัวเลขแบบคิดเครื่องหมาย MOV AL,77h ADD AL,50h SUB AL,A0h ADD AL,27h S=? S=1 S=0 AL=C7h AL=17h AL=77h AL=9Eh
61
โอเวอร์โฟล์แฟล็ก (Overflow-flag)
จะมีค่าเป็น 1 เมื่อผลลัพธ์มีความผิดพลาดเนื่องจากเลขล้นหลัก พิจารณาตัวเลขแบบคิดเครื่องหมาย การล้นหลักจะเกิดขึ้นเฉพาะจำนวนบวกรวมกันหรือจำนวนลบรวมกันเท่านั้น จะไม่เกิดการล้นหลักสำหรับจำนวนบวกรวมกับจำนวนลบ MOV AL,77h ADD AL,50h SUB AL,A0h ADD AL,27h O=? O=1 O=0 AL=C7h AL=17h AL=77h AL=9Eh
62
แฟล็กอื่น ๆ แฟล็กเสริม (Auxiliary-flag) แฟล็กทิศทาง (Direction-flag)
จะมีค่าเป็น 1 เมื่อผลลัพธ์ต้องมีการปรับค่าของการเก็บตัวเลขแบบ BCD แฟล็กทิศทาง (Direction-flag) ใช้สำหรับกำหนดทิศทางของการปรับค่าในคำสั่งเกี่ยวกับสายข้อมูล. แทรปแฟล็ก (Trap-flag) ใช้สำหรับการตรวจสอบการทำงานของโปรแกรม โดยจะทำให้เกิดการขัดจังหวะทุกครั้งหลังการทำงานของคำสั่งต่างๆ อินเตอร์รัพท์แฟล็ก (Interrupt-flag) ใช้สำหรับกำหนดว่าหน่วยประมวลผลจะตอบสนองการขัดจังหวะจากฮาร์ดแวร์บางประเภทหรือไม่
63
คำสั่งสำหรับกำหนดค่าของแฟล็ก
แฟล็กบางแฟล็กสามารถกำหนดค่าได้ เนื่องจากมีหน้าที่ในการระบุสถานะบางประการ เราจะเรียกแฟล็กที่มีค่าเป็น 1 ว่าแฟล็กนั้นเซ็ต (flag set) และเรียกแฟล็กที่มีค่าเป็น 0 ว่า แฟล็กนั้นเคลียร์ (flag cleared) แฟล็กที่สามารถกำหนดค่าได้ และคำสั่งในการกำหนดค่า Carry-flag Direction-flag Interrupt-flag CLC CLD CLI STC STD STI Clear Set Flag
64
คำสั่งคณิตศาสตร์ คำสั่งเพิ่มและลดค่า : INC และ DEC
คำสั่งบวก : ADD และ ADC คำสั่งลบ : SUB และ SBB คำสั่งเปรียบเทียบ : CMP คำสั่งกลับเครื่องหมาย : NEG คำสั่งคูณ : MUL และ IMUL คำสั่งหาร : DIV และ IDIV คำสั่งปรับขนาดข้อมูล : CBW และ CWD
65
คำสั่งเพิ่มค่า INC และคำสั่งลดค่า DEC
INC register INC memory DEC register DEC memory การเพิ่มและลดค่าในหน่วยความจำจะต้องระบุขนาดของข้อมูลด้วย มีผลกระทบกับแฟล็กทางคณิตศาสตร์ทั้งหมด ยกเว้น แฟล็กทด ไม่เปลี่ยน C-flag MOV AL,1 DEC AL MOV BX,200h MOV [BX],AL INC BYTE PTR [BX] AL=0h AL=FFh [200h]=FFh [200h]=00h
66
คำสั่งการบวก ADD และ ADC (add with carry)
ADD regs,regs ADD regs,mem ADD mem,regs ADD regs,imm ADD mem,imm ADC regs,regs ADC regs,mem ADC mem,regs ADC regs,imm ADC mem,imm ผลลัพธ์ของการบวกจะเก็บไว้ในโอเปอร์แลนด์ตัวหน้าเสมอ คำสั่ง ADD และ ADC มีผลกระทบถึงแฟล็กทางคณิตศาสตร์ทุกตัว เรานิยมใช้คำสั่ง ADC ในการบวกเลขที่ต้องการรวมตัวทดจากการคำนวณที่ผ่านมา ยกตัวอย่างเช่น การบวกเลขที่อยู่ในรีจิสเตอร์หลายตัวต่อเนื่องกัน
67
คำสั่งการลบ SUB และ SBB (sub with borrow)
SUB regs,regs SUB regs,mem SUB mem,regs SUB regs,imm SUB mem,imm SBB regs,regs SBB regs,mem SBB mem,regs SBB regs,imm SBB mem,imm คำสั่ง SUB จะลบค่าในโอเปอร์แรนด์ตัวหลังออกจากตัวหน้า และนำไปเก็บในโอเปอร์แรนด์ตัวหน้า คำสั่ง SBB ก็จะทำเช่นเดียวกัน แต่จะมีการรวมตัวยืมซึ่งเก็บอยู่ใน Carry-flag ด้วย (คล้าย ADC) คำสั่ง SUB และ SBB มีผลกระทบถึงแฟล็กทางคณิตศาสตร์ทุกตัว
68
ตัวอย่างการใช้คำสั่งบวกและลบ
การบวกเลข 32 บิต 34DA 1115h เข้ากับตัวเลข 32 บิตที่เก็บในคู่รีจิสเตอร์ CX,BX นำ 34DA 115h เก็บใน DX,AX บวก 16 บิตล่าง บวก 16 บิตบนพร้อมตัวทด MOV AX,1115h MOV DX,34DAh ADD AX,BX ADC DX,CX การลบเลข 16 บิต ในรีจิสเตอร์ AX ด้วยเลข 8 บิตในรีจิสเตอร์ BL SUB AL,BL SBB AH,0 ลบ 8 บิตล่าง ลบ 8 บิตบนพร้อมตัวยืม
69
คำสั่งเปรียบเทียบ CMP
คำสั่ง CMP จะทำงานเหมือนคำสั่ง SUB แต่จะไม่มีการเปลี่ยนแปลงค่าในโอเปอร์แรนด์ทั้งสอง แต่จะมีการเปลี่ยนแปลงค่าใน Flag การเปลี่ยนแปลง flag ของคำสั่ง CMP จะเหมือนกับคำสั่ง SUB โดยปกติเราจะใช้คำสั่ง CMP ในการเปรียบเทียบ และตัดสินใจ MOV AX,10h CMP AX,100h MOV BL,10h CMP AL,BL Z-flag = 0, C-flag = 1, O-flag = 0, S-flag = 1. Z-flag = 1, C-flag = 0, O-flag = 0, S-flag = 0.
70
คำสั่งกลับเครื่องหมาย NEG
NEG regs NEG mem คำสั่ง NEG จะกลับค่าของโอเปอร์แรนด์ให้เป็นค่าลบ การแปลงเป็นค่าลบใช้วิธีแบบ 2’s complement คำสั่ง NEG จะมีผลกระทบกับแฟล็กทางคณิตศาสตร์ทั้งหมด แต่สำหรับ แฟล็กทดจะมีค่าเป็นหนึ่งเสมอหลังการทำงานของคำสั่งนี้
71
ตัวอย่างการเปลี่ยนค่าแฟล็ก
Instruction Result Z-Flag C-Flag P-Flag S-Flag O-Flag MOV AL,70h ADD AL,20h ADD AL,70h DEC AL ADD AL,5 ADD AL,30h SUB AL,40h SUB AL,7F NEG AL ADC AL,20h ? AL=70h 1 AL=90h 1 AL=00h 1 1* AL=FFh 1 AL=04h AL=34h 1 AL=F4h 1 AL=75h 1 1** AL=8Bh 1 AL=ABh
72
คำสั่งคูณ MUL และ IMUL IMUL regs IMUL mem MUL regs MUL mem ในการใช้คำสั่งคูณ เราจะระบุเฉพาะตัวคูณเท่านั้น สำหรับตัวตั้งและผลลัพธ์จะอยู่ในรีจิสเตอร์ที่กำหนดไว้แล้ว โดยจะขึ้นกับขนาดของการคูณ การคูณ 8 บิต ตัวตั้ง : AL ผลลัพธ์ : AX การคูณ 16 บิต ตัวตั้ง : AX ผลลัพธ์ : DX,AX คำสั่ง MUL จะคูณแบบไม่คิดเครื่องหมาย คำสั่ง IMUL จะคูณแบบคิดเครื่องหมาย คำสั่งทั้งสองจะมีผลกระทบกับ แฟล็กทดและโอเวอร์โฟล์แฟล็กเท่านั้น
73
ตัวอย่างการใช้คำสั่งคูณ
การคูณค่า 12h ด้วย ค่าใน BL ตั้งค่าให้กับตัวตั้ง คูณด้วย BL ผลลัพธ์อยู่ใน AX MOV AL,12h MUL BL การคูณค่าในหน่วยความจำขนาด 16 บิตที่offset 200h ด้วย ค่าใน AX จากนั้นนำผลลัพธ์ที่ได้มาบวกด้วยค่าใน BX MUL WORD PTR[200h] ADD AX,BX ADC DX,0 คูณ AX กับค่าใน [200h] จากนั้นนำ BX มารวมกับผลลัพธ์
74
คำสั่งคูณ DIV และ IDIV IDIV regs IDIV mem DIV regs DIV mem เช่นเดียวกับการใช้คำสั่งคูณ เราจะระบุเฉพาะตัวหารเท่านั้น ตัวตั้งและผลลัพธ์จะอยู่ในรีจิสเตอร์ที่กำหนดไว้แล้ว โดยจะขึ้นกับขนาดของการหาร การหาร 8 บิต ตัวตั้ง : AX ผลลัพธ์ : AL เศษ : AH การหาร 16 บิต ตัวตั้ง : DX, AX ผลลัพธ์ : AX เศษ : DX คำสั่ง DIV จะหารแบบไม่คิดเครื่องหมาย คำสั่ง IDIV จะหารแบบคิดเครื่องหมาย คำสั่งทั้งสองจะไม่มีผลกระทบกับแฟล็กทางคณิตศาสตร์.
75
คำสั่งปรับขนาดข้อมูล
ข้อมูลแบบไม่คิดเครื่องหมาย เราสามารถที่จะกำหนดค่า 0 ให้กับข้อมูลนัยสำคัญสูงที่ขยายเพิ่มขึ้นมาได้ เพื่อให้ขนาดใหญ่ขึ้นและมีค่าคงเดิม แต่ถ้าข้อมูลเป็นตัวเลขคิดเครื่องหมายเราจะต้องใช้การปรับค่าแบบอื่น มิเช่นนั้นค่าอาจผิดเพี้ยนไปได้ คำสั่ง CBW จะขยายขนาดข้อมูลแบบคิดเครื่องหมายใน AL ให้มีขนาด 16 บิตใน AX คำสั่ง CWD จะขยายขนาดข้อมูลแบบคิดเครื่องหมายใน AX ให้มีขนาด 32 บิตใน DX,AX ตัวอย่าง การหารค่าใน AL ด้วย BL CBW IDIV BL ขยาย AL -> AX. หารด้วย BL ผลลัพธ์อยู่ใน AL
76
ตัวอย่างการแก้สมการทางคณิตศาสตร์
1. คำนวณค่า AL2 + BL2 คิดตัวเลขแบบไม่คิดเครื่องหมายโดยให้ผลลัพธ์เป็นเลข 16 บิต เก็บที่ รีจิสเตอร์ AX หาค่า AL*AL นำไปเก็บไว้ที่ CX เนื่องจาก AL ต้องใช้ในการคำนวณ คูณ BL กับ BL แล้วเก็บผลลัพธ์ไว้ที่ AX ได้ผลลัพธ์แล้วนำค่า AL*AL ที่เก็บใน CX มาบวก MUL AL MOV CX, AX MOV AL, BL MUL BL ADD AX, CX 2. คำนวณค่า (CL*BL+DX)/SI โดยคิดเป็นเลขคิดเครื่องหมาย
77
ตัวอย่างการแก้สมการทางคณิตศาสตร์
2. คำนวณค่า (CL*BL+DX)/SI โดยคิดเป็นเลขคิดเครื่องหมาย หาค่า CL*BL บวกกับ DX. ขยายขนาดเป็น 32 บิต หารด้วย SI ผลอยู่ที่ AX เศษที่ DX MOV AL,CL MUL BL ADD AX,DX CWD IDIV SI
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.