กลับไปหน้าบทความ

อ่าน 6 นาที

INT 13H

INT 13h เป็นตัวย่อของ BIOS interrupt call 13 hex ซึ่ง เป็นเวกเตอร์อินเตอร์รัปต์ ลำดับที่ 20 ในระบบคอมพิวเตอร์แบบ x86 (ที่พัฒนามาจาก IBM PC) โดยปกติ BIOS จะตั้งค่า...

INT 13H

INT 13hเป็นตัวย่อของBIOS interrupt call 13 hex ซึ่ง เป็นเวกเตอร์อินเตอร์รัปต์ลำดับที่ 20 ในระบบคอมพิวเตอร์แบบx86 (ที่พัฒนามาจาก IBM PC) โดยปกติ BIOSจะตั้งค่าตัวจัดการอินเตอร์รัปต์แบบ real mode ที่เวกเตอร์นี้ ซึ่งให้บริการการอ่านและเขียนข้อมูลฮาร์ดดิสก์และฟลอปปี้ดิสก์แบบเซกเตอร์ โดยใช้ การกำหนดแอดเดรสแบบ cylinder-head-sector (CHS) BIOS ของพีซีรุ่นใหม่ยังรวมถึงฟังก์ชันส่วนขยาย INT 13h ซึ่งคิดค้นโดย IBM และ Microsoft ในปี 1992 ซึ่งให้บริการการเข้าถึงดิสก์แบบเดียวกันโดยใช้การกำหนดแอดเดรสแบบ 64 บิตLBAและด้วยการเพิ่มเติมเล็กน้อย ฟังก์ชันเหล่านี้ได้รับการกำหนดมาตรฐานโดย Phoenix Technologies และบริษัทอื่นๆ ในชื่อส่วนขยาย BIOS EDD ( Enhanced Disk Drive )

INT เป็น คำสั่ง x86 ที่เรียกใช้งานการขัดจังหวะซอฟต์แวร์และ 13 hexคือหมายเลขการขัดจังหวะ (ในรูปแบบ ค่าเลข ฐานสิบหก ) ที่ถูกเรียกใช้

คอมพิวเตอร์สมัยใหม่มาพร้อมกับฟังก์ชัน BIOS INT 13h และUEFIซึ่งให้บริการเหมือนกันและอื่นๆ อีกมากมาย ยกเว้น UEFI Class 3 ที่ตัดCSM ออกไปโดยสิ้นเชิง จึงขาด INT 13h และอินเตอร์รัปต์อื่นๆ โดยทั่วไปแล้ว ไดรเวอร์ UEFI จะใช้ การกำหนดแอดเดรส แบบ LBAแทนการกำหนดแอดเดรสแบบ CHS

ภาพรวม

ภายใต้ ระบบปฏิบัติการ แบบเรียลโหมดเช่นDOSการเรียกใช้ INT 13h จะกระโดดเข้าไปในโค้ด ROM-BIOS ของคอมพิวเตอร์เพื่อให้บริการดิสก์ระดับต่ำซึ่งจะดำเนินการอ่านหรือเขียนข้อมูลลงดิสก์ตามเซกเตอร์ทางกายภาพสำหรับโปรแกรม ใน DOS นั้น INT 13h ทำหน้าที่เป็นอินเทอร์เฟซระดับต่ำสำหรับไดรเวอร์อุปกรณ์บล็อกในตัวสำหรับฮาร์ดดิสก์และฟลอปปี้ดิสก์ซึ่งทำให้ INT 25h และ INT 26h สามารถให้บริการฟังก์ชันการอ่าน/เขียนดิสก์แบบสัมบูรณ์สำหรับเซกเตอร์เชิงตรรกะแก่ ไดรเวอร์ ระบบไฟล์FAT ในเคอร์เนล DOS ซึ่งจัดการคำขอที่เกี่ยวข้องกับไฟล์ผ่าน ฟังก์ชัน DOS API ( INT 21h )

ภายใต้ ระบบปฏิบัติการ โหมดป้องกันเช่น ระบบ ปฏิบัติการตระกูล Microsoft Windows NT (เช่น NT4, 2000, XP และ Server 2003) และLinuxที่ใช้dosemuระบบปฏิบัติการจะดักจับการเรียกและส่งต่อไปยังกลไกการอ่าน/เขียนดิสก์ของระบบปฏิบัติการเองWindows 9xและWindows for Workgroups 3.11ก็ข้ามขั้นตอน BIOS เมื่อใช้การเข้าถึงดิสก์แบบ 32 บิตเช่นกัน นอกจากการเข้าถึงดิสก์ระดับต่ำแล้ว การเรียก INT 13h และโครงสร้างข้อมูล BIOS ที่เกี่ยวข้องยังให้ข้อมูลเกี่ยวกับประเภทและความจุของดิสก์ (หรือ อุปกรณ์ DASD อื่นๆ ) ที่เชื่อมต่อกับระบบ เมื่อระบบปฏิบัติการในโหมดป้องกันเริ่มทำงาน ระบบอาจใช้ข้อมูลจาก BIOS เพื่อระบุฮาร์ดแวร์ดิสก์ เพื่อให้ระบบปฏิบัติการสามารถโหลดและกำหนดค่าไดรเวอร์การอ่าน/เขียนดิสก์ที่เหมาะสมได้

