ROM-BIOSstaff.cs.psu.ac.th/iew/cs344-321/chapter2.doc · Web viewROM BIOS Service. I/O port or memory ... ขบวนการ “cold boot” ดังนี้...
Post on 21-Oct-2020
7 Views
Preview:
Transcript
ROM-BIOS
1
11
CS344-321 Assembly Language Programming chapter 2 page _______________________________________________________________________
Chapter 2
IBM PC
2.1 IBM PC Architecture
สถาปัตยกรรมของเครื่องไอบีเอ็มพีซี แสดงดังรูปที่ 2.1
ADDRESS BUS
นาฬิกา ซีพียู
DATA BUS
CONTROL BUS
หน่วยความจำหลักหน่วยรับเข้า/ส่งออก
รูปที่ 2.1 สถาปัตยกรรมของเครื่องไอบีเอ็มพีซี
เครื่องไอบีเอ็มพีซีใช้นาฬิกาควบคุมรอบการทำงานของซีพียู ส่วนซีพียูควบคุมหน่วยความจำหลัก และหน่วยรับเข้า/ส่งออก ผ่านทาง control bus ส่งผ่านเลขที่ทาง address bus และส่งผ่านข้อมูลทาง data bus
ตารางแสดงขนาดของ bus และ หน่วยความจำ
micro processor
data bus width
address bus widthmemory size
8086
16
20
1M
8088
8
20
1M
80286
16
24
16M
80386SX
16
24
16M
80386DX
32
32
4G
80486
32
32
4G
Pentium
64
32
4G
Pentium Pro
64
36
64G
2.1.1 Intel 8086/8088 Registers
158 7 0
15
0
AX AH AL Accumulator CS Code Segment
BX BH BL Base
DS Data Segment
CX CH CL Count
SS Stack Segment
DX DH DL Data
ES Extra Segment
15
0
15
0
BP Base Pointer
IP Instruction Pointer
SP Stack Pointer15
0
SI Source Index
FLAGS Status Word
DI Destination Index
รูปที่ 2.2 เรจิสเตอร์ของซีพียู 8086/8088
เรจิสเตอร์ทั้งหมดมีขนาด 16 บิต ยกเว้นเรจิสเตอร์ AH AL BH BL CH CL DH และ DL มีขนาด 8 บิต เรจิสเตอร์ AX (AH AL) BX (BH BL) CX(CH CL) และ DX (DH DL)ใช้เพื่อจุดประสงค์ในการคำนวณ เรจิสเตอร์ BX และ BP ใช้เป็นเรจิสเตอร์ฐาน (base) เรจิสเตอร์ BP และ SP ใช้เป็นเรจิสเตอร์ตัวชี้ (pointer) เรจิสเตอร์ SI และ DI ใช้เป็นเรจิสเตอร์ดรรชนี (index) เรจิสเตอร์ CS DS SS และ ES ใช้เพื่อกำหนดเซกเมนต์ (segment) เรจิสเตอร์ IP ใช้ร่วมกับเรจิสเตอร์ CS เพื่อคำนวณเลขที่อยู่เชิงกายภาพ (physical address) ของคำสั่งในหน่วยความจำที่จะกระทำการต่อไป โดยการเลื่อนตำแหน่งของบิตในเซกเมนต์เรจิสเตอร์ ในที่นี้ คือ CS ไปทางซ้าย 4 บิต เติม 0 ที่ตำแหน่งของบิตทางขวาขณะที่เลื่อน แล้วนำค่านี้บวกกับค่าออฟเซต (offset) ในที่นี้ คือ ค่าในเรจิสเตอร์ IP ดังแสดงในรูปที่ 2.3 การคำนวณเลขที่อยู่เชิงกายภาพของข้อมูลในหน่วยความจำ ก็ทำในลักษณะนี้เช่นกัน เพียงแต่ใช้ เรจิสเตอร์ DS SS หรือ ES เป็นเซกเมนต์ และใช้ค่าคงที่ หรือ ค่าในเรจิสเตอร์อื่น เป็นออฟเซต การกำหนดเลขที่อยู่ของข้อมูลในกองซ้อน ใช้เรจิสเตอร์ SS เป็นเซกเมนต์ ร่วมกับ เรจิสเตอร์ SP เป็นออฟเซต โดยเรจิสเตอร์ SP จะชี้ไปที่ยอดกองซ้อน ส่วนการกำหนดเลขที่อยู่ของข้อมูลอื่น ใช้เรจิสเตอร์ DS หรือ ES เป็นเซกเมนต์ ร่วมกับ ค่าคงที่หรือค่าในเรจิสเตอร์อื่น เป็นออฟเซต เลขที่อยู่ในหน่วยความจำจึงมักนิยมเขียนอยู่ในรูป เซกเมนต์:ออฟเซต เช่น CS:IP SS:SP DS:0010 ES:0000 หรือ FF00:000A เป็นต้น
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 เซกเมนต์
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ออฟเซต
19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
เลขที่อยู่เชิงกายภาพ
รูปที่ 2.3 วิธีการคำนวณเลขที่อยู่เชิงกายภาพ
เรจิสเตอร์ตัวสุดท้าย คือ FLAGS ใช้เก็บสภาวะต่างๆ ดังรูปที่ 2.4
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
รูปที่ 2.4 เรจิสเตอร์ FLAGS
สภาวะในรูปที่ 2.4 มีความหมาย ดังนี้
- CF (Carry Flag) การคำนวณมีการทด
- OF (Overflow Flag) การคำนวณล้น
- ZF (Zero Flag) ผลลัพธ์เป็นศูนย์ หรือการเปรียบเทียบเท่ากัน
- SF (Sign Flag) ผลลัพธ์ (หรือการเปรียบเทียบ) เป็นลบ
- PF (Parity Flag) มีบิตที่เป็น 1 จำนวนคู่
- AF (Auxiliary carry Flag) การคำนวณเลขฐาน 10 ด้วยรหัสเลขฐาน 2 (BCD-Binary-Code Decimal) ต้องมีการปรับค่าให้ถูกต้อง
- DF (Direction Flag) ควบคุมทิศทางการเคลื่อนย้ายข้อมูล
- IF (Interrupt Flag) ควบคุมการขัดจังหวะ
- TF (Trap Flag) ควบคุมการปฏิบัติการของคำสั่งทีละคำสั่ง มักใช้ในโปรแกรม DEBUG
2.1.2 Intel 80386-Pentium Pro Registers
32-bit names 16-bit names 8-bit names
31158 7 0
15
0
EAX AX AH AL Accumulator CS Code Segment
EBX BX BH BL Base
DS Data Segment
ECX CX CH CL Count
SS Stack Segment
EDX DX DH DL Data
ES Extra Segment
3115
0
FS
EBP
BP Base Pointer
GS
ESP
SP Stack Pointer
ESI
SI Source Index
Status Word
EDI
DI Destination Index
31 15 0
EIP IP Instruction pointer
EFLAGS FLAGS Flags
รูปที่ 2.5 เรจิสเตอร์ของซีพียู 80386-Pentium Pro
2.1.3 REAL MODE V.S. PROTECTED MODE
ซีพียูตั้งแต่ 80286 ขึ้นไปสามารถกำหนดให้ดำเนินการได้ในสองลักษณะ คือ real mode กับ protected mode ซีพียู 80286 มีเรจิสเตอร์ต่าง ๆ เหมือน 8086/8088 ซึ่งมีขนาด 16 บิต ดังที่กล่าวในหัวข้อ 2.1.1 แต่ซีพียูตั้งแต่ 80386 เป็นต้นไปจะมีเรจิสเตอร์ 32 บิต ดังที่กล่าวในหัวข้อ 2.1.2
( real mode อนุญาตให้อ้างถึงเลขที่ในหน่วยความจำได้ แค่ 1M แรกเท่านั้น ไม่ว่าจะเป็นซีพียูหมายเลขใด จึงมีลักษณะเหมือนการดำเนินการด้วยซีพียู 8086/8088 การอ้างถึงเลขที่กายภาพในหน่วยความจำต้องใช้เซกเมนต์เรจิสเตอร์คู่กับออฟเซต ตามที่กล่าวแล้วในหัวข้อ 2.1.1 และสามารถสรุปเป็นเรจิสเตอร์คู่ ต่าง ๆ ได้ ดังนี้
8086/8088 – Pentium Pro 16-bit segment and offset address combination
segment
offset
special purpose
CS
IP
Instruction address
SS
SP or BP
Stack address
DS
BX, DI, SI, and
8-bit number
or 16 bit number
Data address
ES
DI for string instructionsString destination address
80386 – Pentium Pro 32-bit segment and offset address combination
segment
offset
special purpose
CS
EIP
Instruction address
SS
ESP or EBP
Stack address
DS
EAX,EBX,ECX,EDX,
EDI,ESI, and
8-bit number
or 32 bit number
Data address
ES
EDI for string instructionsString destination address
หมายเหตุ ในกรณี real mode ของซีพียู 80386-Pentium Pro ห้ามใส่ค่าในออฟเซตเกิน FFFFH เพราะจะทำให้เกิดเลขที่ผิดพลาด และทำให้ระบบหยุดการทำงาน
( protected mode อนุญาตให้อ้างถึงเลขที่ในหน่วยความจำได้ เกิน1M มีเฉพาะในซีพียูตั้งแต่ 80286 ขึ้นไป มีการอ้างถึงโดยใช้ selector และ descriptor ซึ่งอยู่นอกเหนือจากเนื้อหาในวิชานี้
หมายเหตุ สำหรับ protected mode สามารถกำหนดให้ บิตที่ 17 ของ EFLAGS ซึ่งเรียกว่า VM (Virtual Mode) ให้มีค่าเป็น 1 เพื่อให้เป็น virtual modeทำให้เสมือนหนึ่งมีหน่วยความจำ 1M ได้หลาย ๆ ส่วน จึงสามารถวิ่ง DOS มากกว่าหนึ่งตัวบน Window ได้พร้อม ๆ กัน
2.2 DOS
ดอสเป็นระบบปฏิบัติการแบบผู้ใช้คนเดียว และทำทีละโปรแกรม มีหน้าที่จัดการกับทรัพยากรที่คอมพิวเตอร์มีอยู่ ได้แก่ ซีพียู หน่วยความจำ หน่วยรับเข้า/ส่งออก และหน่วยเก็บช่วย ดอสอนุญาตให้มีโปรแกรมหลายโปรแกรมในหน่วยความจำได้ เช่น โปรแกรมประเภทจบการทำงานแต่ยังสิงสู่อยู่ในหน่วยความจำ (Terminated but Stay Resident) หรือ โปรแกรมที่มีเมนูให้สลับไปที่ดอสชั่วคราว เป็นต้น การที่มีโปรแกรมในหน่วยความจำหลายโปรแกรม ไม่ได้หมายความว่า ดอสเป็นระบบปฏิบัติการที่ทำงานได้หลายๆ โปรแกรมพร้อมกัน เนื่องจากดอสไม่ได้จัดการกับซีพียูในลักษณะที่แบ่งกันใช้ ให้กับแต่ละโปรแกรม
การจัดการกับซีพียูไม่มีอะไรสับซ้อน เนื่องจากเป็นระบบการทำงานแบบทีละโปรแกรม ซีพียูจะถูกจัดสรรให้กับโปรแกรมที่นำมาปฏิบัติการ จนกว่าโปรแกรมดังกล่าวจะทำงานเสร็จ
การจัดการกับหน่วยเก็บช่วย มีการกำหนดชื่อไดรว์ (drive) ให้กับอุปกรณ์ที่เป็นหน่วยเก็บช่วย เช่น กำหนดชื่อไดรว์ A: B: และ C: ให้กับจานแม่เหล็กแบบอ่อนขนาด 3 1/2 นิ้ว, ขนาด 5 1/4 นิ้ว, และจานแม่เหล็กแบบแข็ง ตามลำดับ เป็นต้น แต่ละไครว์จะบรรจุสารบบ (directory) และแฟ้ม ซึ่งมีโครงสร้างแบบต้นไม้ที่มีรากอยู่ข้างบน และกิ่งก้านสาขาแตกลงมาข้างล่าง ดังรูปที่ 2.6
\
COMMAND.COM
PASCAL30
AUTOEXEC.BAT
. ..
README.TXT
PSUPAS30
TAIPAS30
รูปที่ 2.6 โครงสร้างสารบบและแฟ้มของระบบปฎิบัติการดอส
รากจะแทนด้วยเครื่องหมาย “\” เป็นสารบบบนสุด ระดับล่างลงมาจะเป็นแฟ้มหรือสารบบย่อย สารบบย่อยประกอบด้วยแฟ้มและสารบบย่อยระดับล่างลงไปได้อีก เป็นชั้นๆ สารบบระดับบน เรียกว่า สารบบพ่อแม่ (parent directory) ของสารบบย่อยระดับล่าง ชื่อแฟ้มหรือสารบบย่อย ประกอบด้วยสองส่วน คือ ชื่อ กับ ส่วยขยาย (extension) ส่วนขยายจะมีหรือไม่ก็ได้ ถ้ามีต้องคั่นด้วยเคริ่องหมาย “.” มีสารบบย่อยพิเศษสองสารบบ คือ . และ .. แทน สารบบปัจจุบัน (current directory) และ สารบบพ่อแม่ ตามลำดับ ดอสจะเป็นตัวจัดการกับโครงสร้างเหล่านี้ และมีบริการให้ผู้ใช้เรียกใช้ เช่น สร้าง (create) เปิด (open) ปิด (close) และลบ (delete) แฟ้มข้มูล เป็นต้น การเรียกใช้บริการของดอสทำได้โดยการใช้คำสั่งขัดจังหวะ intr แต่ละบริการจะมีหมายเลขขัดจังหวะ และหมายเลขฟังก์ชัน เช่น intr 21h ฟังก์ชัน 32h หมายถึง เปิดแฟ้ม เป็นต้น หมายเลขขัดจังหวะเป็นส่วนหนึ่งของคำสั่ง intr แต่หมายเลขฟังก์ชันต้องกำหนดผ่านทางเรจิสเตอร์ โดยปกติจะผ่านทางเรจิสเตอร์ AH ค่าพารามิเตอร์อื่น ก็ส่งผ่านทางเรจิสเตอร์ เช่นกัน ดอสติดต่อกับแฟ้มในสองลักษณะ ลักษณะแรกใช้ FCB (File Control Block) ซึ่งเป็นลักษณะที่ใช้ในระบบปฏิบัติการ CP/M เป็นลักษณะที่ล้าสมัยไปแล้ว ลักษณะที่สองใช้ หมายเลขแฟ้ม (file handle) เป็นลักษณะเดียวกันกับที่ใช้ในระบบปฏิบัติการยูนิก ลักษณะหมายเลขแฟ้มจะมีตั้งแต่ดอสเวอร์ชัน 2 เป็นต้นไป
การจัดการกับหน่วยรับเข้า/ส่งออก แบ่งออกเป็นสองระดับ คือ ระดับไบออส กับระดับดอส ระดับไบออสเป็นบริการที่ควบคุมอุปกรณ์นำข้อมูลเข้าหรือออกพื้นฐาน บริการระดับไบออส เก็บอยู่ในรอม ส่วนระดับดอส เป็นบริการระดับสูง ที่เรียกใช้บริการระดับไบออสอีกทีหนึ่ง บริการระดับดอส เก็บอยู่ในแรม หลังจากการบูทดอสแล้ว ผู้ใช้สามารถเรียกใช้ได้ทั้งบริการจากไบออสและดอส การบริการระดับไบออส และ ดอส ที่สำคัญ จะกล่าวถึงในหัวข้อถัดไป นอกจากนี้ โปรแกรมผู้ใช้สามารถรับเข้าข้อมูลหรือส่งออกข้อมูล ผ่านทางหน่วยรับเข้า/ส่งออก ได้โดยตรง
application program
DOS service
ROM BIOS Service
I/O port or memory map I/O
รูปที่ 2.7 MS-DOS layer service
การเขียนโปรแกรมที่ดี ควรจะเรียกใช้บริการของดอส เพราะการเปลี่ยนแปลง BIOS จะไม่มีผลกระทบกับโปรแกรม อย่างไรก็ตามถ้าต้องการให้โปรแกรมทำงานเร็วบางครั้งจำเป็นต้องเรียกใช้บริการ BIOS หรือ อ่าน/เขียนข้อมูลไปที่ I/O โดยตรง เช่น โปรแกรมประเภทเกม เป็นต้น โปรแกรม DOS ที่การอ่าน/เขียนข้อมูลไปที่ I/O โดยตรง อาจจะไม่สามารถวิ่งบน Window ผู้ใช้ต้องสลับไปยัง DOS mode
2.3 WINDOW
Window เป็นระบบปฏิบัติการแบบ multi tasking ทำให้สามารถทำงานพร้อม ๆ กันได้หลายงาน มีการจัดการกับหน่วยความจำแบบ virtual memory ทำให้สามารถเขียนโปรแกรมโตกว่า 1M ได้ เนื่องจากวิ่งใน protected mode การอ้างถึงเลขที่เป็นลักษณะเชิงเส้น (linear addressing) ไม่ใช่เป็นแบบเซกเมนต์:ออฟเซต เหมือนใน real mode เลขที่ดังกล่าวไม่ใช่เลขที่ทางกายภาพ แต่เป็น virtual address ต้องมีขบวนการเปลี่ยนจาก virtual address ให้เป็นเลขที่ทางกายภาพ เรียกว่า address mapping ซึ่งเป็นหน้าที่ของระบบปฏิบัติการ Window นอกจากนี้ การติดต่อกับ Window ต้องผ่าน API (Application Program Interface) ซึ่งมีลักษณะเป็นการเรียกใช้เหมือนภาษาซี ไม่ใช่ลักษณะการเรียกใช้บริการผ่าน interrupt อย่างไรก็ Window สามารถจำลองการทำงานของ DOS ได้ ด้วยการวิ่งใน virtual mode
เนื้อหาในวิชานี้ จะกล่าวถึงซีพียู 8086/8088/8087 และระบบปฏิบัติการ DOS เท่านั้น
2.4. Physical Memory 1M for DOS
FFFFF 1024 K
cold boot FFFF0 ROM
start here
768 K
128K monochrome
and graphics/
display video
buffer (RAM)
640 K
transient portion of COMMAND.COM
Memory
available for
user programs
resident part of COMMAND.COM
DOS kernel,
Device Drivers, etc.
00400 BIOS and DOS Data Area 1K
Interrupt vectors
0
รูปที่ 2.8 Map of the first megabyte of PC memory.
สถาปัตยกรรมของเครื่องไอบีเอ็มพีซี มีหน่วยที่ใช้วัดขนาดของข้อมูล ดังนี้ ข้อมูล 1 ไบต์ มีขนาด 8 บิต ข้อมูล 1 คำ มีขนาด 2 ไบต์ และข้อมูลขนาด สองเท่าของคำ มีขนาด 4 ไบต์ การเก็บข้อมูลในหน่วยความจำของข้อมูลหนึ่งคำ จะเก็บไบต์ที่มีนัยสำคัญน้อย (least significant) ไว้ที่เลขที่ต่ำ และเก็บไบต์ที่มีนัยสำคัญมาก (most significant) ไว้ที่เลขที่สูง ดังแสดงในรูปที่ 2.9
เลขที่สูง
B5ไบต์ที่มีนัยสำคัญมาก
คำ
ค่าที่เก็บคือ B59E
9Eไบต์ที่มีนัยสำคัญน้อย
เลขที่ต่ำ
รูปที่ 2.9 การเก็บข้อมูลหนึ่งคำ
The boot Process
เมื่อเริ่มเปิดเครื่อง จะเกิดขบวนการ “cold boot” ดังนี้ ซีพียูเข้าสู่สถานะ reset จากนั้นเริ่มล้างหน่วยความจำให้มีค่าเป็น 0 ตรวจสอบความถูกต้องของหน่วยความจำ (parity check) แล้วกำหนดให้ เรจิสเตอร์ CS มีค่าเท่ากับ FFFFH และเรจิสเตอร์ IP มีค่าเท่ากับ 0 ซึ่งเป็นตำแหน่งของคำสั่งแรกที่จะกระทำการ ตำแหน่งนี้จะอยู่ใน ROM BIOS จากนั้น BIOS จะตรวจสอบอุปกรณ์ต่าง ๆ และ initialize อุปกรณ์ที่ติดตั้งเหล่านั้น จากนั้นจะสร้าง ตาราง BIOS interrupt service ที่บริเวณ interrupt vector และ BIOS data เริ่มตั้งแต่ตำแหน่ง 400H จากนั้นไปตรวจสอบว่าจานแม่เหล็กมี DOS หรือไม่ ถ้ามีจะอ่านข้อมูลใน boot sector เข้ามายังหน่วยความจำ ข้อมูลดังกล่าว คือ bootstrap loader ซึ่งทำหน้าที่บรรจุระบบปฏิบัติการ DOS จากจานแม่เหล็กเข้าสู่หน่วยความจำ RAM แฟ้มข้อมูล 3 แฟ้ม คือ IBMBIO.COM (หรือ IO.SYS), IBMDOS.COM(หรือ MSDOS.SYS), และ COMMAND.COM จะถูกบรรจุลงหน่วยความจำ จากนั้นระบบปฏิบัติการ DOS จะอ่าน config.sys เพื่อติดตั้ง driver เพิ่ม และอ่านแฟ้ม autoexec.bat และปฏิบัติตามคำสั่งในนั้น จากนั้นขึ้น prompt เพื่อรอรับคำสั่ง
2.5 Stack
สำหรับข้อมูลในกองซ้อน สามารถดำเนินการได้ทีละคำเท่านั้น การกดทำดังนี้ ลบค่า SP ด้วย 2 แล้วใส่ข้อมูลที่เลขที่ SS:SP กับ SS:(SP+1) ส่วนการผุด ทำในทางกลับกัน คือ เอาข้อมูลที่เลขที่ SS:SP กับ SS:(SP+1) ไปใช้ แล้วบวกค่า SP ด้วย 2 ดังตัวอย่างในรูปที่ 2.10 การทดสอบกองซ้อนว่างหรือล้น ไม่ได้ทำโดยส่วนเครื่อง ผู้ใช้ต้องเขียนโปรแกรม (ส่วนคำสั่ง) ทดสอบเอง สิ่งที่ต้องระมัดระวังอีกอย่างหนึ่งคือ ถ้า SP มีค่าเท่ากับ 0000 หลังจากกด ค่า SP จะเท่ากับ FFFE และข้อมูลจะอยู่ที่เลขที่ SS:FFFE กับ SS:FFFF ในทางกลับกัน ถ้า SP มีค่าเท่ากับ FFFE หลังการผุด ค่า SP จะเท่ากับ 0000 แต่ละกองซ้อนจึงมีขนาดได้ไม่เกิน 64K ไบต์
ส่วนล่างของกองซ้อน
เลขที่สูง
8000:1025 3A
8000:1025 3A
8000:1024 ED
8000:1024 ED
8000:1023 CD
8000:1023 CD
8000:1022 EF SP = 1022
8000:1022 EF
8000:1021
8000:1021 95
8000:1020
8000:1020 01 SP = 1020
เลขที่ต่ำ
SS = 8000
กองซ้อนก่อนกด
กองซ้อนหลังกดค่า 9501
กองซ้อนหลังผุด
กองซ้อนก่อนผุด
รูปที่ 2.10 ตัวอย่างการดำเนินการกับข้อมูลในกองซ้อน
2.6 Memory Model
เนื่องจากการกำหนดเลขที่อยู่ในหน่วยความจำ ใช้เซกเมนต์เรจิสเตอร์และออฟเซต การเขียนโปรแกรมของสถาปัตยกรรมแบบนี้ จึงแบ่งออกได้เป็น 3 ตัวแบบ (model) หลัก ตามลักษณะของการอ้างถึงเลขที่อยู่ในหน่วยความจำ คือ ตัวแบบขนาดจิ๋ว (tiny model) ตัวแบบขนาดเล็ก (small model) และ ตัวแบบขนาดใหญ่ (large model)
ตัวแบบขนาดจิ๋ว มีค่าของเซกเมนต์เรจิสเตอร์ CS DS SS และ ES เท่ากัน มีค่าคงที่ตามที่กำหนดให้ครั้งแรก ทำให้ คำสั่ง ข้อมูลในกองซ้อน และข้อมูลอื่น มีจุดเริ่มต้นเดียวกัน ขนาดของโปรแกรมจึงขึ้นอยู่กับขนาดของออฟเซต ซึ่งโตได้มากที่สุด 216 หรือ 64K ไบต์ ดังแสดงในรูปที่ 2.11 ก
ตัวแบบขนาดเล็ก ใช้ CS เป็นเซกเมนต์ของคำสั่ง มีค่าคงที่ตามที่กำหนดให้ครั้งแรก ทำให้ส่วนที่เป็นคำสั่งโตได้มากที่สุด 64K ไบต์ และมีค่าของเซกเมนต์เรจิสเตอร์ DS SS และ ES เท่ากัน มีค่าคงที่ตามที่กำหนดให้ครั้งแรก แต่ไม่จำเป็นต้องเท่ากับค่าใน CS ทำให้ ข้อมูลในกองซ้อนและข้อมูลอื่น มีจุดเริ่มต้นเดียวกัน ข้อมูล (ทั้งในกองซ้อนและอื่นๆ) โตได้มากที่สุด 64K ไบต์ ฉะนั้นโปรแกรมโตได้มากที่สุด 128K ไบต์ ดังแสดงในรูปที่ 2.11 ข
ตัวแบบขนาดใหญ่ ใช้ CS เป็นเซกเมนต์ของคำสั่ง มีค่าเปลี่ยนไปตามความต้องการ ใช้ SS เป็น เซกเมนต์ของข้อมูลในกองซ้อน มีค่าคงที่ตามที่กำหนดให้ครั้งแรก และใช้ DS และ ES เป็นเซกเมนต์ของข้อมูลอื่น มีค่าเปลี่ยนไปตามความต้องการ ทำให้ส่วนข้อมูลในก้องซ้อนโตได้มากที่สุด 64K ไบต์ แต่ส่วนคำสั่งและข้อมูลอื่น โตได้เท่าที่มีหน่วยความจำเหลือให้ใช้ ดังแสดงในรูปที่ 2.11 ค ตัวแบบขนาดใหญ่อาจจะเรียกแตกต่างออกไป ตามจำนวนเซกเมนต์ของคำสั่งและข้อมูล เช่น ตัวแบบที่มีเซกเมนต์ของคำสั่งหลายเซกเมนต์ แต่มีเซกเมนต์ของข้อมูลเพียงเซกเมนต์เดียว เรียกว่า ตัวแบบขนาดกลาง (medium model) และตัวแบบที่มี เซกเมนต์ของคำสั่งหนึ่งเซกเมนต์ แต่มีเซกเมนต์ของข้อมูลหลายเซกเมนต์ เรียกว่า ตัวแบบขนาดกระทัดรัด (compact model) เป็นต้น
ข้อมูลในกองซ้อน ข้อมูลในกองซ้อน
+
SS ->
ข้อมูลอื่น
DS SS ES ->
…
ข้อมูลอื่น
DS ES ->
ข้อมูลในกองซ้อน ข้อมูลอื่น
+ DS ES->
ข้อมูลอื่น
คำสั่ง …
+ คำสั่ง
คำสั่ง CS ->
คำสั่ง
CS DS SS ES -> CS -> CS ->
ก. ตัวแบบขนาดจิ๋ว ข. ตัวแบบขนาดเล็ก ค. ตัวแบบขนาดใหญ่
รูปที่ 2.11 ตัวแบบของหน่วยความจำ
2.7 .EXE v.s. .COM
โปรแกรมภาษาเครื่องที่จะนำมาวิ่งบนดอส มีสองแบบ คือ ภาษาเครื่องในรูปแฟ้ม .COM และ ภาษาเครื่องในรูปแฟ้ม .EXE แบบแรกเมื่อนำไปบรรจุในหน่วยความจำจะมีลักษณะดังในรูปที่ 2.12 ก และแบบหลังในรูปที่ 2.12 ข
<- SP
00H
ข้อมูลในกองซ้อน
00H <- SP <- SS
ข้อมูลอื่น
โปรแกรมภาษาเครื่องจากแฟ้ม .COM คำสั่ง <- IP
<- IP = 0100H <- CS
Program Segment Prefix (PSP) Program Segment Prefix (PSP)
<- CS DS ES SS <- DS ES
ก. แฟ้ม .COM ข. แฟ้ม .EXE
รูปที่ 2.12 ส่วนของหน่วยความจำเมื่อบรรจุโปรแกรมภาษาเครื่อง
ก่อนบรรจุโปรแกรมบนหน่วยความจำ ดอสจะต้องรู้ขนาดของโปรแกรม เพื่อจะได้จัดสรรเนื้อที่ให้พอกับความต้องการ สำหรับโปรแกรม .COM ขนาดของแฟ้มที่เก็บโปรแกรม จะเป็นขนาดของโปรแกรม ที่จะบรรจุในหน่วยความจำ จากนั้นดอสจะจัดสรรบล็อกว่างขนาดใหญ่สุดให้กับโปรแกรม ถ้าขนาดของบล็อกว่างน้อยกว่าขนาดของโปรแกรม บวกกับ 258 ไบต์ (256 ไบต์ สำหรับ PSP และ 2 ไบต์ สำหรับค่าเริ่มต้นบนกองซ้อน) รายงานความผิดพลาดให้ผู้ใช้รู้ว่า โปรแกรมดังกล่าวไม่สามารถวิ่งได้ มิฉะนั้นจะสร้าง Program Segment Prefix (PSP) ขนาด 100H (256) ไบต์แรก ไว้หน้าโปรแกรม แล้วบรรจุโปรแกรมจากแฟ้ม .COM ไว้ที่ไบต์ถัดไป ตามลำดับ ค่าในแฟ้ม .COM และค่าในหน่วยความจำ จะเป็นค่าเดียวกันไบต์ต่อไบต์ จากนั้นกำหนดค่าให้ DS, ES และ SS ให้ชี้ไปที่ จุดเริ่มต้นของ PSP ถ้าขนาดของบล็อกว่างโตกว่าหรือเท่ากับ 64K ไบต์ ดอสจะกำหนดค่า SP ให้เท่ากับ 0000H แล้วกดค่าเริ่มต้น 0000H ไว้บนกองซ้อน ทำให้ค่า SP มีค่าเท่ากับ FFFEH แต่ถ้าบล็อกว่างมีขนาดน้อยกว่า 64K ไบต์ ดอสจะกำหนดค่า SP และกดค่าเริ่มต้น 0000H เพื่อให้ค่าเริ่มต้นอยู่ที่คำสุดท้ายของบล็อก และค่า SP ชี้ไปที่ค่าเริ่มต้นดังกล่าว จากนั้นกำหนดค่าให้ CS ชี้ไปที่ จุดเริ่มต้นของ PSP และกำหนดค่า IP ให้เท่ากับ 0100H เพื่อเป็นจุดเริ่มต้นของการปฏิบัติการ โปรแกรม .COM จึงมีข้อจำกัดดังต่อไปนี้ ต้องเริ่มต้นปฏิบัติการที่ออฟเซต 0100H เสมอ และมีขนาดสูงสุดได้แค่ 64K - 258 ไบต์ ตรงกับตัวแบบหน่วยความจำขนาดจิ๋ว
สำหรับโปรแกรม .EXE ข้อมูลเกี่ยวกับขนาดของโปรแกรม จะเก็บอยู่บริเวณส่วนหน้าของแฟ้ม (file header) มีค่าที่สำคัญสองค่าที่เก็บอยู่ในบริเวณนี้ คือ MINALLOC และ MAXALLOC ค่าทั้งสองมีหน่วยเป็นพารากราฟ (paragraph) แต่ละพารากราฟมีขนาด 16 ไบต์ ค่าแรกกำหนดขนาดน้อยที่สุดของหน่วยความจำเพิ่มที่ต้องการ และค่าหลังกำหนดขนาดมากที่สุดของหน่วยความจำเพิ่มที่ต้องการ ดอสจะอ่านข้อมูลจากแฟ้ม .EXE แล้วคำนวณขนาดของโปรแกรม จากนั้นดอสจะจัดสรรบล็อกขนาดใหญ่สุดให้กับโปรแกรม ถ้าขนาดของโปรแกรมบวกกับ 256 (ขนาดของ PSP) บวกกับ (MINALLOC*16) มีค่ามากกว่าขนาดของบล็อก จะรายงานข้อความผิดพลาด เพื่อบอกให้รู้ว่าโปรแกรมโตเกินไป มิฉะนั้น ดอสจะเปรียบเทียบขนาดของบล็อก กับ ขนาดของโปรแกรมบวกกับ 256 บวกกับ (MAXALLOC*16) ถ้าขนาดของบล็อคโตกว่า จะจัดสรรเนื้อที่ให้เท่าที่ต้องการ คืนส่วนที่เหลือไปเก็บในรายการ มิฉะนั้นจะจัดสรรทั้งบล็อกให้กับโปรแกรม จากนั้นดอสจะสร้าง PSP ขนาด 256 ไบต์แรก ไว้หน้าโปรแกรม แล้วบรรจุโปรแกรมจากแฟ้ม .EXE ไว้ที่ไบต์ถัดไป ขณะที่บรรจุโปรแกรม ดอสจะทำการย้ายที่อยู่ (relocate) ต่าง ๆ ในโปรแกรม ให้สอดคล้องกับตำแหน่งที่บรรจุในหน่วยความจำ โดยใช้ตารางย้ายที่อยู่ (relocation pointer table) ที่เก็บอยู่ในแฟ้ม .EXE จากนั้นกำหนดให้ SS ชี้ไปที่จุดเริ่มต้นของเซกเมนต์ของข้อมูลในกองซ้อน และกำหนดให้ SP ชี้ไปที่ตำแหน่งบนสุดของกองซ้อน กำหนดให้ DS และ ES ชี้ไปที่จุดเริ่มต้นของ PSP จากนั้นกำหนดให้ CS และ IP ชี้ไปที่จุดเริ่มต้นของเซกเมนต์ และออฟเซต ที่จะเริ่มต้นกระทำการ
ข้อควรระมัดระวัง ถ้ามีแฟ้มสามแฟ้ม คือ hello.com , hello.exe , และ hello.bat ถ้าใส่เฉพาะชื่อ hello เมื่อต้องการกระทำการ DOS จะค้นหา .com ก่อน .exe ก่อน .bat ตามลำดับ ในกรณีนี้จะหมายถึง hello.com ถ้าต้องการกระทำการกับ hello.exe หรือ hello.bat ต้องใส่ extension ด้วย หรือไม่ก็เปลี่ยนชื่อให้ต่างกัน
2.8 Execution Steps
การกระทำการ (execution) มีขั้นตอน ดังนี้
fetch คำสั่งมาจากหน่วยความจำตรงเลขที่กายภาพ CS:IP
บวกค่า IP ด้วยขนาดของคำสั่ง
ดำเนินการตามคำสั่งนั้น
หมายเหตุ ถ้าคำสั่งต่อไปที่กระทำการไม่ใช่คำสั่งที่อยู่ถัดไป เช่น คำสั่ง jump เป็นต้น หลังการดำเนินการแล้ว ค่าใน CS และ IP จะเปลี่ยนไปยังเลขที่กายภาพที่ต้องการ jump ไป
Computer Science, Prince of Songkhla University Copy Right ©1999 by Iew Ayaragarnchanakul
top related