![]()
อินเทอร์รัพท์ DOS Interrupt
| ![]() |
ปรับปรุง : 2562-02-01 (ปรับ template) |
|
Digital logic | OS | คำสั่งดอส | Batch | Debug | Assembly | GWBasic | Docker | |
อินเทอร์รัพท์ (Interrupt) หมายถึง อะไร
ทางเข้าโปรแกรมย่อยที่ BIOS หรือ DOS มีไว้บริการ เป็นการเข้าไปขัดจังหวะ เพื่อขอกระทำการบางอย่าง เช่น ขอพิมพ์ ขออ่านข้อมูลบางอย่าง เป็นต้น ผู้รู้บางท่านกล่าวว่า interrupt เหมือน call function ในภาษาคอมพิวเตอร์ คือ เข้าไปเรียกโปรแกรมบางอย่างมาทำงานจนเสร็จ แล้วย้อนกลับมาทำบรรทัดต่อไป อินเทอร์รัพท์เป็นกระบวนการในการส่งสัญญาณบอกให้ซีพียูรับรู้แล้วหยุดงานที่ทำอยู่ และหันมาตอบสนองต่ออินเทอร์รัพที่ร้องขอ เป็นวิธีที่เหมาะสมที่สุด ในการติดต่อระหว่างอุปกรณ์และซีพียู มีลักษณะคล้ายการเรียกใช้ subroutine Interrupt List (http://www-2.cs.cmu.edu #A .. #F) The original interrupt list is from Ralph Brown, but I couldn't handle it on my computer (and I have a good one). This is why I adapted it. The interrupt page I have now has 85 files describing the interrupts, with in each file about 100 little (original) files. This has some advantages, like the saved disk space, but also disadvantages, like the longer waiting before getting a interrupt. Something positive about this is: when you once showed one page, you have 100 interrupts in your cache and when you search a lot of interrupts, you can easely scroll forward to the next interrupt. อินเทอร์รัพท์ที่น่าสนใจ (Interested Interrupt) อินเทอร์รัพท์หมายเลข 0H : พิมพ์ข้อความ “Divide Overflow” และหยุดการทำงาน อินเทอร์รัพท์หมายเลข 10H บริการที่ 0 : กำหนดสกรีนโหมด (Set Screen Mode) อินเทอร์รัพท์หมายเลข 10H บริการที่ 1 : กำหนดชนิดของเคอร์เซอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ 6 : เลื่อนแอ็กทีฟเพจขึ้น [ตัวอย่าง] อินเทอร์รัพท์หมายเลข 20H : เทอร์มิเนตโปรแกรม อินเทอร์รัพท์หมายเลข 21H บริการที่ 0 : เทอร์มิเนตโปรแกรม อินเทอร์รัพท์หมายเลข 21H บริการที่ 2 : ส่งอักขระไปยังจอภาพ อินเทอร์รัพท์หมายเลข 21H บริการที่ 8 : รับข้อมูลจากคอนโทรลโดยไม่แสดงบนจอภาพให้เห็น แต่เพิ่มการตรวจสอบการกด <Ctrl-C> หรือ <Ctrl-Break> อินเทอร์รัพท์หมายเลข 21H บริการที่ 9 : พิมพ์สตริงก์ อินเทอร์รัพท์หมายเลข 21H บริการที่ 4CH : เทอร์มิเนตโปรแกรม |
:: สร้างโปรแกรมขนาด 4 byte ชื่อ test.com เพื่อหยุดการทำงานของโปรแกรม
C:\>debug test.com -a 11BD:0100 mov ah,0 11BD:0102 int 21 11BD:0104 -rcx CX 0000 :4 -w Writing 00004 bytes -q C:\>test.com C:\> |
// ex1 : รับค่าจากแป้นพิมพ์ส่งให้ errorlevel ใน DOS mov ah,8 int 21 mov ah,4c int 21 // ex2 : รับค่าจากแป้นพิมพ์ แล้วแสดงผล mov ah,8 int 21 mov ah,2 mov dl,al int 21 mov ah,4c int 21 // ex3 : สั่ง Clear screen โดยกำหนด mode ของจอภาพ mov ah,0 mov al,2 int 10 mov ah,0 int 21 // ex4 : กำหนด cursor ให้เป็นแถบทึบ mov ah,1 mov ch,0 mov cl,7 int 10 mov ah,0 int 21 // ex5 : เปลี่ยน Mode การแสดงผล ด้วย int 10h mov ah,0 mov al,12 int 10h mov ah,4c int 21h | // ex6 : พิมพ์อักษร AB และ ab คนละบรรทัด mov ah,2 mov dl,41 int 21 mov ah,2 mov dl,42 int 21 mov ah,2 mov dl,0d int 21 mov ah,2 mov dl,0a int 21 mov ah,2 mov dl,61 int 21 mov ah,2 mov dl,62 int 21 mov ah,0 int 21 // ex7 : พิมพ์อักษร ABCDE โดยกำหนด ah = 2 mov ah,2 mov dl,41 int 21 mov dl,42 int 21 mov dl,43 int 21 mov dl,44 int 21 mov dl,45 int 21 mov ah,0 int 21 |
Download interrupt listing from http://www-2.cs.cmu.edu
# http://www.cs.cmu.edu/~ralf/interrupt-list/inter61a.zip # http://www.cs.cmu.edu/~ralf/interrupt-list/inter61b.zip # http://www.cs.cmu.edu/~ralf/interrupt-list/inter61c.zip # http://www.cs.cmu.edu/~ralf/interrupt-list/inter61d.zip # http://www.cs.cmu.edu/~ralf/interrupt-list/inter61e.zip # http://www.cs.cmu.edu/~ralf/interrupt-list/inter61f.zip # http://www.cs.cmu.edu/~ralf/interrupt-list/faq.lst # http://www.cs.cmu.edu/~ralf/pub-files/dvint43.zip | ข้อมูลด้านล่างนี้ เรียบเรียงโดย
สุรณัฐ เกตุมณี, ฆนากร อินนั่งแท่น, เกียรติศักดิ์ จันทน์เกษร, วัชรา ผู้ผ่อง, ธิดารัตน์ มหายศ, เทวพงศ์ วงค์เขื่อนแก้ว, ฤทธิพงศ์ วงค์เขื่อนแก้ว, กัลยาณี รุ่งวรรธนะ, อรวรรณ เนตรประสาท, รัมม์ คำแก้ว |
ไบออสและดอสอินเทอร์รัพท์
อินเทอร์รัพท์หมายเลข 0 : พิมพ์ข้อความ “Divide Overflow” และหยุดการเอกซีคิวต์โปรแกรม ทำให้มีการหารด้วย 0 เกิดขึ้น อินเทอร์รัพท์หมายเลข 1 : การเอกซีคิวต์ทีละคำสั่ง (Single Step) อินเทอร์รัพท์นี้มีไว้สำหรับโปรแกรมประเภทดีบักเกอร์โดยเฉพาะ การเรียกใช้อินเทอร์รัพท์นี้ในระหว่าง การเอกซีคิวต์โปแกรมจะทำให้เกิดการเอกซีคิวต์ทีละคำสั่ง อินเทอร์รัพท์หมายเลข 2 : นอนมาส์อินเทอร์รัพท์ (Nonmaskble Interrupt,NMI) อินเทอร์รัพท์นี้เป็นฮาร์ดแวร์อินเทอร์รัพท์ อินเทอร์รัพท์นี้ไม่ถูกควบคุมด้วยคำสั่ง STI และ CLI อินเทอร์รัพท์นี้จึงถูกเอกซีคิวต์เสนอเมื่อมันถูกเรียกใช้ อินเทอร์รัพท์หมายเลข 3 : จุดหยุดการเอกซีคิวต์ (Break point) อินเทอร์รัพท์นี้เป็นอินเทอร์รัพท์หนึ่งที่มีไว้สำหรับโปรแกรมประเภทดีบักเกอร์โดย เฉพาะหรือที่เรียกว่า ดีบักเกอร์อินเทอร์รัพท์ อินเทอร์รัพท์นี้ทำให้เราสามารถเอกซีคิวตืทุกคำสั่ง ที่อยู่ก่อนหน้าแอสเดรสเฉพาะแอสเดรสหนึ่ง ๆ ได้ และเมื่อถึงแอสเดรสนี้แล้วให้หยุดการเอกซีคิวต์ ดีบักเองก็มีการใช้อินเทอร์รัพท์นี้ในคำสั่ง GO โดยแทรกคำสั่ง INT 3 ไว้ที่แอส เดรสนั้นก่อนที่จะส่งความควบคุมไปยังโปรแกรมและเมื่อโปรแกรมถูกเอกซีคิวต์มาพบกับคำสั่ง INT 3 แล้วการควบคุมก็จะถูกส่งกลับคืนมายังดีบักอีกครั้งหนึ่ง อินเทอร์รัพท์หมายเลข 4 : โอเวอร์โฟลว์ (Overflow) อินเทอร์รัพท์นี้คล้ายกับอินเทอร์รัพท์หมายเลข 0 ตรงที่มันจะถูกเรียกใช้เมื่อเกิดเหตุการณ์ที่ไม่ปกติขึ้น ซึ่งในกรณีนี้ก็คือ การเกิดโอเวอร์โฟลว์ โดยปกติแล้ว อินเทอร์รัพท์นี้ไม่ได้ทำสั่งใดๆและไบออสก็เพียงแต่รีเทิร์นการควบคุบกลับมาเท่านั้น อินเทอร์รัพท์หมายเลข 5 : พิมพ์หน้าจอ (Print Screen) อินเทอร์รัพท์นี้เป็นอินเทอร์รัพท์ที่ถูกเรียกใช้เมื่อมีการกดปุ่ม <Print Screen> บนคีย์บอร์ดมีหน้าที่ในการพิมพ์ข้อมูลต่างๆที่ปรากฏ บนหน้าจอออกทางพรินเตอร์ การใช้คำสั่ง INT5 ในโปแกรมจึงให้ผลเหมือนการกดปุ่ม <Print Screen> บนคีย์บอร์ด ไม่ต้องผ่านค่า อาร์กิวเมนต์ใด ๆ ไปให้กับอินเทอร์รัพท์นี้ อินเทอร์รัพท์หมายเลข 6 และ 7 : สงวนไว้ (Reserved) อินเทอร์รัพท์หมายเลข 8 : วันเวลา (Time Of Day) อินเทอร์รัพท์นี้เป็นอีกอินเทอร์รัพท์หนึ่งที่เป็นฮาร์ดแวร์อินเทอร์รัพท์ ถูกเรียกใช้เพื่อการอัปเดตเวลาภายในเครื่องที่เก็บไว้ในพื้นที่ของข้อมูลไบออส ซึ่งใน 1 วินาทีเดิน 18.5 ครั้ง นอกจากนี้ยังอัปเดตวันที่ให้ถูกต้องอีกด้วย อินเทอร์รัพท์นี้มีการเรียกใช้อินเทอร์รัพท์หมายเลข 1CH ขึ้นมาทำงานด้วย ดังนั้น หากเราต้องการอินเตอร์เซปไทเมอร์เพื่อทำบางสิ่งบางอย่าง 18.2 ครั้งใน 1 วินาที่แล้ว จึงเป็นการดีกว่าที่จะเลือกอินเตอร์เซปอินเทอร์รัพท์หมายเลข 1CH แทนที่จะอินเตอร์เซปอินเทอร์รัพท์นี้ อินเทอร์รัพท์หมายเลข 9 : คีย์บอร์ด (Keyboard) อินเทอร์รัพท์นี้เป็นอีกอินเทอร์รัพท์หนึ่งที่เป็นฮาร์ดแวร์อินเทอร์รัพท์ที่ถูก อินเตอร์เซปได้ ด้วยโปรแกรมประเภทฝังตัวในหน่วยความจำ (terminate and stay resident program, TSR) อินเทอร์รัพท์หมายเลข 0AH : สงวนไว้ (Reserved) อินเทอร์รัพท์หมายเลข 0BH - 0FH : อินเตอร์รัพท์เหล่านี้ชี้ไปยังรูทีนของไบออสที่ชื่อ D_EOI (BIOS’ end of interrupt routine) มีหน้าที่รีเซตและรีเทิร์นอินเทอร์รัพท์แฮนเดลอร์ (interrupt handler) ที่พอร์ต 20H |
อินเทอร์รัพท์หมายเลข 10H บริการที่ 0 : กำหนดสกรีนโหมด (Set Screen Mode) อินพุต AH = 0 AL = โหมด
อินเทอร์รัพท์หมายเลข 10H บริการที่ 1 : กำหนดชนิดของเคอร์เซอร์ อินพุต AH = 1 CH = เส้นเริ่มต้นของเคอร์เซอร์ CL = เส้นสุดท้ายของเคอร์เซอร์ เอาต์พุต เคอร์เซอร์ขนาดใหม่ตามที่กำหนด อินเทอร์รัพท์หมายเลข 10H บริการที่ 2 : กำหนดตำแหน่งของเคอร์เซอร์ อินพุต AH = 2 DH,Dl = แถว,คอลัมน์ BH = หมายเลขหน้า อินเทอร์รัพท์หมายเลข 10H บริการที่ 3 : หาตำแหน่งคอร์เซอร์ อินพุต AH = 3 BH = หมายเลขหน้า เอาต์พุต DH,DL = แถว,คอลัมน์ของเคอร์เซอร์ CH,CL = ขนาดปัจจุบันของเคอร์เซอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ 4 : อ่านตำแหน่งของไลต์เพน อินพุต AH = 4 เอาต์พุต AH = 0 --> ไม่มีการกดสวิตช์บนไลต์เพน AL = 1 --> DH,DL = แถว,คอลัมน์ของตำแหน่งที่ไลต์เพนอยู่ CH เป็นราสเตอร์ไลน์ (แนวดิ่ง)มีค่า 0 ถึง 199 BX เป็นพิกเซลคอลัมน์ (แนวราบ) มีค่า 0 ถึง 319,639 อินเทอร์รัพท์หมายเลข 10H บริการที่ 5 : กำหนดแอ็กทีฟเพจ อินพุต AH = 5 AL = 0 - 7(สกรีนโหมด 0,1) และ0 - 3(สกรีนโหมด 2,3) เอาต์พุต แอ็กทีฟเพจเปลี่ยนไปตามที่กำหนด อินเทอร์รัพท์หมายเลข 10H บริการที่ 6 : เลื่อนแอ็กทีฟเพจขึ้น อินพุต AH = 6 AL = จำนวนบรรทัดว่างที่ส่วนล่างของจอภาพ (0 --> เลื่อนทั้งหน้าจอ) CH,CL = แถว,คอลัมน์ของจุดมุมบนซ้ายของพื้นที่ที่จะเลื่อน DH,DL = แถว,คอลัมน์ของจุดมุมล่างขวาของพื้นที่ที่จะเลื่อน BH = แอตตริบิวต์ของบรรทัดว่าง สำหรับกำหนดสี เช่น MOV BH,71H โดยสีพื้นคือเลข 7 และสีตัวอักษรคือเลข 1 0=ดำ 1=น้ำเงิน 2=เขียว 3=ฟ้า 4=แดง 5=ม่วง 6=ทอง 7=เทา เอาต์พุต แอกทีฟเพจเลื่อนขึ้นไปตามที่กำหนด อินเทอร์รัพท์หมายเลข 10H บริการที่ 7 : เลื่อนแอ็กทีฟเพจลง อินพุต AH = 7 AL = จำนวนบรรทัดว่างที่ส่วนล่างของจอภาพ (0 --> เลื่อนทั้งหน้าจอ) CH,CL = แถว,คอลัมน์ของจุดมุมบนซ้ายของพื้นที่ที่จะเลื่อน DH,DL = แถว,คอลัมน์ของจุดมุมล่างขวาของพื้นที่ที่จะเลื่อน BH = แอตตริบิวต์ของบรรทัดว่าง เอาต์พุต แอกทีฟเพจเลื่อนลงไปตามที่กำหนด อินเทอร์รัพท์หมายเลข 10H บริการที่ 8 : อ่านแอตตริบิวต์และรหัสแอสกีของอักขระที่อยู่ที่ตำแหน่งของเคอร์เซอร์ อินพุต AH = 8 BH = หมายเลขหน้า เอาต์พุต AL = รหัสแอสกีของอักขระที่อยู่ที่ตำแหน่งของเคอร์เซอร์ AH = แอตตริบิวต์ของอักขระที่อยู่ที่ตำแหน่งของเคอร์เซอร์ (เฉพาะแอลฟานัมเบอริกส์เท่านั้น) อินเทอร์รัพท์หมายเลข 10H บริการที่ 9 : แอตตริบิวต์และอักขระที่ตำแหน่งของเคอร์เซอร์ อินพุต AH = 9 AL = รหัสแอสกีของอักขระที่จะเขียน BH = หมายเลขหน้า BL = แอตตริบิวต์ (ในเท็กโหมด) ค่าสี (ในกราฟโหมด) CX = จำนวนอักขระที่จะเขียน เอาต์พุต อักขระถูกเขียนบนจอภาพที่ตำแหน่งเคอร์เซอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ A : เขียนเฉพาะ อักขระที่ตำแหน่งเคอร์เซอร์ อินพุต AH = 0AH AL = รหัสแอสกีของอักขระที่จะเขียน BH = หมายเลขหน้า CX = จำนวนอักขระที่จะเขียน เอาต์พุต อักขระถูกเขียนบนจอภาพที่ตำแหน่งเคอร์เซอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ B : กำหนดพาเลตต์ของสี อินพุต AH = 11 BH = หมายเลขพาเลตต์ของสี BH = 0 --> สีพื้น BH = 1 --> หมายเลขพาเลตต์ของสีโดย 0 = เขียว/แดง/เหลือง 1 = น้ำเงินแกมเขียว/ม่วง/ขาว อินเทอร์รัพท์หมายเลข 10H บริการที่ C : เขียนจุด อินพุต AH = 12 AL = ค่าสี (0 ถึง 3) CX = หมายเลขคอลัมน์ของจุดที่จะเขียน (0 ถึง 319,639) DX = หมายเลขแถวของจุดที่จะเขียน (0 ถึง 199) ข้อสังเกต ถ้าบิตที่ 7 ของAL เป็น 1 ค่าสีจะถูกกระทำทางบิตแบบ XORed กับค่าสีปัจจุบันของจุดนั้น อินเทอร์รัพท์หมายเลข 10H บริการที่ D : อ่านจุด อินพุต AH = 13 CX = หมายเลขคอลัมน์ของจุดที่จะเขียน (0 ถึง 319,639) DX = หมายเลขแถวของจุดที่จะเขียน (0 ถึง 199) เอาต์พุต AL = ค่าสี (0 ถึง 3) ข้อสังเกต ถ้าบิตที่ 7 ของAL เป็น 1 ค่าสีจะถูกกระทำทางบิตแบบ XORed กับค่าสีปัจจุบันของจุดนั้น อินเทอร์รัพท์หมายเลข 10H บริการที่ E : เขียนแบบเทเลไทป์บนแอ็กทีฟเพจ อินพุต AL = รหัสแอสกีของอักขระที่จะเขียน BL = โหมดปัจจุบัน(ดู INT 10H บริการที่ 0) BH = แอก็กทีฟเพจ อินเทอร์รัพท์หมายเลข 10H บริการที่ FH : กำหนดพาเลตต์รีจิสเตอร์ ตาราง ก.1 ตารางแสดงค่าสีของดีฟอลต์พาเลตต์ (0 ถึง 15) ใน EGV
อินเทอร์รัพท์หมายเลข 10H บริการที่ 10H ฟังก์ชั่นที่ 0 : กำหนดพาเลตต์รีจิสเตอร์ (ทีละตัว) อินพุต AH = 10H AL = 0 BL = พาเลตต์รีจิสเตอร์ที่จะกำหนด (0 ถึง 15) BH = ค่าที่จะให้แก่พาเลตต์รีจิสเตอร์ (0 ถึง 63) อินเทอร์รัพท์หมายเลข 10H บริการที่ 10H ฟังก์ชั่นที่ 1 : กำหนดโอเวอร์สแกน (บอร์เดอร์) รีจิสเตอร ์ อินพุต AH = 10H AL = 1 BH = ค่าที่กำหนด (0 ถึง 63) อินเทอร์รัพท์หมายเลข 10H บริการที่ 10H ฟังก์ชั่นที่ 2 : กำหนดพาเลตต์รีจิสเตอร์ (ทุกตัว) อินพุต AH = 10H AL = 1 ES:BX = แอดเดรสของตารางขนาด 17 ไบต์ที่เก็บผลการเลือกค่าสี ไบต์ที่ 0 ถึง 15 เก็บผลการเลือกค่าสีสำหรับพาเลตต์รีจิสเตอร์ตัวที่ 0 ถึง 15 ไบต์ที่ 16 เก็บค่าสีใหม่ของโอเวอร์สแกน (บอร์เดอร์) อินเทอร์รัพท์หมายเลข 10H บริการที่ 10H ฟังก์ชั่นที่ 7 : อ่านพาเลตต์รีจิสเตอร์ (ทีละตัว) อินพุต AH = 10H AL = 7 BL = พาเลตต์รีจิสเตอร์ที่จะอ่าน เอาต์พุต BH = ค่าในพาเลตต์รีจิสเตอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ 10H ฟังก์ชั่นที่ 8 : อ่านโอเวอร์สแกน (บอร์เดอร์) รีจิสเตอร์ อินพุต AH = 10H AL = 8 เอาต์พุต BH = ค่าในโอเวอร์สแกน (บอร์เดอร์) รีจิสเตอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ 10H ฟังก์ชั่นที่ 10H : กำหนด DAC รีจิสเตอร์ อินพุต AH = 10H AL = 10H BX = รีจิสเตอร์ที่กำหนด CH = ความเข้มของสีเขียว CL = ความเข้มของสีน้ำเงิน DH = ความเข้มของสีแดง อินเทอร์รัพท์หมายเลข 10H บริการที่ 10H ฟังก์ชั่นที่ 12H : กำหนด DAC รีจิสเตอร ์ อินพุต AH = 10H AL = 10H BX = รีจิสเตอร์แรกที่กำหนด (0 ถึง 255) CX = จำนวนรีจิสเตอร์ที่กำหนด (1 ถึง 256) ES:DX = แอสเดรสของตารางความเข้มสีโดยที่ DAC รีจิสเตอร์แต่ละตัวใช้ 3 ไบต์ (ใช้ แต่ 6 บิตล่างของแต่ละไบต์) ตารางจะกำหนดในลักษณะแดง เขียว น้ำเงิน แดง เขียว น้ำเงิน.... อินเทอร์รัพท์หมายเลข 10H บริการที่10H ฟังก์ชั่นที่ 13H : เลือกโหมดของหน้าสี อินพุต AH = 10H AL = 13H BL = 0 เลือกโหมดของหน้าสี BH = 0 เลือก 4 DAC เพจรีจิสเตอร์จาก 64 รีจิสเตอร์ BH = 1 เลือก 16 DAC เพจรีจิสเตอร์จาก 16 รีจิสเตอร์ BL = 1 เลือกแอ็กทีฟคัลเลอร์เพจ สำหรับโหมดที่มีเพียง 4 เพจ BH = 0 เลือกบล็อก 1 ของ 64 DAC เพจรีจิสเตอร์ BH = 1 เลือกบล็อก 2 ของ 64 DAC เพจรีจิสเตอร์ BH = 2 เลือกบล็อก 3 ของ 64 DAC เพจรีจิสเตอร์ BH = 3 เลือกบล็อก 4 ของ 64 DAC เพจรีจิสเตอร์ สำหรับโหมดที่มี 16 เพจ BH = 0 เลือกบล็อก 1 ของ 16 DAC เพจรีจิสเตอร์ BH = 1 เลือกบล็อก 2 ของ 16 DAC เพจรีจิสเตอร์ : : BH = 14 เลือกบล็อก 15 ของ 16 DAC เพจรีจิสเตอร์ BH = 15 เลือกบล็อก 16 ของ 16 DAC เพจรีจิสเตอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ 11H : คาเรกเตอร์เจนเนอร์เตอร์ อินเทอร์รัพท์หมายเลข 10H บริการที่ 12H : เลือก อินพุต AH = 10H BL = 30H AL = 0 --> 200 สกรีนสแกนไลน์ = 1 --> 350 สกรีนสแกนไลน์ = 2 --> 400 สกรีนสแกนไลน์ อินเทอร์รัพท์หมายเลข 11H : ตรวจสอบอุปกรณ์ที่ต่อเข้ากับเครื่อง อินพุต อยู่ในบิตต่าง ๆ ของ AX
อินเทอร์รัพท์หมายเลข 12H : ตรวจสอบขนดของหน่วยความจำ อินพุต AX = จำนวนบล็อกขนาด 1 K ที่ต่อเนื่องกันในหน่วยความจำ อินเทอร์รัพท์หมายเลข 12H บริการที่ 0 : รีเซตดิสก์ อินพุต AH = 0 เอาต์พุต CY = 0 --> AH = 0 , สำเร็จ CY = 1 --> AH = รหัสความผิดพลาด (ดูบริการที่ 1) ข้อสังเกต สำหรับฮาร์ดดิสก์ : DL = 80H --> รีเซตดิสเกตต์ DL = 81H --> รีเซตดิสเกตต์ อินเทอร์รัพท์หมายเลข 13H บริการที่ 1 : รีเซตดิสก์ อินพุต AH = 0 เอาต์พุต รหัสความผิดพลาดเกี่ยวกับดิสก์
อินเทอร์รัพท์หมายเลข 13H บริการที่ 2 : อ่านข้อมูลจากเซกเตอร์เข้ามาเก็บไว้ในหน่วยความจำ อินพุต AH = 2 DL = หมายเลขไดรฟ์ DH = หมายเลขของหัวอ่าน CH = หมายเลขของแทร็กหรือไซลินเดอร์ CL = บิตที่ 7,6 เก็บ 2 บิตสูงของหมายเลขไซลินเดอร์ซึ่งมีขนาด 10 บิต CL = บิตที่ 0 ถึง 5 เก็บหมายเลขเซกเตอร์ AL = จำนวนเซกเตอร์ที่จะอ่าน แผ่นฟลอปปี้ 1 ถึง 8 ฮาร์ดดิสก์ 1 ถึง 80H ES:BX = แอดเดรสของบัฟเฟอร์จะอ่านและเขียน เอาต์พุต CY = 0 --> AL = จำนวนเซกเตอร์ที่อ่าน CY = 1 --> AH = รหัสบอกความผิดพลาดของดิสก์ (ดูบริการที่ 1) ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้วค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 13H บริการที่ 3 : เขียนข้อมูลลงในเซกเตอร์ของแผ่นดิสก์ อินพุต AH = 3 DL = หมายเลขไดรฟ์ DH = หมายเลขของหัวอ่าน CH = หมายเลขของแทร็กหรือไซลินเดอร์ CL = บิตที่ 7,6 เก็บ 2 บิตสูงของหมายเลขไซลินเดอร์ซึ่งมีขนาด 10 บิต CL = บิตที่ 0 ถึง 5 เก็บหมายเลขเซกเตอร์ AL = จำนวนเซกเตอร์ที่จะอ่าน แผ่นฟลอปปี้ 1 ถึง 8 ฮาร์ดดิสก์ 1 ถึง 80H ES:BX = แอดเดรสของบัฟเฟอร์จะอ่านและเขียน เอาต์พุต CY = 0 --> AL = จำนวนเซกเตอร์ที่เขียน CY = 1 --> AH = รหัสบอกความผิดพลาดของดิสก์ (ดูบริการที่ 1) ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้ว ค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 13H บริการที่ 4 : ตรวจสอบเซกเตอร อินพุต AH = 4 DL = หมายเลขไดรฟ์ DH = หมายเลขของหัวอ่าน CH = หมายเลขของแทร็กหรือไซลินเดอร์ CL = บิตที่ 7,6 เก็บ 2 บิตสูงของหมายเลขไซลินเดอร์ซึ่งมีขนาด 10 บิต CL = บิตที่ 0 ถึง 5 เก็บหมายเลขเซกเตอร์ AL = จำนวนเซกเตอร์ที่จะอ่าน แผ่นฟลอปปี้ 1 ถึง 8 ฮาร์ดดิสก์ 1 ถึง 80H ES:BX = แอดเดรสของบัฟเฟอร์จะอ่านและเขียน เอาต์พุต CY = 0 --> AL = จำนวนเซกเตอร์ที่เขียน CY = 1 --> AH = รหัสบอกความผิดพลาดของดิสก์ (ดูบริการที่ 1) ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้ว ค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 13H บริการที่ 8 : ตรวจสอบเซกเตอร์ บริการนี้ใช้เฉพาะฮาร์ดดิสก์ของเครื่อง PS/2 อินพุต AH = 8 DL = หมายเลขไดรฟ์ เอาต์พุต DL = จำนวนไดรฟ์ที่ต่อเข้ากับดิสก์คอนโทรลเลอร์ DH = จำนวนหัวอ่านมากสุด CH = จำนวนไซลินเดอร์มากสุด CL = บิตที่ 7,6 เก็บ 2 บิตสูงของหมายเลขไซลินเดอร์ซึ่งมีขนาด 10 บิต CL = บิตที่ 0 ถึง 5 บิตสูงของหมายเลขเซกเตอร์ BL สำหรับดิสก์เกตต์ที่ใช้กับเครื่อง PS/2 เท่านั้น = 1 --> ไดรฟ์ความจุ 360 กิโลไบต์ = 2 --> ไดรฟ์ความจุ 1.2 เมกะไบต์ = 3 --> ไดรฟ์ความจุ 720 กิโลไบต์ = 4 --> ไดรฟ์ความจุ 1.44 เมกะไบต์ ES:BX = แอดเดรสของบัฟเฟอร์จะอ่านและเขียน ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้วค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 13H บริการที่ 0AH และ 0BH : สงวนไว้ อินเทอร์รัพท์หมายเลข 13H บริการที่ 0CH : ตรวจสอบเซกเตอร์ บริการนี้ช้ได้เฉพาะกับฮาร์ดดิสก์ อินพุต AH = 0CH DH = หมายเลขหัวอ่าน DL = หมายเลขของไดรฟ์ (80 ถึง 87H) CH = หมายเลขของแทร็กหรือไซลินเดอร์ CL = บิตที่ 7,6 เก็บ 2 บิตสูงของหมายเลขไซลินเดอร์ซึ่งมีขนาด 10 บิต CL = บิตที่ 0 ถึง 5 เก็บหมายเลขเซกเตอร์ เอาต์พุต CY = 0 --> AL = 0 สำเร็จ CY = 1 --> AH = รหัสบอกความผิดพลาดของดิสก์ (ดูบริการที่ 1) ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้ว ค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 13H บริการที่ 0DH : รีเซตดิสก์สลับกัน อินเทอร์รัพท์หมายเลข 13H บริการที่ 0EH และ 0FH : สงวนไว้ อินเทอร์รัพท์หมายเลข 13H บริการที่ 10H : ตรวจสอบความพร้อมของไดรฟ์ อินเทอร์รัพท์หมายเลข 13H บริการที่ 11H : คาลิเบรตไดรฟ์ของฮาร์ดดิสก์ใหม่ บริการนี้ใช้ได้เฉพาะกับฮาร์ดดิสก์ อินพุต AH = 11H (อ่าน) DL = หมายเลขของไดรฟ์ (80 ถึง 87H) เอาต์พุต CY = 0 --> AL = 0 สำเร็จ CY = 1 --> AH = รหัสบอกความผิดพลาดของดิสก์ (ดูบริการที่ 1) ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้วค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 13H บริการที่ 12H : วินิจฉัยฮาร์ดดิสก์ บริการนี้ใช้ได้เฉพาะกับฮาร์ดดิสก์ อินพุต AH = 12H (วินิจฉัยแรม) AH = 13H (วินิจฉัยไดรฟ์) AH = 14H (วินิจฉัยดิสก์คอนโทรลเลอร์) DL = หมายเลขของไดรฟ์ (80 ถึง 87H) เอาต์พุต CY = 0 --> AL = 0 สำเร็จ CY = 1 --> AH = รหัสบอกความผิดพลาดของดิสก์ (ดูบริการที่ 1) ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้ว ค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 13H บริการที่ 19H : พักการทำงานของหัวอ่านฮาร์ดดิสก์ (Park) บริการนี้ใช้ได้เฉพาะกับฮาร์ดดิสก์ของเครื่อง PS/2 อินพุต DL = หมายเลขของไดรฟ์ เอาต์พุต CY = 0 --> AL = 0 สำเร็จ CY = 1 --> AH = รหัสบอกความผิดพลาดของดิสก์ (ดูบริการที่ 1) ข้อสังเกต DL = หมายเลขไดรฟ์ ; ถ้าบิตที่ 7 เป็น 1 หมายถึง ฮาร์ดดิสก์ สำหรับฮาร์ดดิสก์แล้ว ค่าใน DL เป็นได้ตั้งแต่ 80H ถึง 87H อินเทอร์รัพท์หมายเลข 14H ,AH = 0 : อินนิเชียลพอร์ต RS 232 อินพุต AH = 0 DL = ค่าในบิตต่างๆ มีความหมายดังนี้ บิตที่ 0,1 = ขนาดของเวิร์ค โดย 01 --> 7 บิต 11 --> 8 บิต บิตที่ 2 = จำนวนสตอปบิต โดย 0 --> 1 สตอปบิต 1 --> 2 สตอปบิต บิตที่ 3,4 = พาริตี้ โดย 00 --> ไม่มี (none) 01 --> คี่ (odd) 11 --> คู่ (even) บิตที่ 5,6,7 = Baud rate โดย ค่า 000 --> 110 001 --> 150 010 --> 300 011 --> 600 100 --> 1200 101 --> 2400 110 --> 4800 111 --> 9600 อินเทอร์รัพท์หมายเลข 14H ,AH = 1 : ส่งอักขระไปยังซีเรียลพอร์ต อินพุต AH = 1 AL = รหัสแอสกีของอักขระที่จะส่งไป เอาต์พุต ถ้าบิตที่ 7 ของ AH = 1 แสดงว่า ล้มเหลว ถ้าบิตที่ 7 ของ AH = 0 แล้วบิตที่ 0 ถึง 6 เก็บสถานะ (ดู INT 14H ,AH = 3) อินเทอร์รัพท์หมายเลข 14H ,AH = 2 : ส่งอักขระไปยังซีเรียลพอร์ต อินพุต AH = 2 เอาต์พุต AL = รหัสแอสกีของอักขระที่จะส่งไป AH = 0 แสดงว่า สำเร็จ = ค่าอื่น แล้ว AH เก็บรหัสของความผิดพลาด (ดู INT 14H ,AH = 3) อินเทอร์รัพท์หมายเลข 14H ,AH = 3 : ตรวจสอบเซกเตอร์ อินพุต AH = 3 เอาต์พุต AH = ค่าในบิตต่าง ๆ ถ้าถูกเซตจะมีความหมายดังนี้ บิตที่ 7 --> Time out บิตที่ 6 --> Shift register empty บิตที่ 5 --> Holding register empty บิตที่ 4 --> Break detected บิตที่ 3 --> Framing error บิตที่ 2 --> Parity error บิตที่ 1 --> Overrun error บิตที่ 0 --> Data ready AL = ค่าในบิตต่าง ๆ มีความหมายดังนี้ บิตที่ 7 --> Received line signal detect บิตที่ 6 --> Ring indicator บิตที่ 5 --> Data set ready บิตที่ 4 --> Clear to send บิตที่ 3 --> Delta receive line signal detect บิตที่ 2 --> Trailing edge ring detector บิตที่ 1 --> Delta data set ready บิตที่ 0 --> Delta clear to send อินเทอร์รัพท์หมายเลข 15H : คาสเซ็ตต์อินพุตและเอาต์พุต อินพุต AH = 0 --> เปิดมอเตอร์ของคาสเซ็ตต์ AH = 1 --> ปิดมอเตอร์ของคาสเซ็ตต์ AH = 2 --> อ่านบล็อกของข้อมูล (ขนาด 1 หรือ 256 ไบต์) แล้วเก็บวืที่ ES:BXโดย CX = จำนวนไบต์ที่อ่าน AH = 3 --> อ่านบล็อกของข้อมูล (ขนาด 1 หรือ 256 ไบต์) แล้วเก็บวืที่ ES:BXโดย CX = จำนวนไบต์ที่อ่าน เอาต์พุต DX = จำนวนไบต์ที่อ่านได้จริง CY = 0 --> AL = 0 สำเร็จ CY = 1 --> AH = รหัสบอกความผิดพลาด โดย = 01 --> การตรวจสอบ CRC ผิดพลาด (cyclic redundance check, CRC) = 02 --> มีข้อมูลสูญหายระหว่างทาง = 03 --> ไม่พบข้อมูล ในไบออสรุ่นใหม่ ๆ มีการเพิ่มหน้าทึความรับผิดชอบให้กับินเตอร์รัปต์นี้อันได้แก่ สนับสนุนการใช้จอยสติก การเปลี่ยนโหมดการทำงานของโปรดเซสเซอร์ (โหมดปกติหรือโปรเท็กซ์โหมด) การใช้เมาส์ และพารามิเตอร์ของไบออส
อินเทอร์รัพท์หมายเลข 16H บริการที่ 1 : ตรวจสอบว่าคีย์บอร์ดพร้อมที่จะถูกอ่านหรือไม่ อินพุต AH = 2 เอาต์พุต แฟล็กศูนย์ = 0 --> บัฟเฟอร์ว่าง แฟล็กศูนย์ = 1 --> AH = รหัสสแกน AL = รหัสแอสกี อินเทอร์รัพท์หมายเลข 16H บริการที่ 2 : หาคีย์บอร์ดสถานะคีย์บอร์ด อินพุต AH = 2 เอาต์พุต AL = ไบต์บอกสถานะของคีย์บอร์ด อินเทอร์รัพท์หมายเลข 17H บริการที่ 0 : พิมพ์อักขระที่เก็บใน AL ออกพรินเตอร์ อินพุต AH = 0 AL = อักขระที่จะพิมพ์ DX = หมายเลขพรินเตอร์ (0,1,2) เอาต์พุต AH = 1 --> printer time out อินเทอร์รัพท์หมายเลข 17H บริการที่ 1 : อินนิเชียลพรินเตอร์พอร์ต อินพุต AH = 1 DX = หมายเลขพรินเตอร์ (0,1,2) เอาต์พุต AH = สถานะของพรินเตอร์ ค่าในบิตต่าง ๆ ของ AH ถ้าถูกเซตจะมีความหมายดังนี้ บิตที่ 7 --> พรินเตอร์ไม่ว่าง บิตที่ 6 --> Ackmowledge บิตที่ 5 --> กระดาษหมด บิตที่ 4 --> Selected บิตที่ 3 --> I/O error บิตที่ 2 --> ไม่ได้ใช้ บิตที่ 1 --> ไม่ได้ใช้ บิตที่ 0 --> Time out อินเทอร์รัพท์หมายเลข 17H บริการที่ 2 : อ่านสถานะของพรินเตอร์เข้ามาเก็บไว้ใน AH อินพุต AH = DX = หมายเลขพรินเตอร์ (0,1,2) เอาต์พุต AH = สถานะของพรินเตอร์ (เหมือน INT 17H บริการที่ 1) อินเทอร์รัพท์หมายเลข 18H : Resident BASIC อินเทอร์รัพท์นี้ใช้ติดตั้ง ROM Resident BASIC ในเครื่องพีซี อินเทอร์รัพท์หมายเลข 19H : บูตแสตรป (Bootstrap) อินเทอร์รัพท์นี้ใช้บูตเครื่อง (ลองเรียกใช้บริการนี้ด้วยดีบัก) อินเทอร์รัพท์หมายเลข 1AH บริการที่ 0 : อ่านเวลาของวัน อินพุต AH = 0 เอาต์พุต CX = เวิร์ดสูงของ timer count DX = เวิร์ดต่ำของ timer count AL = 0 ถ้าไทเมอร์ยังไม่เกิน 24 ชั่วโมงนับตั้งแต่การอ่านครั้งสุดท้าย ข้อสังเกต timer count มีค่าเพิ่มขึ้นชั่งโมงละ 65,536 อินเทอร์รัพท์หมายเลข 1AH บริการที่ 1 : กำหนดเวลาของวัน อินพุต AH = 0 CX = เวิร์ดสูงของ TIMER COUNT DX = เวิร์ดต่ำของ TIMER COUNT ข้อสังเกต TIMER COUNT มีค่าเพิ่มขึ้นชั่งโมงละ 65,536 อินเทอร์รัพท์หมายเลข 1BH : แอดเดรสของคีย์บอร์ดเบรก อินเทอร์รัพท์หมายเลข 1CH : ไทเมอร์ติกอินเทอร์รัพท์ (Timer Tick Interrupt) อินเทอร์รัพท์หมายเลข 1DH : ตารางวีดิโอพารามิเตอร์ อินเทอร์รัพท์หมายเลข 1EH : ดิสเกตต์พารามิเตอร์ อินเทอร์รัพท์หมายเลข 1FH : นิยามอักขระกราฟิก อินเทอร์รัพท์หมายเลข 20H : เทอร์มิเนตโปรแกรม โปรแกรมส่วนใหญ่จบการทำงานด้วยอินเทอร์รัพท์นี้ |
|
|
|
Load Time = 337 milliseconds Height = 35118 Width = 1264
|
"Imagination is more important than knowledge" - Albert Einstein |