【x86汇编】第六章 输出/输出和win32编程

文章目录

输入/输出指令和数据的传送方式

  • 在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打断当前执行程序,转而为临时的事件服务,事后自动恢复
  • 实现这种功能的软硬件装置,称为中断系统
  • 处理事件的程序,称为中断处理程序
  • 引起中断的事件称为中断源

中断分为:

  • 外部中断
    1. 不可屏蔽中断 NMI
    2. 可屏蔽中断 INTR
  • 内部中断
    1. CPU检测:除法错误、单步中断、协处理器段超越等
    2. 程序检测:软中断,包括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

  • 实方式:
    1. FLAGS压栈,IF、TF置零
    2. CS压栈,计算新的CS并赋值
    3. IP压栈,得到新的IP赋值
  • 32位段:
    1. EFLAGS压栈,IF、TF置零
    2. CS拓展为32位压栈,从门或者TSS描述符指向的数据区分离出段选择符,计算得到新的CS赋值
    3. 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位的标记域,含义如下
    1. 00 对应的数据寄存器中存有有效的数据
    2. 01 对应的数据寄存器中数据为0
    3. 10 对应的数据寄存器中数据是特殊数据(NaN,∞等)
    4. 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值