อินเทอร์เฟซ BIOS real-mode INT 13h ดั้งเดิมรองรับไดรฟ์ที่มีขนาดสูงสุดประมาณ 8 GB โดยใช้สิ่งที่เรียกกันทั่วไปว่าการกำหนดแอดเดรส CHS ทางกายภาพข้อจำกัดนี้มาจากอินเทอร์เฟซฮาร์ดแวร์ของ ดิสก์ฮาร์ดแวร์ IBM PC/XT BIOS ใช้ แอดเดรส cylinder-head-sector (CHS) ที่ให้มาในการเรียกใช้ INT 13h และถ่ายโอนไปยังอินเทอร์เฟซฮาร์ดแวร์โดยตรง ข้อจำกัดที่น้อยกว่า ประมาณ 504 MB ถูกกำหนดโดยการรวมกันของข้อจำกัดการกำหนดแอดเดรส CHS ที่ใช้โดย BIOS และที่ใช้โดยฮาร์ดดิสก์ ATA ซึ่งแตกต่างกัน เมื่อรวมข้อจำกัดการกำหนดแอดเดรส CHS ของทั้ง BIOS และ ATA เข้าด้วยกัน (เช่น เมื่อนำไปใช้พร้อมกัน) จำนวนเซกเตอร์ 512 ไบต์ที่สามารถเข้าถึงได้จะมีขนาดรวมประมาณ 504 MB

