From dc8aee6ce4be02d69a31565e0959e6dd1bbc84df Mon Sep 17 00:00:00 2001 From: lijie78 Date: Tue, 23 Nov 2021 10:45:02 +0800 Subject: [PATCH] add README.md for x86-interrupt-list --- .gitignore | 1 + .../x86-interrupt-list/README.md | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 .gitignore create mode 100644 一些非必要的资料/x86-interrupt-list/README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/一些非必要的资料/x86-interrupt-list/README.md b/一些非必要的资料/x86-interrupt-list/README.md new file mode 100644 index 0000000..d4c589e --- /dev/null +++ b/一些非必要的资料/x86-interrupt-list/README.md @@ -0,0 +1,83 @@ +x86 中断函数列表 + +一开始从 stackoverflow 上找到这个网站: +[http://www.ctyme.com/intr/int.htm](http://www.ctyme.com/intr/int.htm) + +但是没找到下载地址,所以又搜了下找到了这个网站[Public Files on FTP.CS.CMU.EDU](https://www.cs.cmu.edu/~ralf/files.html) + +目录和文件(可按文本格式打开)按照字母序,比如 `inter61a/INTERRUP.A` 包含了 `INT 00` 到 `INT 10` + +文中会对指令作出较为详细的描述,以 最近一篇文章中的中 +[INT 13](https://github.com/sunym1993/flash-linux0.11-talk/blob/547ef4b440ff2ed1be2204e459316a39e9a734fc/%E4%B8%80%E4%BA%9B%E9%9D%9E%E5%BF%85%E8%A6%81%E7%9A%84%E8%B5%84%E6%96%99/linux-0.11/boot/bootsect.s#L71) +为例, 可以看到给 `AX` 赋值了 `#0x0200+SETUPLEN -> #0x0204` 即 `AH=02` + +```assembly +mov ax,#0x0200+SETUPLEN ; service 2, nr of sectors +int 0x13 +``` + +对应在 `inter61a/INTERRUP.B` 找到如下描述,可知 `CF` 用来做错误位设置,clear 时标志成功, +自然猜测接下来的 `jnc` 指令就是为了检查 READ SECTOR(S) INTO MEMORY 这一操作是否成功。 + +```shell +INT 13 - DISK - READ SECTOR(S) INTO MEMORY + AH = 02h + AL = number of sectors to read (must be nonzero) + CH = low eight bits of cylinder number + CL = sector number 1-63 (bits 0-5) + high two bits of cylinder (bits 6-7, hard disk only) + DH = head number + DL = drive number (bit 7 set for hard disk) + ES:BX -> data buffer +Return: CF set on error + if AH = 11h (corrected ECC error), AL = burst length + CF clear if successful + AH = status (see #00234) + AL = number of sectors transferred (only valid if CF set for some + BIOSes) +Notes: errors on a floppy may be due to the motor failing to spin up quickly + enough; the read should be retried at least three times, resetting + the disk with AH=00h between attempts + most BIOSes support "multitrack" reads, where the value in AL + exceeds the number of sectors remaining on the track, in which + case any additional sectors are read beginning at sector 1 on + the following head in the same cylinder; the MSDOS CONFIG.SYS command + MULTITRACK (or the Novell DOS DEBLOCK=) can be used to force DOS to + split disk accesses which would wrap across a track boundary into two + separate calls + the IBM AT BIOS and many other BIOSes use only the low four bits of + DH (head number) since the WD-1003 controller which is the standard + AT controller (and the controller that IDE emulates) only supports + 16 heads + AWARD AT BIOS and AMI 386sx BIOS have been extended to handle more + than 1024 cylinders by placing bits 10 and 11 of the cylinder number + into bits 6 and 7 of DH + under Windows95, a volume must be locked (see INT 21/AX=440Dh/CX=084Bh) + in order to perform direct accesses such as INT 13h reads and writes + all versions of MS-DOS (including MS-DOS 7 [Windows 95]) have a bug + which prevents booting on hard disks with 256 heads (FFh), so many + modern BIOSes provide mappings with at most 255 (FEh) heads + some cache drivers flush their buffers when detecting that DOS is + bypassed by directly issuing INT 13h from applications. A dummy + read can be used as one of several methods to force cache + flushing for unknown caches (e.g. before rebooting). +BUGS: When reading from floppies, some AMI BIOSes (around 1990-1991) trash + the byte following the data buffer, if it is not arranged to an even + memory boundary. A workaround is to either make the buffer word + aligned (which may also help to speed up things), or to add a dummy + byte after the buffer. + MS-DOS may leave interrupts disabled on return from this function. + Apparently some BIOSes or intercepting resident software have bugs + that may destroy DX on return or not properly set the Carry flag. + At least some Microsoft software frames calls to this function with + PUSH DX, STC, INT 13h, STI, POP DX. + on the original IBM AT BIOS (1984/01/10) this function does not disable + interrupts for harddisks (DL >= 80h). On these machines the MS-DOS/ + PC DOS IO.SYS/IBMBIO.COM installs a special filter to bypass the + buggy code in the ROM (see CALL F000h:211Eh) +SeeAlso: AH=03h,AH=0Ah,AH=06h"V10DISK.SYS",AH=21h"PS/1",AH=42h"IBM" +SeeAlso: INT 21/AX=440Dh/CX=084Bh,INT 4D/AH=02h + +# ··· + +```