. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
主题 : :  检测点15.1的一个疑问  [待解决] 回复[ 13次 ]   点击[ 784次 ]  
lj9766
[帖 主] [ 发表时间:2009-08-10 23:01 ] 
荣誉值:0
信誉值:0
注册日期:2009-07-30 00:44
对于15.1的答案精简为
pushf
call dword ptr ds:[0]
我觉得似乎不用pushf了吧,因为这是中断例程,占用的是中断类型码9的中断向量,
那在中断发生时,中断过程中,标志寄存器入栈是cpu硬件完成的啊,而且IF和TF也都由硬件置0,干嘛还需要再次pushf呢?
不明白!
vsoft
[第11楼] [ 回复时间:2019-02-25 15:45 ] 
荣誉值:0
信誉值:2
注册日期:2011-11-27 16:20
我也有同样的疑问,看了上面的各个回答,我觉得还是有点问题,有些回答没搞清什么是中断、中断过程、中断向量、中断例程。
首先中断是一种机制,不存在有执行中断这种说法,顶多叫响应中断,根据中断向量找到中断处理程序,也就是中断例程,最后执行中断例程。
发送中断时,计算机硬件完成中断过程,一旦中断过程完成了,就开始执行中断例程,中断例程最后返回用的是iret,也就是出栈ip、cs、状态寄存器。
在中断过程中,硬件会压栈ip、cs、状态寄存器,还会置0 tf、if标志,所以中断例程用iret返回。这里的iret与中断过程中的操作配对操作。
而int 9是引发中断,到底引发中断里面包不包含中断过程操作,书上说的比较含糊。另外int 9引发中断和中断过程到底哪个会压栈状态寄存器书上可能说的也不准确,因为从论坛搜索到书本第一版里面能看到中断过程不包含状态寄存器压栈。

如果按照5楼的推断,那么可以去掉pushf,然后把iret改成ret,实际我调试测试这样是会出问题的。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved