如果检测到标志寄存器的TF位为1,则产生单步51中断寄存器,引发51中断寄存器过程。如下

关于内中断的一个疑惑。。_汇编吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:32,566贴子:
关于内中断的一个疑惑。。收藏
如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。如下:(1). 取得中断类型码;(2). pushf
*********(入栈TF为1?)(3). 设置TF=0, IF=0(4). push CS(5). push IP(6). (IP)=(1*4), (CS)=(1*4+2)iret指令返回:即pop ippop cspopf
********(出栈TF为1?)问题来了,我们是检测TF为1,引发中断,将标记寄存器入栈,iret出栈,可是TF不还是1吗?(疑惑的地方已用*********标注)
毕业季,你准备好了吗?
如果TF出栈为1,这不是个死循环?拜托高手告诉缘由
打字很辛苦的,拜托大家了
cpu侦察到TF=1,每执行一道指令就触发int01h中断....谁会跑去触发int01h?
不就是debugger,debugger自会接管int01中断,sti先开启中断,让其他中断(优先权少于01的中断,如08,09)可行,完成后根据情况恢复现场,修改栈中保存的flag值,令iret时的TF=0
第3步不是TF为0了吗?
ip强行往下跳执行了呢?有中断命令才会检测flag,没有中断指令不论flag值是什么都会往下执行。这么说对不对?
由EFALGS.TF引起的#DB异常属于trap类型 处理器会保存当前指令执行之后的EFLAGS,SS,ESP,CS,EIP 所以不会出现你所说的情况
图略模糊 将就看
trap异常的动作
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或> 问题详情
CPU响应外设的中断清求时,要把标志寄存器的IF和TF清零。()
悬赏:0&答案豆
提问人:匿名网友
发布时间:
CPU响应外设的中断清求时,要把标志寄存器的IF和TF清零。(&&)
您可能感兴趣的试题
1假设用户编写了名为INTHAND的中断处理程序,其中断类型号为N,下面的指令为中断类型N设置中断向量:2只允许键盘中断。&&可设置如下中断屏蔽字:3已知8237A的端口地址是00~0FH,其中基地址和当前地址寄存器的端口地址是50H,基字节数和当前字节数寄存器的端口地址是51H,模式控制器的端口地址是5BH,屏蔽寄存器的端口地址是SAH,命令寄存器的端口地址是58H,主清除命令的端口地址是SDH。现要求利用该DMA的通道1从外部设备将54KB(即D800H)的数据块传送到5678H开始的存储区中(增量传送),采用块传送方式,传送完不自动初始化,外设的DREQ和DACK都是高电平有效。初始化程序如下:48259A可编程控制器,当其单片使用时可同时接收______外设的中断请求。&&A.8个&&B.12个&&C.4个&&D.16个
我有更好的答案
相关考试课程
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
享三项特权
享三项特权
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码:当前位置:
> > 查看文章
内中断04 – 零基础入门学习汇编语言63
第十二章:内中断04
让编程改变世界
Change the world by program
什么是单步中断?
CPU为什么要提供这样的功能呢?
我们在使用Debug的T命令的时候,有没有想过这样的问题,Debug如何能让CPU在执行一条指令后,就显示各个寄存器的状态?
假想:如果CPU不提供其他功能的话,就按正常方式工作,只要CPU一加电,它就从预设的地址开始一直执行下去……不可控制!
可是,我们在Debug中看到的情况却是,Debug可以控制CPU执行被加载程序中的一条指令,然后让它停下来,显示寄存器的状态。
Debug有特殊的能力吗?
我们只能说Debug利用了CPU提供的一种功能。
只有CPU提供了在执行一条指令后就转去做其他事情的功能,Debug或是其他的程序才能利用CPU提供的这种功能做出我们使用T命令时的效果。
好了,我们先来谈谈CPU是如何实现单步中断机制,然后再来简要地考虑一下Debug是如何利用CPU所提供的单步中断的功能的。
CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。
单步中断的中断类型码为1,则它所引发的中断过程如下:
(1)取得中断类型码1;
(2)标志寄存器入栈,TF、IF设置为0;
(3) CS、IP入栈;
(4)(IP)=(1*4),(CS)=(1*4+2)。
如上所述,如果TF=1,则执行一条指令后,CPU就要转去执行1号中断处理程序。
同样的道理,Debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。
在使用 T 命令执行指令时,Debug 将TF设置为 1,使得CPU在工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在屏幕上,并且等待输入命令。
总之,当TF=1时,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序。执行完中断处理程序后,又返回原来的位置继续……
我们再来看一下中断过程
(1)取得中断类型码N;
(2)标志寄存器入栈,TF=0、IF=0;
(3)CS、IP入栈;
(4)(IP) = (N*4),(CS) = (N*4+2)
最后,CPU提供单步中断功能的原因就是,为单步跟踪的执行过程,提供了实现机制。
响应中断的特殊情况
一般情况下,CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。
可是,在有些情况下,CPU 在执行完当前指令后,即便是发生中断,也不会响应。
对于这些情况,我们不一一列举,大家结合实际运用多加体会,这里我们举一种比较典型的情况来进行说明。
例如,在执行完向 ss寄存器传送数据的指令后,即便检测到中断信号,CPU 也不会响应。
这样做的主要原因是,ss:sp联合指向栈顶,而对它们的设置应该连续完成。
因为,如果在执行完设置ss的指令后,CPU响应中断,引发中断过程,要在栈中压入标志寄存器、CS和IP的值。
而ss改变,sp并未改变,ss:sp指向的不是正确的栈顶,将引起错误。
所以CPU在执行完设置ss的指令后,不响应中断。
这给连续设置 ss和sp,指向正确的栈顶提供了一个时机。
即,我们应该利用这个特性,将设置ss和sp的指令连续存放,使得设置sp的指令紧接着设置ss的指令执行,而在此之间,CPU不会引发中断过程。
比如,我们要将栈顶设为1000:0
mov ax,1000h
mov ax,1000h
好了,现在我们回过来看一下,实验2 中的“(3)下一条指令执行了吗?”。
现在你知道原因了吧? !
小甲鱼在干啥
如果您觉得小甲鱼的视频能够给您带来知识和快乐,您可以选择赞助我们,让我们可以持续为您推出更多精彩的原创编程教学^_^
手机用户打开支付宝钱包,扫描下方支付宝二维码即可:
电脑用户点击下方按钮即可跳转至支付宝转账页面:
感谢您对我们发展的支持和认可!
更多新鲜事儿
加载中……您所在的位置: &
3.3.5 单步异常(#DB)
3.3.5 单步异常(#DB)
电子工业出版社
《Windows内核设计思想》第3章Windows 内核调试设计,本章我们主要学习调试系统设计的整个流程,包括模拟调试系统和内核调试系统。本节为大家介绍单步异常(#DB)。
3.3.5 单步异常(#DB)
单步异常即单步指令引起的异常,比如WinDbg 中按F11 键单步执行一条指令产生的异常。eflags 寄存器的TF 位表示单步执行。当TF 为1 时,CPU 执行完一条指令后会产生单步异常,进入异常处理程序后TF 自动置0。每按一次F11 键,TF 执行一次置1,程序就可以每执行一条指令中断一次。异常代码:STATUS_SINGLE_STEP(0x)。
_declspec(naked)&_KiTrap01(){&_asm{ &push&0&//&压入伪错误代码 &ENTER_TRAP &and&dword&ptr&[ebp+KTRAP_FRAME.EFlags],&~EFLAGS_TF&//&0x100L &mov&ebx,&[ebp+KTRAP_FRAME.Eip]&//&指向单步位置 &mov&eax,&STATUS_SINGLE_STEP&//&0x &xor&ecx,&ecx &jmp&CommonDispatchException &}}&
由于没有错误代码提供,因此也需要压入特别设置的伪错误码。为预防单步中断再次触发,TF 标志必须去掉。
注意,远程调试器不能直接设置被调试的系统寄存器eflags,远程调试器是和调试引擎核心交互通信的。试想一下,如果远程调试器发送设置单步包,调试引擎核心收到后,马上对标志寄存器eflags 设置TF 位。设置完成后,调试引擎核心内部总是要执行的,再执行会立刻产生单步中断。执行控制再次来到_KiTrap01,之后会再次进入调试引擎核心,这样会出现什么状况呢?
无法估计,所以这种设计是不可行的。远程调试器和调试引擎核心的设计原则肯定会避免这种情况的出现,所以当我们在调试器手动设置TF 位时,没有任何反应,系统的标志寄存器eflags 原来是什么值就是什么值。但我们要知道当WinDbg 中按F11 键单步执行时调试引擎核心是如何处理的。
在WinDbg 中按F11 键单步执行,意味着WinDbg 暂时交出控制权,调试引擎核心必然要退出来,在退出之前调用KdpGetStateChange 函数设置&Context-&EFlags |= EFLAGS_TF&,这个Context 随后会设置栈框架的esp。我们看_KiExceptionExit 框架的最后一条指令iretd标志寄存器eflags 的值就是在这里重新设置的,那么TF 位就会置1,所以iretd 返回后,再执行就会因为TF 置位产生一个单步中断,又进入调试内核引擎核心,这样又将与远程调试器进行连接。我们知道这个过程是执行了一条指令的,eip 位置移动了一条指令的长度,指向下一条指令。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
中小卖家想做大,大卖家想做强,淘宝商家想迅速打开品牌知名度。
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 22人学习过讲师: 7人学习过讲师: 12人学习过
《期货操作策略》是一本面向期货投资者的入门书,分为
《电商网店推广实操》是一本推广书籍。《电商网店推广
《从零进阶!数据分析的统计基础(第2 版)》共7 章,
本书深刻揭示了Spring的技术内幕,对IoC、AOP、事务管理等根基性的技术进行了深度的挖掘。读者阅读本书后,不但可以熟练使用Spri
51CTO旗下网站}

我要回帖

更多关于 单步调试中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信