. : : 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呢?
不明白!
lengren
[第5楼] [ 回复时间:2009-10-05 13:19 ] 
荣誉值:0
信誉值:0
注册日期:2009-10-05 11:08
今天看到这章了,没有认真的想,直接跑到这儿来找答案了,看了楼上的回答好像懂了,这儿把我的理解说出来让高手们检查检查看我理解错误没有。估计是这样的,其实从cpu执行中断开始到最后用int9ret段中的iret退出这个中断一共有两个周期的压栈和出栈。
第一个:cpu开始执行中断过程时压的,就是(1)标志寄存器入栈,if=0,tf=0;(2)cs,ip入栈;在这两部中就完成了第一次压栈-------他所对应的出栈是程序最后的那个int9ret段中的iret;
第二个:就是我们为什么要设置pushf的原因了,同时cs ,ip也需要入栈,那么他是在哪儿入栈的呢?就是这句 call dword ptr ds:[0] ,他的功能相当于(1)cs,ip入栈;(2)(ip)=((ds)*16+0),(cs)=((ds)*16+2)-------他所对应的出栈在哪儿呢?估计就是在我们计算机原来的那个bios提供的int 9中断中,其中最后的那句iret;
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved