输入/输出指令和数据的传送方式
- 在80Xx86的PC机中,除了内存空间,还有IO空间
- IO空间用于访问外设中的寄存器
- IO空间只能由IO指令访问
- 编址方式与内存相同,地址范围为0~0FFFFH,共64K
- 寄存器称为端口,分为状态寄存器、控制寄存器、数据寄存器
- 状态寄存器:描述当前设备所处的工作状态
- 控制寄存器:存放控制设备当前工作方式所需的信息
- 数据寄存器:暂存与CPU交换的数据
输入/输出指令
- I/O空间的访问不存在分段的问题
- 保护方式下,存在访问保护,CPU遇到IO指令时,检查特权级和IO允许图
输入指令IN
IN OPD,OPS
- 从指定的端口OPS中读取数据,送入累加器OPD中
- 外设寄存器地址为0-255时,可用立即数表示,大于255时,只能DX表示
- OPD只能是累加器
输出指令OUT
OUT OPD,OPS
- 将累加器OPS中的内容,送到外设地址OPD之中
- 外设寄存器地址为0-255时,可用立即数表示,大于255时,只能DX表示
- OPS只能是累加器
串输入指令INS
INS OPD,DX
INSB — 输入字节串
INSW — 输入字串
INSD — 输入双字串
- ( [DX] ) -> ES : [ DI/EDI ]
- DF=0时增量,DF=1时减量
- 如果与REP前缀连用,则INS可以传输信息块到连续的存储空间OPD
串输出指令OUTS
OUTS DX,OPD
OUTB — 输出字节串
OUTW — 输出字串
OUTD — 输出双字串
- DS : [ SI/ESI ] -> ( [DX] )
- DF=0时增量,DF=1时减量
- 如果与REP前缀连用,则可以将内存中连续内容送到输出端口
数据的传送方式
无条件传送
- 在传送数据时,不考虑外设的工作状态
- 在输入数据时,总认为外设已经将数据准备就绪
- 该方式要求外设工作速度与CPU同步
查询传送
- CPU与外设不同步
- 输入前,查询数据是否就绪
- 输出前,查询外设是否就绪
- 查询会占用大量的CPU时间
直接存储器
- DMA(direct memory access)
- 利用DMA控制器管理数据IO,适用于高速IO设备
中断传送
外设就绪后,发送中断请求给CPU
中断与异常
中断的概念
- CPU打断当前执行程序,转而为临时的事件服务,事后自动恢复
- 实现这种功能的软硬件装置,称为中断系统
- 处理事件的程序,称为中断处理程序
- 引起中断的事件称为中断源
中断分为:
- 外部中断
- 不可屏蔽中断 NMI
- 可屏蔽中断 INTR
- 内部中断
- CPU检测:除法错误、单步中断、协处理器段超越等
- 程序检测:软中断,包括INTO,INT N 和 BOUND 等
一般情况下,把外部中断称为中断,内部中断称为异常
不可屏蔽中断 NMI
由硬件故障引起,如果不及时响应,机器就无法正常运转下去
可屏蔽中断 INTR
可屏蔽中断由各种外设的中断请求产生,CPU的IF标志,决定是否响应中断
除法出错
执行除法指令时,如果除数是0,或者商超出了寄存器所能表示的最大范围,产生一个中断号为0的内部异常
溢出
溢出标志 OF=1时,执行指令INTO将会产生中断号为4的异常
调试异常(单步)
- 指令地址断点异常
- 数据地址断点异常
- 一般检查异常
- 单步异常(TF=1)
- 任务转换断点异常
软中断(INT N)
中断矢量表
- 中断矢量表是中断号与对应的中断处理程序之间的连接表
- 中断矢量表连续存放了256个表项,每个表项中存放了中断处理函数入口的段和偏移地址
- 实方式下,中断矢量表仅存放16位的段值和16位的偏移值,每个表项占用4B
- 保护方式下,中断矢量表称为中断描述符表(IDT),每个表项存放入口信息、类别、权限等, 占用8B
中断描述符分为:
- 任务门:执行中断处理程序时将发生任务转移
- 中断门:主要用于处理外部中断,响应中断时自动将TF和IF置零
- 陷阱门:主要用于处理异常,响应中断时TF置零
软中断及相关代码
软中断指令
INT n
其中n是中断号,取值范围0-255
- 实方式:
- FLAGS压栈,IF、TF置零
- CS压栈,计算新的CS并赋值
- IP压栈,得到新的IP赋值
- 32位段:
- EFLAGS压栈,IF、TF置零
- CS拓展为32位压栈,从门或者TSS描述符指向的数据区分离出段选择符,计算得到新的CS赋值
- EIP压栈,从门或者TSS描述符指向的数据区分离出偏移值,计算得到新的EIP赋值
中断返回指令
IRET
- IP/EIP出栈,CS出栈,FLAGS/EFLAGS出栈
中断处理程序的设计
主要包括:为尚未分配功能的中断号设计一个中断处理程序,或修改已有的中断处理程序以扩充其功能
新增一个中断处理程序的步骤
- 根据新增加的功能需求,编制中断处理程序,远过程,IRET返回
- 查看中断矢量表,找空闲中断号m
- 将新编制的中断处理程序装入内存,其入口地址送到中断矢量表
修改已有中断处理程序以拓展其功能
- 根据需求编制程序段
- 将程序装入内存,将入口地址复制到程序段中,用新的入口地址取代中断矢量表中已有的入口地址
外设中断注意事项
- 必须保护现场
- 及时开中断以便CPU能响应更高级的中断请求
- 通过选用高效的指令和编制短小的程序来尽快完成中断处理的任务
- 恢复现场
- 通知中断控制器中断已结束
- 利用IRET指令实现中断返回
软中断注意事项
- 考虑切换堆栈
- 保护现场
- 在实方式下应该及时开中断,以便CPU能响应外设的中断请求
- 按照一般速度要求完成中断处理
- 恢复现场
- 堆栈切换还原
- 一般用IRET指令实现中断返回
浮点运算
FPU中的寄存器
- 8个独立寻址、按寄存器栈组织的80位浮点数据寄存器
- 3个16位寄存器(状态字、控制字和标记字寄存器)
- 2个出错指针(一个指向最后一条指令,另一个指向最后一个操作数)
- 1个操作码,是最后一条非控制的FPU指令操作吗,由11位寄存器存放
浮点数据寄存区和标记寄存器
- 8个浮点数据寄存器编号为FPR0-FPR7
- 由8个浮点数据寄存器组成首尾相接的堆栈
- 汇编中使用的浮点寄存器的助记符是ST(0) - ST(7),其中0是栈顶,由状态寄存器的TOP字段指明
- 对应每个FPR寄存器,都有一个2位的标记域,含义如下
- 00 对应的数据寄存器中存有有效的数据
- 01 对应的数据寄存器中数据为0
- 10 对应的数据寄存器中数据是特殊数据(NaN,∞等)
- 11 对应的数据寄存器没有数据
状态寄存器
状态寄存器表明FPU当前的各种操作状态以及每条浮点指令执行后所得结果的特征,其作用与CPU中的标志寄存器相当
- 状态寄存器的低6位,反应6种错误,置位后的错误标志必须指令清除
- C0-C3是条件标志位,是根据FPU运算后所得结果自动设置的
控制寄存器
控制寄存器用于控制FPU的异常屏蔽、精度和舍入操作
浮点指令与程序设计
- FPU具有自己的指令系统
- 浮点指令属于ESC(转义)指令
- 其前5位的操作码都是11011B,它们的助记符都是F开头
- 操作数不能是立即数
向FPU中装入数据的指令
FLD OPS ;将主存或ST中的浮点数压入栈顶
FILD OPS ;将主存中的整数压入栈顶
FBLD OPS ;将主存中的BCD码数压入栈顶
从FPU中取出数据的指令
FST OPD ;将栈顶的数据存放到ST(I)或按变量的浮点格式存放到主存中
FIST OPD ;将栈顶的数据按照整数格式存放到主存中
以上两条指令不改变FPU内浮点数据寄存器栈的状态
FSTP OPD ;将栈顶数据,按浮点格式存放到ST(I)或主存中,然后出栈
FISTP OPD ;将栈顶数据,按整数格式,存放主存,然后出栈
FBSTP OPD ;将栈顶数据,按BCD码格式存入主存,然后出栈
交换指令
FXCH ;ST0和ST1内容交换
FXCH ST(i) ;ST0和STi内容交换
基本算术指令
FADD ST(i),ST(j) ;STi + STj -> STi,i和j至少有一个0,至少有一个是ST0
FADD OPS ;ST0 + OPS -> ST0
FIADD OPS ;ST0 + OPS -> ST0
FSUB ST(i),ST(j) ;STi + STj -> STi,其中至少一个0
FSUB OPS ;ST0 - OPS -> ST0
FISUB OPS ;ST0 - OPS -> ST0
FMUL ST(i),ST(j) ;STi * STj -> STi,其中i和j至少有一个为0
FMUL OPS ;ST0 * OPS -> ST0
FIMUL OPS ;ST0 * OPS -> ST0
FDIV ST(i),ST(j) ;STi / STj -> STi
FDIV OPS ;ST0 / OPS -> ST0
FIDIV OPS