ข้อจำกัด 504 MB ถูกเอาชนะได้โดยใช้การแปลง CHSซึ่งเป็นเทคนิคที่ BIOS จะจำลองรูปทรงเรขาคณิต CHS สมมติที่อินเทอร์เฟซ INT 13h ในขณะที่สื่อสารกับไดรฟ์ ATA โดยใช้รูปทรงเรขาคณิต CHS เชิงตรรกะดั้งเดิม (เมื่อใกล้ถึงขีดจำกัด 504 MB ดิสก์ ATA ก็หยุดแสดงพารามิเตอร์รูปทรงเรขาคณิตทางกายภาพที่แท้จริงที่อินเทอร์เฟซ ATA ภายนอกไปนานแล้ว) การแปลงช่วยให้ BIOS ซึ่งยังคงใช้การกำหนดแอดเดรส CHS สามารถกำหนดแอดเดรสดิสก์ ATA ที่มีขนาดสูงสุด 8064 MB ได้อย่างมีประสิทธิภาพ ซึ่งเป็นความจุพื้นฐานของอินเทอร์เฟซ CHS ของ BIOS เพียงอย่างเดียว (อินเทอร์เฟซ ATA มีความจุในการกำหนดแอดเดรส CHS ดั้งเดิมที่ใหญ่กว่ามาก ดังนั้นเมื่อ "การรบกวน" ของข้อจำกัด CHS ของ BIOS และ ATA ได้รับการแก้ไขโดยการกำหนดแอดเดรสแล้ว ข้อจำกัดที่เล็กกว่าของ BIOS เท่านั้นที่มีความสำคัญ) การแปลง CHSบางครั้งเรียกว่าการกำหนดแอดเดรส CHS เชิงตรรกะแต่จริงๆ แล้วเป็นชื่อที่ไม่ถูกต้อง เนื่องจากในขณะที่พัฒนา BIOS นี้ แอดเดรส CHS ของ ATA เป็นแบบเชิงตรรกะแล้ว ไม่ใช่แบบทางกายภาพ ข้อจำกัด 8064 MB เกิดจากการผสมผสานระหว่างข้อกำหนดการเรียกใช้ตามค่ารีจิสเตอร์ที่ใช้ในอินเทอร์เฟซ INT 13h และเป้าหมายในการรักษาความเข้ากันได้กับเวอร์ชันก่อนหน้า ซึ่งกำหนดว่ารูปแบบหรือขนาดของแอดเดรส CHS ที่ส่งไปยัง INT 13h จะต้องไม่เปลี่ยนแปลงเพื่อเพิ่มบิตให้กับฟิลด์ใดฟิลด์หนึ่ง เช่น ฟิลด์หมายเลขกระบอกสูบ ข้อจำกัดนี้ใช้กระบอกสูบ 1024 กระบอก หัว 256 หัว เซกเตอร์ 63 เซกเตอร์ และบล็อกขนาด 512 ไบต์ ทำให้สามารถกำหนดแอดเดรสได้ 7.875 GiB อย่างแม่นยำ (1024 × 256 × 63 × (512 ไบต์ ) ก่อนหน้านี้มี BIOS จำนวนหนึ่งที่นำเสนออินเทอร์เฟซเวอร์ชันที่ไม่เข้ากัน ตัวอย่างเช่น BIOS ของ AWARD AT และ BIOS ของ AMI 386sx ได้รับการขยายให้รองรับได้ถึง 4096 ไซลินเดอร์ โดยการวางบิตที่ 10 และ 11 ของหมายเลขไซลินเดอร์ลงในบิตที่ 6 และ 7 ของรีจิสเตอร์ DH

MS-DOSทุกเวอร์ชัน(รวมถึงMS-DOS 7และWindows 95 ) มีบั๊กที่ป้องกันการบูตไดรฟ์ดิสก์ที่มีหัวอ่าน 256 หัว (ค่ารีจิสเตอร์ 0xFF) ดังนั้น BIOS รุ่นใหม่จำนวนมากจึงจัดเตรียมการแมปการแปล CHS ที่มีหัวอ่านสูงสุด 255 หัว (0xFE) [ 1 ] [ 2 ]ซึ่งช่วยลดพื้นที่แอดเดรสทั้งหมดลงเหลือ 8032.5 MiB (ประมาณ 7.844 GiB) [ 3 ]

เพื่อรองรับการเข้าถึงดิสก์ที่มีขนาดใหญ่ขึ้น อินเทอร์เฟซที่เรียกว่าINT 13h Extensions จึงถูกนำเสนอโดย IBM และ Microsoft จากนั้นต่อมา Phoenix Technologiesได้เผยแพร่และขยายเพิ่มเติมเล็กน้อยในฐานะส่วนหนึ่งของBIOS Enhanced Disk Drive Services (EDD) [ 4 ] [ 5 ]อินเทอร์เฟซนี้กำหนดฟังก์ชันใหม่ภายในบริการ INT 13h ซึ่งทั้งหมดมีหมายเลขฟังก์ชันมากกว่า 40h โดยใช้การกำหนดแอดเดรสบล็อกตรรกะ 64 บิต (LBA) ซึ่งอนุญาตให้เข้าถึงได้สูงสุด 8 ZiB (ไดรฟ์ ATA ยังสามารถรองรับ LBA 28 บิตหรือ 48 บิต ซึ่งอนุญาตให้เข้าถึงได้สูงสุด 128 GiBหรือ 128 PiBตามลำดับ โดยสมมติว่าขนาดเซกเตอร์/บล็อกคือ 512 ไบต์) นี่คืออินเทอร์เฟซแบบ "แพ็กเก็ต" เนื่องจากใช้ตัวชี้ไปยังแพ็กเก็ตข้อมูลแทนที่จะใช้ข้อกำหนดการเรียกใช้ตามรีจิสเตอร์ของอินเทอร์เฟซ INT 13h ดั้งเดิม แพ็กเก็ตนี้เป็นโครงสร้างข้อมูลที่ง่ายมากซึ่งประกอบด้วยเวอร์ชันอินเทอร์เฟซ ขนาดข้อมูล และ LBA เพื่อความเข้ากันได้กับซอฟต์แวร์รุ่นเก่า ฟังก์ชันเพิ่มเติมจะถูกนำมาใช้ควบคู่ไปกับฟังก์ชัน CHS ดั้งเดิม และสามารถเรียกใช้ฟังก์ชันจากทั้งสองชุดผสมกันได้ แม้กระทั่งกับไดรฟ์เดียวกัน โดยมีข้อแม้ว่าฟังก์ชัน CHS ไม่สามารถเข้าถึงข้อมูลเกิน 8064 MB แรกของดิสก์ได้

ไดรเวอร์แคชบางตัวจะล้างบัฟเฟอร์เมื่อตรวจพบว่าDOSถูกข้ามโดยการออกคำสั่ง INT 13h โดยตรงจากแอปพลิเคชัน การอ่านข้อมูลจำลองผ่าน INT 13h สามารถใช้เป็นหนึ่งในหลายวิธีในการบังคับล้างแคชสำหรับแคชที่ไม่รู้จัก (เช่น ก่อนรีบูต) [ 1 ] [ 2 ]

BIOS ของ AMIจากช่วงประมาณปี 1990–1991 ทิ้งบัฟเฟอร์คำที่ไม่ตรงแนว โปรแกรม DOS และโปรแกรมที่สิ้นสุดและคงอยู่ในระบบบางโปรแกรมจะลบล้างการเปิดใช้งานการขัดจังหวะและรีจิสเตอร์ ดังนั้นPC DOSและMS-DOSจึงติดตั้งตัวกรองของตนเองเพื่อป้องกันสิ่งนี้[ 6 ]

รายชื่อบริการINT 13h

โต๊ะไดรฟ์
DL = 00hฟลอปปี้ดิสก์แผ่นแรก ("ไดรฟ์ A:")
DL = 01hฟลอปปี้ดิสก์ตัวที่ 2 ("ไดรฟ์ B:")
DL = 02 ชม.ฟลอปปี้ดิสก์แผ่นที่ 3 ("ไดรฟ์ C:")
...
DL = 7Fhฟลอปปี้ดิสก์แผ่นที่ 128
DL = 80 ชั่วโมงฮาร์ดดิสก์ตัวแรก
DL = 81 ชั่วโมงฮาร์ดดิสก์ตัวที่ 2
DL = 82 ชั่วโมงฮาร์ดดิสก์ตัวที่ 3
...
DL = E0hซีดี/ดีวีดี หรือฮาร์ดดิสก์ 97 ตัว
...
DL = FFhฮาร์ดดิสก์ตัวที่ 128
ตารางฟังก์ชัน
AH = 00h รีเซ็ตระบบดิสก์
AH = 01h ตรวจสอบสถานะการทำงานของไดรฟ์ครั้งล่าสุด
AH = 02h อ่านเซกเตอร์จากไดรฟ์
AH = 03h เขียนภาคส่วนเพื่อขับเคลื่อน
AH = 04 ชม. ตรวจสอบภาคส่วน
AH = 05h รูปแบบแทร็ก
AH = 06 ชม. รูปแบบแทร็กตั้งค่าแฟล็กเซกเตอร์เสีย
AH = 07h ฟอร์แมตไดรฟ์เริ่มต้นที่แทร็ก
AH = 08h อ่านค่าพารามิเตอร์ของไดรฟ์
AH = 09hเอชดีเริ่มต้นใช้งานตัวควบคุมดิสก์
AH = 0Ahเอชดีอ่านเซกเตอร์ยาวจากไดรฟ์
AH = 0Bhเอชดีเขียนภาคส่วนระยะยาวเพื่อขับเคลื่อน
AH = 0Chเอชดีเลื่อนหัวขับไปยังกระบอกสูบ
AH = 0Dhเอชดีรีเซ็ตไดรฟ์ดิสก์
AH = 0Ehพีเอส/2การทดสอบการอ่านตัวควบคุม
AH = 0Fhพีเอส/2ตัวควบคุมการเขียนทดสอบ
AH = 10 ชั่วโมงเอชดีทดสอบว่าไดรฟ์พร้อมใช้งานหรือไม่
AH = 11 ชั่วโมงเอชดีปรับเทียบไดรฟ์ใหม่
AH = 12 ชม.พีเอส/2การทดสอบ RAM ของคอนโทรลเลอร์
AH = 13 ชั่วโมงพีเอส/2การทดสอบการขับขี่
AH = 14 ชม.เอชดีการวินิจฉัยตัวควบคุม
AH = 15 ชม. อ่านประเภทไดรฟ์
AH = 16 ชม.เอฟดีตรวจจับการเปลี่ยนแปลงสื่อ
AH = 17 ชั่วโมงเอฟดี ตั้งค่าประเภทสื่อสำหรับรูปแบบ (ใช้โดย DOS เวอร์ชัน <= 3.1)
AH = 18 ชั่วโมงเอฟดี ตั้งค่าประเภทสื่อสำหรับรูปแบบ (ใช้โดย DOS เวอร์ชัน 3.2 ขึ้นไป)
AH = 19 ชั่วโมง พาร์คเฮดส์
AH = 41 ชั่วโมงภายนอก ตรวจสอบว่ามีส่วนขยายให้ใช้งานหรือไม่
AH = 42 ชั่วโมงภายนอกอ่านเซกเตอร์จากไดรฟ์
AH = 43 ชั่วโมงภายนอกเขียนภาคส่วนเพื่อขับเคลื่อน
AH = 44 ชม.ภายนอกตรวจสอบภาคส่วน
AH = 45 ชม.ภายนอกล็อก/ปลดล็อกไดรฟ์
AH = 46 ชม.ภายนอกดีดไดรฟ์
AH = 47 ชม.ภายนอกเลื่อนหัวอ่านไดรฟ์ไปยังเซกเตอร์
AH = 48 ชม.ภายนอกอ่านค่าพารามิเตอร์ของไดรฟ์
AH = 49 ชั่วโมงภายนอกตรวจจับการเปลี่ยนแปลงสื่อ
AH = 4Bhภายนอกรับประเภทการจำลองไดรฟ์

หากคอลัมน์ที่สองว่างเปล่า ฟังก์ชันนี้สามารถใช้งานได้ทั้งกับฟลอปปี้ดิสก์และฮาร์ดดิสก์

  • FD: สำหรับฟลอปปี้ดิสก์เท่านั้น
  • HD: สำหรับฮาร์ดดิสก์เท่านั้น
  • PS/2: สำหรับฮาร์ดดิสก์บนระบบ PS/2 เท่านั้น
  • EXT: เป็นส่วนหนึ่งของ ส่วนขยาย INT 13h ซึ่งเขียนขึ้นในช่วงทศวรรษ 1990 เพื่อรองรับฮาร์ดไดรฟ์ที่มีความ จุมากกว่า 8 GB

INT 13h AH=00h : รีเซ็ตระบบดิสก์

พารามิเตอร์
เอเอช 00 น.
ดีแอล ไดรฟ์ (การตั้งค่าบิต 7 หมายถึงการรีเซ็ตทั้งฮาร์ดดิสก์และฟลอปปี้ดิสก์)
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด
เอเอช รหัสส่งคืน

INT 13h AH=01h : รับสถานะการทำงานของไดรฟ์ครั้งล่าสุด

พารามิเตอร์
เอเอช 01:00 น.
ดีแอล ขับ

บิตที่ 7 = 0 สำหรับฟลอปปี้ไดรฟ์ บิตที่ 7 = 1 สำหรับฮาร์ดไดรฟ์

ผลลัพธ์
เอเอช
รหัสส่งคืน
00 น. ความสำเร็จ
01:00 น. คำสั่งไม่ถูกต้อง
02 ชั่วโมง ไม่พบเครื่องหมายที่อยู่
03:00 น. พยายามเขียนข้อมูลลงในดิสก์ที่ป้องกันการเขียน
04 ชั่วโมง ไม่พบภาคส่วน
05:00 น. การรีเซ็ตล้มเหลว
06:00 น. บรรทัดการเปลี่ยนแปลงดิสก์ 'ใช้งานอยู่'
07:00 น. การทำงานของพารามิเตอร์ไดรฟ์ล้มเหลว
08:00 น. DMA โอเวอร์รัน
09:00 น. พยายามทำ DMA ข้ามขอบเขต 64kb
0อาห์ ตรวจพบเซกเตอร์เสีย
0Bh ตรวจพบกระบอกสูบ (แทร็ก) เสีย
0Ch ไม่พบประเภทสื่อ
0Dh จำนวนเซกเตอร์ไม่ถูกต้อง
0Eh ตรวจพบเครื่องหมายที่อยู่ข้อมูลควบคุม
0Fh DMA อยู่นอกช่วง
10 ชั่วโมง ข้อผิดพลาดข้อมูล CRC/ECC
11.00 น. ECC แก้ไขข้อผิดพลาดของข้อมูลแล้ว
20 ชั่วโมง ความล้มเหลวของตัวควบคุม
40 ชั่วโมง จงแสวงหาความล้มเหลว
80 ชั่วโมง ไดรฟ์หมดเวลา สันนิษฐานว่าไม่พร้อมใช้งาน
อ่า ไดรฟ์ยังไม่พร้อมใช้งาน
บีบีเอช ข้อผิดพลาดที่ไม่ระบุสาเหตุ
ซีซีเอช เขียนข้อผิดพลาด
อี0ฮ ข้อผิดพลาดสถานะ
เอฟเอฟเอช การทำงานของเซนเซอร์ล้มเหลว
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด

INT 13h AH=02h : อ่านเซกเตอร์จากไดรฟ์

พารามิเตอร์
เอเอช 02 ชั่วโมง
อัล จำนวนภาคส่วนที่ต้องอ่าน
ซีเอช กระบอกสูบ
ซีแอล ภาคส่วน
ดีเอช ศีรษะ
ดีแอล ขับ
อีเอส:บีเอ็กซ์ ตัวชี้ที่อยู่บัฟเฟอร์
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอช รหัสส่งคืน
อัล จำนวนการอ่านเซกเตอร์จริง

หมายเหตุ

BIOS INT 13h สามารถอ่านเซกเตอร์ได้สูงสุด 18 เซกเตอร์โดยทั่วไป

รีจิสเตอร์ CXประกอบด้วยหมายเลขกระบอกสูบ (10 บิตค่าที่เป็นไปได้คือ 0 ถึง 1023) และหมายเลขเซกเตอร์ (6 บิต ค่าที่เป็นไปได้คือ 1 ถึง 63) หมายเลขบิตของกระบอกสูบและเซกเตอร์มีดังต่อไปนี้:

CX = ---CH--- ---CL--- กระบอกสูบ : 76543210 98 ภาคส่วน : 543210 

ตัวอย่างการแปล

CX := ( ( กระบอกสูบและ255 ) shl 8 ) หรือ( ( กระบอกสูบและ768 ) shr 2 ) หรือเซกเตอร์; กระบอกสูบ:= ( ( CX และ$FF00 ) shr 8 ) หรือ( ( CX และ$C0 ) shl 2 ) เซกเตอร์:= CX และ63 ;

เนื่องจาก IBM PC รุ่นแรกใช้ตัวควบคุม DMA Intel 8237แบบ 16 บิตการถ่ายโอนข้อมูล DMA ที่ใช้ถ่ายโอนข้อมูลไปยังและจากระบบดิสก์จึงไม่สามารถข้ามขอบเขตแอดเดรสทางกายภาพ 64K ได้ BIOS บางเวอร์ชันไม่ได้คำนึงถึงเรื่องนี้ ดังนั้น บัฟเฟอร์ที่ส่งไปยังฟังก์ชันนี้จึงไม่ควรข้ามขอบเขตดังกล่าว ข้อจำกัดนี้ใช้กับแอดเดรสหลังจากคำนวณแอดเดรสจากเซ็กเมนต์และออฟเซ็ตแล้ว ตัวอย่างเช่น การอ่าน 4 เซ็กเมนต์ที่แอดเดรสแบบเซ็กเมนต์0fc0h:0000hจะละเมิดข้อจำกัดนี้ แม้ว่าช่วงของออฟเซ็ตในเซ็กเมนต์จะ0000hเป็น0800hแต่การถ่ายโอนจะเขียนไปยังช่วงแอดเดรส0fc00hถึง10400hซึ่งข้ามขอบเขต 64K ที่10000hข้อจำกัดนี้ใช้กับการขัดจังหวะฟังก์ชัน 03h ในการเขียนเซ็กเมนต์ด้วยเช่นกัน

ฟังก์ชัน 02h ของอินเตอร์รัปต์ 13h สามารถอ่านได้เฉพาะเซกเตอร์ 16,450,560 เซกเตอร์แรกของฮาร์ดไดรฟ์เท่านั้น หากต้องการอ่านเซกเตอร์ที่เกินขีดจำกัด 8 GB ควรใช้ฟังก์ชัน 42h ของ ส่วนขยาย INT 13hหรืออีกทางเลือกหนึ่งคือ อินเตอร์รัปต์ DOS 25h ซึ่งอ่านเซกเตอร์ ภายในพาร์ติชั่น

ตัวอย่างโค้ด

[ ORG 7c00h ] ; โค้ดเริ่มต้นที่ 7c00h xor ax , ax ; ตรวจสอบให้แน่ใจว่า ds ถูกตั้งค่าเป็น 0 mov ds , ax cld ; เริ่มใส่ค่า: mov ah , 2h ; ฟังก์ชัน int13h 2 mov al , 63 ; เราต้องการอ่าน 63 เซกเตอร์mov ch , 0 ; จากกระบอกสูบหมายเลข 0 mov cl , 2 ; เซกเตอร์หมายเลข 2 - เซกเตอร์ที่สอง (เริ่มต้นจาก 1 ไม่ใช่ 0) mov dh , 0 ; หมายเลขหัว 0 xor bx , bx mov es , bx ; es ควรเป็น 0 mov bx , 7e00h ; 512 ไบต์จากที่อยู่ต้นทาง 7c00h int 13h jmp 7e00h ; กระโดดไปยังเซกเตอร์ถัดไป; เพื่อเติมเซกเตอร์นี้และทำให้บูตได้: คูณ510 - ( $ - $$ ) db 0 dw 0AA55h

หลังจากส่วนโค้ดนี้ (ซึ่งไฟล์ asm ควรเริ่มต้นด้วย) คุณสามารถเขียนโค้ดได้ และโค้ดนั้นจะถูกโหลดเข้าสู่หน่วยความจำและประมวลผล

สังเกตว่าเราไม่ได้เปลี่ยนค่า dl (ไดรฟ์) นั่นเป็นเพราะเมื่อคอมพิวเตอร์เริ่มทำงานครั้งแรก ค่า dl จะถูกตั้งค่าเป็นหมายเลขของไดรฟ์ที่บูตขึ้นมา ดังนั้นหากเราต้องการอ่านข้อมูลจากไดรฟ์ที่เราบูตขึ้นมา ก็ไม่จำเป็นต้องเปลี่ยนค่า dl ยกเว้นโปรแกรมจำลองบางตัว เช่นqemuที่ต้องการให้คุณระบุค่า dl เป็นไดรฟ์ที่คุณต้องการอ่านข้อมูล

INT 13h AH=03h : เขียนเซกเตอร์ลงไดรฟ์

พารามิเตอร์
เอเอช 03:00 น.
อัล จำนวนเซกเตอร์ที่จะเขียน
ซีเอช ติดตาม
ซีแอล ภาคส่วน
ดีเอช ศีรษะ
ดีแอล ขับ
อีเอส:บีเอ็กซ์ ตัวชี้ที่อยู่บัฟเฟอร์
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอช รหัสส่งคืน
อัล จำนวนภาคส่วนที่เขียนจริง

INT 13h AH=04h : ตรวจสอบเซกเตอร์จากไดรฟ์

พารามิเตอร์
เอเอช 04 ชั่วโมง
อัล ภาคส่วนที่ต้องตรวจสอบจำนวน
ซีเอช ติดตาม
ซีแอล ภาคส่วน
ดีเอช ศีรษะ
ดีแอล ขับ
อีเอส:บีเอ็กซ์ ตัวชี้ที่อยู่บัฟเฟอร์
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอช รหัสส่งคืน
อัล จำนวนภาคส่วนที่ได้รับการตรวจสอบจริง

INT 13h AH=05h : จัดรูปแบบแทร็ก

พารามิเตอร์
เอเอช 05:00 น.
อัล จำนวนภาคส่วนที่จะจัดรูปแบบ
ซีเอช ติดตาม
ซีแอล ภาคส่วน
ดีเอช ศีรษะ
ดีแอล ขับ
อีเอส:บีเอ็กซ์ ตัวชี้ที่อยู่บัฟเฟอร์
ช่องที่อยู่ขนาด 4 ไบต์(ใช้ได้กับ PC/XT 286, AT, PS/1 และ PS/2)
ไบต์ ความหมาย ค่าที่อนุญาต
1 ติดตาม
2 ศีรษะ
3 ภาคส่วน
4 ไบต์/เซกเตอร์ 0=128, 1-256, 2-512, 3-1024
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอช รหัสส่งคืน

INT 13h AH=06h : จัดรูปแบบแทร็ก ตั้งค่าแฟล็กเซกเตอร์เสีย

พารามิเตอร์
เอเอช 06:00 น.
อัล สลับ
ซีเอช ติดตาม
ซีแอล ภาคส่วน
ดีเอช ศีรษะ
ดีแอล ขับ
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอช รหัสส่งคืน

INT 13h AH=07h : ฟอร์แมตไดรฟ์เริ่มต้นที่แทร็ก

พารามิเตอร์
เอเอช 07:00 น.
อัล สลับ
ซีเอช ติดตาม
ซีแอล ภาคส่วน
ดีเอช ศีรษะ
ดีแอล ขับ
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอช รหัสส่งคืน

INT 13h AH=08h : อ่านพารามิเตอร์ไดรฟ์

พารามิเตอร์
ทะเบียน
เอเอช 08h = หมายเลขฟังก์ชันสำหรับ read_drive_parameters
ดีแอล ดัชนีไดรฟ์ (เช่น ฮาร์ดไดรฟ์ตัวแรก = 80 ชั่วโมง)
ES:DI [ 7 ]ตั้งค่าเป็น 0000h:0000h เพื่อแก้ไขปัญหา BIOS ที่มีข้อผิดพลาดบางอย่าง
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอชรหัสส่งคืน
ดีแอล จำนวนฮาร์ดดิสก์ไดรฟ์
DH [ 7 ]ดัชนีสุดท้ายเชิงตรรกะของหัว = จำนวน - 1 (เนื่องจากดัชนีเริ่มต้นที่ 0)
เอ็กซ์ซี [7:6] [15:8] [ 7 ]ดัชนีสุดท้ายเชิงตรรกะของกระบอกสูบ = จำนวน - 1 (เนื่องจากดัชนีเริ่มต้นด้วย 0 )

[5:0] [ 7 ]ดัชนีสุดท้ายเชิงตรรกะของเซกเตอร์ต่อแทร็ก = จำนวน (เนื่องจากดัชนีเริ่มต้นด้วย 1)

BL [ 7 ]ประเภทไดรฟ์ (เฉพาะฟลอปปี้ดิสก์ AT/PS2)
ES:DI [ 7 ]ตัวชี้ไปยังตารางพารามิเตอร์ไดรฟ์ (สำหรับฟลอปปี้ดิสก์เท่านั้น)

หมายเหตุ

  • ค่าตรรกะของฟังก์ชัน 08h อาจ/ควรแตกต่างจากค่า CHS ทางกายภาพของฟังก์ชัน 48h
  • รีจิสเตอร์ผลลัพธ์ CX ประกอบด้วยค่าทั้งกระบอกสูบและเซกเตอร์/แทร็ก โปรดดูหมายเหตุของฟังก์ชัน 02h

INT 13h AH=09h : เริ่มต้นคุณลักษณะของคู่ไดรฟ์

พารามิเตอร์
เอเอช 09:00 น.
ดีแอล ขับ
ผลลัพธ์
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอช รหัสส่งคืน

INT 13h AH=0Ah: อ่านเซกเตอร์ยาวจากไดรฟ์

ความแตกต่างเพียงอย่างเดียวระหว่างฟังก์ชันนี้กับฟังก์ชัน 02h (ดูด้านบน) คือ ฟังก์ชัน 0Ah อ่านข้อมูล 516 ไบต์ต่อเซกเตอร์ แทนที่จะเป็นเพียง 512 ไบต์ 4 ไบต์สุดท้ายประกอบด้วยรหัสแก้ไขข้อผิดพลาด (ECC) ซึ่งเป็นผลรวมตรวจสอบของข้อมูลในเซกเตอร์

INT 13h AH=41h : ตรวจสอบว่ามีส่วนขยายอยู่หรือไม่

พารามิเตอร์
ทะเบียน คำอธิบาย
เอเอช 41h = หมายเลขฟังก์ชันสำหรับการตรวจสอบส่วนขยาย[ 8 ]
ดีแอล ดัชนีไดรฟ์ (เช่น ฮาร์ดไดรฟ์ตัวแรก = 80 ชั่วโมง)
บีเอ็กซ์55Ah
ผลลัพธ์
ทะเบียน คำอธิบาย
ซีเอฟ ตั้งค่าเป็น "ไม่มีอยู่" ล้างค่าหากมีอยู่
เอเอช รหัสข้อผิดพลาดหรือหมายเลขเวอร์ชันหลัก
บีเอ็กซ์เอเอ55เอช
เอ็กซ์ซี บิตมาสก์ที่รองรับอินเทอร์เฟซ:
  • 1 – การเข้าถึงอุปกรณ์โดยใช้โครงสร้างแพ็กเก็ต
  • 2 – การล็อกและการดีดไดรฟ์
  • 4 – การรองรับดิสก์ไดรฟ์ขั้นสูง (EDD)

INT 13h AH=42h : การอ่านเซกเตอร์เพิ่มเติมจากไดรฟ์

พารามิเตอร์
ทะเบียน คำอธิบาย
เอเอช 42h = หมายเลขฟังก์ชันสำหรับการอ่านแบบขยาย
ดีแอล ดัชนีไดรฟ์ (เช่น ฮาร์ดไดรฟ์ตัวแรก = 80 ชั่วโมง)
DS:SI segment:offset คือตัวชี้ไปยัง DAP ดูรายละเอียดด้านล่าง
DAP: แพ็กเก็ตที่อยู่ดิสก์
ช่วงออฟเซ็ตขนาด คำอธิบาย
00 น.1 ไบต์ขนาดของ DAP (ตั้งค่านี้เป็น 10 ชั่วโมง)
01:00 น.1 ไบต์ไม่ได้ใช้งาน ควรเป็นศูนย์
02.00-03.00 น.2 ไบต์ จำนวนเซกเตอร์ที่จะอ่าน (BIOS ของ Phoenix บางรุ่นจำกัดจำนวนเซกเตอร์สูงสุดไว้ที่ 127 เซกเตอร์)
04.00-07.00 น.4 ไบต์ segment:offset คือตัวชี้ไปยังบัฟเฟอร์หน่วยความจำที่จะใช้ในการถ่ายโอนเซกเตอร์ (โปรดทราบว่า x86 เป็นแบบ little-endian : หากประกาศ segment และ offset แยกกัน จะต้องประกาศ offset ก่อน segment)
08:00 น.8 ไบต์ หมายเลขสัมบูรณ์ของจุดเริ่มต้นของเซกเตอร์ที่จะอ่าน (เซกเตอร์แรกของไดรฟ์มีหมายเลข 0) โดยใช้การกำหนดแอดเดรสบล็อกเชิงตรรกะ (โปรดทราบว่าครึ่งล่างมาก่อนครึ่งบน) [ 9 ]
ผลลัพธ์
ทะเบียน คำอธิบาย
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอชรหัสส่งคืน

ดังที่ได้กล่าวไว้แล้วเกี่ยวกับ int 13h AH=02h ต้องระมัดระวังเพื่อให้แน่ใจว่าบัฟเฟอร์ทั้งหมดอยู่ภายในเซ็กเมนต์ที่กำหนด กล่าวคือ( BX + ขนาดของบัฟเฟอร์ ) <= 10000h

INT 13h AH=43h : เซกเตอร์การเขียนแบบขยายไปยังไดรฟ์

พารามิเตอร์
ทะเบียน คำอธิบาย
เอเอช 43h = หมายเลขฟังก์ชันสำหรับการเขียนแบบขยาย
อัล
  • บิต 0 = 0: ปิดการตรวจสอบการเขียน
  • บิต 0 = 1: ตรวจสอบการเขียนแบบเปิด
  • บิต 1-7: สงวนไว้ ตั้งค่าเป็น 0
ดีแอล ดัชนีไดรฟ์ (เช่น ฮาร์ดไดรฟ์ตัวแรก = 80 ชั่วโมง)
DS:SI ส่วน: ตัวชี้ออฟเซ็ตไปยัง DAP
ผลลัพธ์
ทะเบียน คำอธิบาย
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอชรหัสส่งคืน

INT 13h AH=48h : พารามิเตอร์ไดรฟ์อ่านแบบขยาย

พารามิเตอร์
ทะเบียน คำอธิบาย
เอเอช 48h = หมายเลขฟังก์ชันสำหรับ extended_read_drive_parameters
ดีแอล ดัชนีไดรฟ์ (เช่น ฮาร์ดไดรฟ์ตัวแรก = 80 ชั่วโมง)
DS:SI ส่วน: ตัวชี้ออฟเซ็ตไปยังบัฟเฟอร์ผลลัพธ์ ดูด้านล่าง
บัฟเฟอร์ผลลัพธ์
ช่วงออฟเซ็ตขนาด คำอธิบาย
00.00-01.00 น.2 ไบต์ขนาดของบัฟเฟอร์ผลลัพธ์ (ตั้งค่านี้เป็น 1Eh)
02.00-03.00 น.2 ไบต์ธงข้อมูล
04.00-07.00 น.4 ไบต์ จำนวนกระบอกสูบจริง = ดัชนีสุดท้าย + 1 (เนื่องจากดัชนีเริ่มต้นที่ 0)
08:00 น.4 ไบต์ จำนวนหัวจริง = ดัชนีสุดท้าย + 1 (เนื่องจากดัชนีเริ่มต้นที่ 0)
0Ch..0Fh4 ไบต์ จำนวนเซกเตอร์ต่อแทร็กจริง = ดัชนีสุดท้าย(เนื่องจากดัชนีเริ่มต้นด้วย 1)
10.00-17.00 น.8 ไบต์ จำนวนภาคส่วนทั้งหมด = ดัชนีสุดท้าย + 1 (เนื่องจากดัชนีเริ่มต้นที่ 0)
18.00-19.00 น.2 ไบต์ไบต์ต่อเซกเตอร์
1Ah..1Dh4 ไบต์ ตัวชี้เสริมไปยังพารามิเตอร์การกำหนดค่า Enhanced Disk Drive (EDD) ซึ่งอาจใช้สำหรับการเรียกใช้ส่วนขยาย 13h ในภายหลัง (หากรองรับ)
ผลลัพธ์
ทะเบียน คำอธิบาย
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
เอเอชรหัสส่งคืน

หมายเหตุ

ค่าทางกายภาพของฟังก์ชัน 48h ในระบบ CHS อาจ/ควรแตกต่างจากค่าเชิงตรรกะของฟังก์ชัน 08h

INT 13h AH=4Bh: รับประเภทการจำลองไดรฟ์

พารามิเตอร์
ผู้ลงทะเบียน คำอธิบาย
เอเอช 4Bh = รับประเภทการจำลองไดรฟ์
อัล 01
ดีแอล ดัชนีไดรฟ์ (เช่น ฮาร์ดไดรฟ์ตัวแรก = 80 ชั่วโมง)
DS:SI ชี้ไปยังโครงสร้างว่างสำหรับผลลัพธ์ ต้องมีขนาด 13h
ผลลัพธ์
ทะเบียน คำอธิบาย
ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด ล้างค่าหากไม่มีข้อผิดพลาด
ขวาน รหัสส่งคืน
DS:SI ชี้ไปยังโครงสร้างข้อกำหนด
โครงสร้างข้อกำหนด
ออฟเซ็ต ขนาด (ไบต์) คำอธิบาย
00 น. 1 ขนาดของแพ็กเก็ตเป็นไบต์ (13h)
01:00 น. 1 ประเภทสื่อบูต :
บิต
0 - 3 0000b: ไม่มีการจำลอง

0001b: ฟลอปปี้ดิสก์ 1.2M

0010b: ฟลอปปี้ดิสก์ขนาด 1.44M

0011b: ฟลอปปี้ดิสก์ 2.88M

0100b: ฮาร์ดดิสก์

4-5 ที่สงวนไว้
6 รูปภาพประกอบด้วยไดรเวอร์ ATAPI
7 รูปภาพประกอบด้วยไดรเวอร์ SCSI
02 ชั่วโมง 1 หมายเลขไดรฟ์ (ดัชนีไดรฟ์)
03:00 น. 1 หมายเลขตัวควบคุมซีดีรอม
04 ชั่วโมง 4 ที่อยู่บล็อกเชิงตรรกะ (LBA) ของอิมเมจดิสก์ที่จะจำลอง
08:00 น. 2 ข้อมูลจำเพาะของอุปกรณ์:

บิต 0: ไดรฟ์เป็นแบบสเลฟแทนที่จะเป็นแบบมาสเตอร์

บิต 7-0: LUN และ PUN

0อาห์ 2 ส่วนของบัฟเฟอร์ขนาด 3K สำหรับแคชข้อมูลที่อ่านจากซีดีรอม
0Ch 2 ส่วนภาพบูตเริ่มต้นจากส่วน 7c0h
0Eh 2 จำนวนเซกเตอร์ (ขนาด 512 ไบต์) ที่จะโหลด
10 ชั่วโมง 1 จำนวนกระบอกสูบ ไบต์ต่ำ (จาก int 8h)
11.00 น. 1 จำนวนเซกเตอร์ (จาก int 8h)
12 ชั่วโมง 1 จำนวนคน (นับจากเวลา 8 ชั่วโมง)

ดูเพิ่มเติม

  • ส่วนขยาย BIOS Interrupt 13h ถูกเก็บถาวรเมื่อวันที่ 6 กุมภาพันธ์ 2006 ที่Wayback Machine
  • รายการขัดจังหวะที่ครอบคลุมของราล์ฟ บราวน์
  • Norton Guide เกี่ยวกับ int 13h, ah = 00h .. 1ah เก็บถาวรเมื่อ 2008-06-27 ที่Wayback Machine
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=INT_13H&oldid=1359173253#EDD "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ INT 13H

INT 13h เป็นตัวย่อของ BIOS interrupt call 13 hex ซึ่ง เป็นเวกเตอร์อินเตอร์รัปต์ ลำดับที่ 20 ในระบบคอมพิวเตอร์แบบ x86 (ที่พัฒนามาจาก IBM PC) โดยปกติ BIOS จะตั้งค่า...

ภาพรวม

ภายใต้ ระบบปฏิบัติการ แบบเรียลโหมด เช่น DOS การเรียกใช้ INT 13h จะกระโดดเข้าไปในโค้ด ROM-BIOS ของคอมพิวเตอร์เพื่อให้ บริการดิสก์ระดับต่ำ ซึ่งจะดำเนินการอ่านหรือเขียนข้อมูลลงดิสก์ตามเซกเตอร์ทางกายภาพสำหรับโปรแกรม ใน DOS นั้น INT 13h...

รายชื่อบริการ INT 13h

หากคอลัมน์ที่สองว่างเปล่า ฟังก์ชันนี้สามารถใช้งานได้ทั้งกับฟลอปปี้ดิสก์และฮาร์ดดิสก์

INT 13h AH=00h : รีเซ็ตระบบดิสก์

พารามิเตอร์ เอเอช 00 น. ดีแอล ไดรฟ์ (การตั้งค่าบิต 7 หมายถึงการรีเซ็ตทั้งฮาร์ดดิสก์และฟลอปปี้ดิสก์) ผลลัพธ์ ซีเอฟ ตั้งค่าเมื่อเกิดข้อผิดพลาด เอเอช รหัสส่งคืน