鱼C论坛

 找回密码
 立即注册
查看: 3003|回复: 0

[学习笔记] X86汇编语言-从实模式到保护模式—笔记(15)

[复制链接]
发表于 2017-11-8 20:46:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 兰陵月 于 2017-12-5 21:54 编辑

9.2  内 部 中 断
和硬件中断不同,内部中断发生在处理器内部,是由执行的指令引起的。比如,当处理器检测到div或者idiv的除数为零时,或者除法的结果溢出时,将产生中断0(0号中断),这就是除法错中断。再比如,当处理器遇到非法指令时,将产生中断6。
内部中断不受标志寄存器IF位的影响,也不需要中断识别总线周期,它们的中断类型是固定的,可以立即转入相应的处理过程。

9.2  内 部 中 断
软中断是由int指令格式引起的中断处理。这类中断也不要中断识别总线周期,中断号在指令中给出。int指令的格式如下:
int3
int imm8
into
int3指令是断点中断指令,机器指令码为CC。这条指令在调试程序的时候很有用,当程序运行部正常时,多数时候希望在某个地方设置一个检查点,也称断点,来查看寄存器、内存单元或者标志寄存器的内容,这条指令就是为这个目的而设的。
指令都是连续存放的,因此,所谓的断点,就是某条指令的起始地址。int3是单字节指令,这是有意设计的。当需要设置断点时,可以将断点处那条指令的第1字节改成0xcc,原字节予以保存。当处理器执行到int3时,即发生3号中断,转去执行相应的中断处理程序。中断处理程序的执行也要用到各个寄存器,这回破坏它们的内容,但push指令不会。我们可以在该程序内先压栈所有相关寄存器和内存单元,然后分别取出予以显示,它们就是中断前的现场内容。最后,再恢复那条指令的第1字节,并修改位于栈中的返回地址,执行iret指令。
int3和int 3不是一回事。前者的机器码为CC,后者则是CD 03,这就是通常所说的int n,其操作码为0xCD,第2字节的操作数给出了中断号。比如:
int 0x00  ;引发0号中断
int 0x15  ;引发0x15号中断
int 0x16  ;引发0x16号中断
into是溢出中断指令,机器码为0xCE,也是单字节指令。当处理器执行这条指令时,如果标志寄存器的OF位是1,那么,将产生4号中断。否则,这条指令什么也不做。

【9.3.1  BIOS中断】
可以为所有的中断类型自定义中断处理过程,包括内部中断、硬件中断和软中断。特别是考虑到处理器允许256种中断类型,而且大部分都没有被硬件和处理器内部中断占用。
不像jmp和call指令,int指令不需要知道目标程序的入口地址。远转移指令jmp和远调用指令call必须直接或者间接给出目标位置的段地址和偏移地址,但是目标位置的段地址和偏移地址并不是固定,而是经常会发生变化。软中断可以较好地解决这个问题,每次操作系统加载完自己后,以中断处理程序的形式提供硬盘读写功能,并把该例程的地址填写到中断向量表中。这样,用户程序需要该功能时,直接发出一个软中断即可。
最有名的软中断是BIOS中断,这些中断之所以叫BIOS中断,是因为这些中断功能是在计算机加电之后,BIOS程序执行期间建立起来的。换句话说,这些中断功能在加载和执行主引导扇区之前,就已经可以使用了。
BIOS中断,又称BIOS功能调用,主要是为了方便地使用最基本的硬件访问功能。不同的硬件使用不同的中断号,比如,使用键盘服务时,中断号是0x16,即“int 0x16”。通常,为了区分针对同一硬件的不同功能,使用寄存器AH来指定具体的功能编号。比如:
mov ah,0x00  ;从键盘读取字符
int 0x16      ;键盘服务。返回时,字符代码在寄存器AL中
上面两句程序,当寄存器AH是内容0x00时,int 0x16执行后,中断服务例程会监视键盘动作。当它返回时,会在寄存器AL中存放按键的ASCII码。
BIOS中断很多,它们是在BIOS执行期间安装的,当主引导程序开始执行时,就可以在程序中使用了。
BIOS是怎么建立起这套功能调用中断的?因为BIOS可能会为一些简单的外围设备提供初始化代码和功能调用代码,并填写中断向量表。另外还有一些BIOS中断是由外部设备接口自己建立的。
首先,每个外部设备接口,包括各种板卡,如网卡、显卡、键盘接口电路、硬件控制器等,都有自己的只读存储器(ROM),类似于BIOS芯片,这些ROM中提供了它自己的功能调用例程,以及本设备的初始化代码。按照规范,前两个单元的内容是0x55和0xAA,第三个单元是本ROM中以512字节为单位的代码长度;从第4个单元开始,就是实际的ROM代码。
其次,我们知道,从内存物理地址A0000开始,到FFFFF结束,有相当一部分是留给外围设备的。如果设备存在,那么,它自带的ROM会映射到分配给它的地址范围内。
在计算机启动期间,BIOS程序会议2KB为单位搜索内存地址C0000~E0000之间的区域。当它发现某个区域的头两个字节是0x55和0xAA时,那意味着该区域有ROM代码存在,是有效的。接着,它对该区域做累加和检查,看结果是否和第三个单元相符。如果相符,就从第四个单元进入。这是,处理执行的是硬件自带的程序指令,这些指令处室外部设备的相关寄存器和工作状态,最后,填写相关的中断向量表,使它们指向自带的中断处理过程。

例程较为简单,实际就是设置好参数,调用各种BIOS中断。主要难点在于了解各个中断的各个功能、参数设置、返回值等等。这里不再分析。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 22:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表