<<PC技术内幕>> 第6章 BIOS数据区笔记
CPU、BIOS以及普通的适配卡都占用了大量的固定数据区来在首兆字节地址空间执行各种功能。无论是何种操作系统或者硬件设计。这些地址在所有的80X86 IBM兼容机上非常常见。
固定数据区包括CPU中断向量表、保存在中断向量表内的数据以及BIOS和适配卡数据。
BIOS数据区
该区域含有系统BIOS ROM 用到的关键数据信息。程序可以简单地访问BIOS数据。在所有系统上这个区域都开始于内存的 40h 段址处。通常可用两种方法来访问这段内存。其一是利用段址 40h 和偏移量为 0。第二种方法是使用段址 0,但偏移地址开始于 400h。通常使用这两种方法可以访问相同的信息。
BIOS数据区归纳
偏移 | 类型 | 内 容 |
400H | 字 | 计算机上0号RS232-1适配器的基地址,通常为3F8H。 |
402H | 字 | 计算机上1号RS232-1适配器的基地址,通常为2F8H。 |
404H | 字 | 计算机上2号RS232-1适配器的基地址。 |
406H | 字 | 计算机上3号RS232-1适配器的基地址。 |
408H | 字 | 计算机上0号并行打印机适配器的基地址,通常为378H。 |
40AH | 字 | 计算机上1号并行打印机适配器的基地址。 |
40CH | 字 | 计算机上2号并行打印机适配器的基地址。 |
40EH | 字 | 计算机上3号并行打印机适配器的基地址。(PS2型此值为扩展BIOS数据区段地址) |
410H | 字 | 该字保存与计算机连接的设备编码表,BIOS中断11H(设备测定)可返回此信息。 |
位 | ||
0 | 软驱安装标志,此位为0表示没有软驱。 | |
1 | 数字协处理器安装标志,此位为0表示未安装协处理器。 | |
3-2 | 系统板RAM的大小,适用于一些旧机型,PS2型未使用。00=16K,01=32K,10=48K,11=64K)。 |
5-4 | 初始显示方式(00=AG,01=CGA-40,10=CGA-80,11=MDA-80)。 | |
7-6 | 软驱的数量,公当位0为1时有效,00=1,01=2,10=3,11=4 | |
8 | DMA标志 | |
9-11 | 所连RS232适配器数 |
12 | 连有游戏I/O | |
13 | 不用(PS2型为内置MODEM安装标志,此位为0表示没有安装) | |
14-15 | 所连打印机适配器数 | |
412H | 字节 | 初始测试标志(红外线键盘连接错误单元/?)。 |
413H | 字 | 该字给出打印机可用RAM的容量,基本内存容量为0-10K,以千字节为单位。BIOS中断12H(内存大小测定)可返回此信息。 |
415H | 字 | I/O通道的存储器容量(PS2型,BIOS控制标志)。 |
417H | 字节 | 这是第一个键盘状态字,通过编码,使每位均有特定的含义,具体格式如下: |
位 | ||
0 | 表示键盘右边的Shift键当前是否被按下(1表示按下,0表示未按下)。 | |
1 | 表示键盘左边的Shift键当前是否被按下(1表示按下,0表示未按下)。 | |
2 | 表明Ctrl键当前是否按下(1表示按下,0表示未按下)。 | |
3 | 表明Alt键当前是否按下(1表示按下,0表示未按下)。 |
4 | 屏幕(Scroll)锁定开关键状态(1表示屏幕锁定处于开,0表示关)。 | |
5 | 数字(Num Lock)锁定开关键状态(1表示数字锁定处于开,0表示关)。 | |
6 | 大写字母(Caps Lock)开关键状态(1表示Caps Lock处于开,0表示关)。 | |
7 | 插入状态,它表明Ins键是否已按下,以使计算机进入“插入”方式,1表示插入状态正工作,0表明未动作。 |
418H | 字节 | 这是第二个键盘状态字,其格式如下: |
位 | ||
0 | 表示键盘左边Ctrl键当前是否被按下(1表示按下,0表示未按下)。 | |
1 | 表示键盘左边Alt键当前是否被按下(1表示按下,0表示未按下)。 | |
2 | 如按下Ctrl+Alt+Del键,则该位为1。 |
3 | 如果系统键(Ctrl和Num Lock)接下且保持住,则该位为1,当这个系统键依次按下时,BIOS暂停处理,直至下键按下为止。但它仍响应中断。 | |
4 | 表明屏幕(Scrool)锁定键当前是否按下(1表示按下,0表示未按下)。 | |
5 | 表明数字(Num Lock)锁定键当前是否按下(1表示按下,0表示未按下)。 | |
6 | 表明大写字母(Caps Lock)锁定键当前是否按下(1表示按下,0表示未按下)。 |
7 | 表明Ins键当前是否按下(1表示按下,0表示未按下)。 | |
419H | 字节 | 为Alt和数字键盘键入的数而保留。(按住ALT+数字,可直接得到相应的ASCII码) |
41AH | 字 | 指向键盘缓冲区首址 |
41CH | 字 | 指向键盘缓冲区尾址,当该值等于前一字的值时,说明缓冲区满。 |
41EH | 32字节 | 循环键盘缓冲区,它保存键盘键入的字符,直到程序可以接收这些字符为止,前两个字指向此缓冲区的当前是首和尾。 |
43EH | 字节 | 表示磁盘驱动器的搜索状态,0-3位分别对应于驱动器。如果这些位中有一位为0,则表示在搜索磁道之前,必须重新校准相应的驱动器。位4-6未使用,位7为中断标志位,为1表示中断发生。 |
43FH | 字节 | 表示磁盘驱动器的马达状态,0-3位分别对应于驱动器0-3,如果某位被置为1,则相应驱动器的马达正在转动。位4-6未使用,位7为1表示现行操作是写。 |
440H | 字节 | 保存一个表明驱动器马达接通多长时间的计数,每个时钟节拍,计数减1,当计数为0明马达停转(根据INT8计时)。 |
441H | 字节 | 表明磁盘工作状态,它被编码,通过使相应位置1来表示一个特定的状态,格式如下: |
值 | ||
00H | 正确。 | |
01H | 送给磁盘控制器的是无效命令。 | |
02H | 在盘上未找到地址标记。 | |
03H | 试图在有写保护的盘上写操作。 | |
04H | 所请求扇区未找到。 | |
08H | 驱动器DMA错。 | |
09H | 试图使DMA对64KB存储体进行存取。 |
10H | 循环冗余校验(CRC)错。 | |
20H | NEC磁盘控制器片出现错误。 | |
40H | 无效的查找操作。 | |
80H | 延时,没有响应。 | |
442H | 7字节 | 从NEC磁盘驱动器返回的七个字节状态信息(参见FDC)。 |
449H | 字节 | 指明当前视频方式,参见INT 10H。 |
44AH | 字 | 指明显示屏幕的当前列数。 |
44CH | 字 | 指明一个显示页面的字节数,它随时视频方式的不同而变化。80*25方式=1000H字节,40*25方式=800H字节,图形方式=4000H字节 |
44EH | 字 | 指明当前显示页面的地址,即显示在当前显示屏幕的显示页面。 |
450H | 8字 | 每个字均表示有关显示页面内当前光标的位置,每个字的第一字节表示列,第二字节表示行(改变这个字节并不能立刻改变显示)。 |
460H | 字节 | 表明光标的形状,此字节表示光标字符点阵的最下一行的行号,10H功能调用1设置此光标形状(不要直接更改此字节)。 |
461H | 字节 | 此字节表示光标字符点阵的最上一行的行号。10H功能调用1设置此光标形状(不要直接更改此字节)。 |
462H | 字节 | 表明工作显示页面号,由10H功能调用5设置。 |
463H | 字 | 表明当前工作显示板的口地址。3BCH=单色,3D4H=彩色。 |
465H | 字节 | 表明6845芯片的方式寄存器的当前值(端口:3X8H)。 |
466H | 字节 | 表示当前显示控制面板的设置。10H功能调用0BH可设置当前面板(端口:3D9H)。 |
467H | 5字节 | PC中,这5个字节用以表示磁带控制的定时计数字、CRC寄存器字和最后输入数值字节,在AT中,这5个字节作为端口使用,从467H开始的双字长是一个指针,它指向BIOS开关使80X86由保护虚地址方式转到实地址方式时控制返回的位置。 |
46CH | 双字 | 这是BIOS作为时钟计数器的一个双字单元,时钟第步进一次,此值增加一次,其值为0,表示一天开始(午夜),当此计数器达到一天结束的值时,计数器清0,且字节470H置1。中断1AH功能调用0可从此双字单元中读取一天的时间。 |
470H | 字节 | 这是一个时钟翻转字节。当时钟计数器达到一天结束且复位时,此字节置1以表明新的一天开始。中断1AH功能调用0在读取这一天的时间后,将此字节复位。 |
471H | 字节 | 位7为1表示BREAK键按下(INT 9设置此标志)。 |
472H | 字 | 由软件设置复位功能标志或直接跳转FFFF:0重启动。 |
值 | ||
1234H | 热启动 | |
5678H | 系统中止 | |
9ABCH | 在制造商检测时使用。 |
474H | 字节 | 硬盘状态。 |
值 | ||
00H | 正确 | |
01H | 送给磁盘控制器的是无效命令或参数。 | |
02H | 在盘上未找到地址标记 | |
03H | 试图在有写保护的盘上进行写操作。 |
04H | 所请求扇区未找到。 | |
05H | 重新复位失败。 | |
07H | 操作失效。 | |
08H | DMA错 | |
09H | 试图使DMA对64K存储体进行存取。 | |
0AH | 坏的扇区标志。 |
0BH | 坏磁道已清除。 | |
0DH | 扇区号、格式错。 | |
0EH | 控制数据地址已清除。 | |
0FH | DMA超出限制。 | |
10H | 循环冗余校验CRC错。 | |
11H | ECC数据错。 | |
20H | NEC磁盘控制器片出现错误。 | |
40H | 无效的查找操作。 | |
80H | 延时,没有响应。 |
AAH | 没准备好。 | |
BBH | 发生错误,定义不正确。 | |
CCH | 写错误。 | |
E0H | 寄存器错误。 | |
FFH | 磁盘检测失败。 |
475H | 字节 | 硬盘设备数。 |
476H | 字节 | 磁盘适配器控制。 |
477H | 字节 | 硬盘适配器端口。 |
478H | 字节 | 测试打印机0的超时值。 |
479H | 字节 | 测试打印机1的超时值。 |
47AH | 字节 | 测试打印机2的超时值。 |
47BH | 字节 | 测试打印机3的超时值(PS2型除外)。 |
47CH | 字节 | 测试0号RS232超时值。 |
47DH | 字节 | 测试1号RS232超时值。 |
47EH | 字节 | 测试2号RS232超时值。 |
47FH | 字节 | 测试3号RS232超时值。 |
480H | 字 | 指向存放键盘输入字符的循环缓冲区首址。 |
482H | 字 | 指向存放键盘输入字符的循环缓冲区尾址。 |
484H | 字节 | 显示字符的列数。其值为显示字符的列数减1(EGA以上有效)。 |
485H | 字 | 每个字符高度(EGA以上有效)。 |
487H | 字节 | 显示控制状态(EGA以上有效)1。 |
位 | ||
0 | 光标仿真模式状态(1为开启)。 |
1 | 单色显示系统状态(1为启用)。 | |
2 | 保留。 | |
3 | 显示系统空闲状态(1为空闲)。 | |
4 | 保留。 | |
6-5 | 显存容量(00=64K,01=128K,10=192K,11=256K)。 | |
7 | 显示模式可用状态。 | |
488H | 字节 | 显示控制状态2(EGA以上有效)。 |
位 | ||
0 | SW1(1=关闭) | |
1 | SW2(1=关闭) | |
2 | SW3(1=关闭) | |
3 | SW4(1=关闭) | |
4 | ? |
5 | ? | |
6 | ? | |
7 | ? | |
489H | 字节 | 显示控制状态3(MCGA或VGA有效)。 |
位 | ||
0 | VGA模式状态 | |
1 | 灰度模式状态 | |
2 | 单色显示状态 | |
3 | 使用默认模式 | |
4 | -- | |
5 | 保留 | |
6 | 显示状态开关 |
7 | -- | |
值 | ||
位7位4 | ||
0 0 | 350线模式 | |
0 1 | 400线模式 | |
1 0 | 200线模式 | |
1 1 | 保留 |
48AH | 字节 | 显示适配器DCC索引。 |
48BH | 字节 | 最后磁盘数据率。 |
位 | ||
3-0 | 保留。 |
5-4 | 步进时间。 | |
7-6 | 数据传输率。 | |
48CH | 字节 | 硬盘状态。 |
48DH | 字节 | 硬盘错误。 |
48EH | 字节 | 硬盘中断标志。 |
48FH | 字节 | 位0为1,表示硬盘和软盘使用一个控制卡。 |
490H | 字节 | 驱动器0介质状态。 |
491H | 字节 | 驱动器1介质状态。 |
492H | 字节 | 驱动器0的起始状态。 |
493H | 字节 | 驱动器2的起始状态。 |
494H | 字节 | 驱动器0磁道数。 |
495H | 字节 | 驱动器1磁道数。 |
496H | 字节 | 键盘类型和方式,各位含义为: |
位 |
0 | E1H隐含码最后。 | |
1 | E0H隐含码最后。 | |
2 | 右Ctrl键按下。 | |
3 | 右Alt键按下。 | |
4 | 101/102键盘 | |
5 | 若读标识和键盘,则强置Num Lock。 | |
6 | 最后的字符是第一个ID字符。 | |
7 | 读键盘的ID。 |
497H | 字节 | 键盘标志。 |
位 | ||
0-2 | LED状态位。 | |
3 | 保留。 | |
4 | 收到消息。 | |
5 | 重发接收标志。 | |
6 | 方式指示器更新。 | |
7 | 键盘传送错误标志。 |
498H | 双字 | 等待完成标志的偏移地址。 |
49AH | 双字 | 用户等待计数(低位字),以微秒为单位。 |
49EH | 字 | 用户等待计数(高位字),以微秒为单位。 |
4A0H | 字节 | RTC等待激活标志。80表示等待时间已过。 |
4A1H | 7字节 | 这7个字节用于局域网。 |
4A8H | 双字 | 这双字指向保存视频系统的指针表。指针表格式为: |
偏移值 类型 指向 偏移值 类型 功能或指向
|
4ACH | 8字节 | 保留。 |
4B4H | 字节 | 键盘NMI控制标志(可变)。 |
4B5H | 双字 | 键盘中断中标志(可变)。 |
4B9H | 字节 | 端口60单字节队列(可变)。 |
4BAH | 字节 | 最后的键盘扫描码(可变)。 |
4BBH | 字节 | NMI缓冲头位置(可变)。 |
4BCH | 字节 | NMI缓冲头位置(可变)。 |
4BDH | 16字节 | NMI扫描码缓冲(可变)。 |
4CEH | 字 | 日期计数(可变)。 |
4F0H | 16字节 | ? |
延伸阅读
BIOS 数据区的结构及其利用
IBM 及其兼容机,在低内存地址中,存放着一系列关键的数据,比如从 0000:0000h---0000:03ffh 是中断向量表,存放着所有中断的当前入口地址,而从0040:0000h---0040:00ffh 是非常重要的BIOS数据区,共256个字节, 内部存放着有关键盘、视频显示器、磁盘、打印和通讯口等工作情况的重要数据。计算机在启动时通过对各硬件设备的检测,把有关配置情况的数据和一些系统默认值添入其中,同时它也在一定程度上控制着计算机系统的正常工作。了解其结构,可以认识计算机是怎样运行的,并且,正确地利用BIOS数据区中的部分内容,也将为我们工作带来一定的方便。用debug可以方便地查看此区域的内容:
c:/debug
-d 40:0 L90 ;列出90H个数据的内容
-d 40:8 L4 ;列出第8个字节开始的4个字节内容,0040:0000 BC 03 78 03 ;两个打印口地址。
下面举例说明怎样正确利用BIOS数据区。
一、40:08h 处数据的利用
此处的八个字节为四个并行口地址,即打印口地址,如果只有两个并行口,前两个字节一般应为03BCH 和 0378H,后面的四个字节为0。目前有些病毒破坏此处地址,使打印机联不上,了解上述原理后,如果恢复其正确地址,就可使打印机正常工作。另外有些汉卡或汉字系统出现故障时,也发生类似的情况,也可采用上面的办法解决。也就是说,当打印机联系不上时,检查并恢复此处地址,往往起到事半功倍的效果。基于此原理,如果想防止他人使用打印机(如学生实习等),也可以采取修改此处数据的办法,从而起到保护打印机的目的。具体作法如下:
c:/debug
-E 40:08 BC 03 ;修改为正确的地址,恢复打印。
-E 40:08 00 00 ;修改为其它值,禁止打印。
如果在开机后实现自动禁止使用打印机,可采用下面的办法形成一个可执行文件:
c:/debug
-A 100
381E:0100 MOV AX,0040
381E:0103 MOV DS,AX
381E:0105 MOV SI,0008
381E:0108 MOV WO[SI],0000
381E:010C INT20
381E:010E
-N noprt.com
-R CX
CX:0000
:E
-W
把此文件NOPRT.COM安装在主批处理之中即可。
二、40:13H 处数据的利用
此处的两个字节为此系统的基本内存容量,显示方法同上。对于640K基本内存的机器来说,正常时此处应为0280H,转换为10进制后为640K,其它机器可能是512K或256K等,某些引导型病毒先于DOS驻留内存,就采用了修改此字节的方法,使系统容量减少几K个字节,防止DOS查找,建立自己的安乐窝。此类病毒都可以通过查看此处数据是否正常而被发现。例如被火炬病毒感染时,此处就减少1K字节,而变为639K。
三、40:17H处数据利用
此处为键盘状态字节,当按下某些特定键时,此单元数据的相应位会发生变化,它的8位各对应一个按键,此键按下时对应位为1,否则为0,对应关系如下:
0:右Shift
1:左Shift
2:Ctrl
3:Alt
4:Scrol-Lock
5:Num-Lock
6:Caps-Lock
7:Insert
此字节即反应当前按键状态,也可控制这些键的状态,强制某位为1时,则系统认为此键已经按下。下面的例子,形成一人Cap.com文件,运行它就会使大写指示灯点亮。
c:/debug
-A
381E:0100 MOV AX,0040
381E:0103 MOV DX,AX
381E:0106 MOV SI,0017
381E:0108 MOV BYTE PTR[SI],40
381E:010B INT 20
381E:010D
-n Cap.com
-r CX
CX:0000
:D
-W