| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1166 人关注过本帖
标题:汇编关于中断求解
只看楼主 加入收藏
jsjscool
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-3-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
汇编关于中断求解
int9:push ax
push bx
push es
in al,60h
pushf
call dword ptr ds:[0]

cmp al,1
jne int9ret
…………
…………
int9ret:pop es
pop bx
pop ax
iret

外中断,ds:[0],和ds:[2]储存着int 9对应的地址……

1.call之后不是会自己ret了吗??那iret用到的cs,ip哪来的?
2.如果直接跳到int9ret,那pop es,es的数据应该是pushf入栈时的数据啊?那es不是就恢复不到原始数据了?

搜索更多相关主题的帖子: 数据 
2011-03-05 23:06
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:10 
看来王爽老师的书确实是基础中的基础呀!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-05 23:25
jsjscool
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-3-5
收藏
得分:0 
回复 2楼 ansic
能不能帮我解答下
2011-03-05 23:32
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
第一,你可以详读王爽老师的书里关于call/ret的详细讲解(第十章)。
第二,在子程序中开始压入栈的寄存器的值都是要在子程序里被使用的,故此才需要保护现场。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-05 23:46
jsjscool
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-3-5
收藏
得分:0 
回复 4楼 ansic
第2个我不是问这个……那这样你告诉我pop es之前栈顶的数据是什么??
2011-03-06 00:17
jsjscool
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-3-5
收藏
得分:0 
泪奔……我的问题解决了,对这位仁兄膜拜,大家看看
http://www.
2011-03-06 01:12
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:10 
以下是引用jsjscool在2011-3-6 01:12:57的发言:

泪奔……我的问题解决了,对这位仁兄膜拜,大家看看
http://www.
1. 看过了,没觉得写的东西有什么特别好
2. call之后不是会自己ret了吗?----------------------------------------会自己ret是什么意思?不理解,如果call会自己ret,那还要ret指令干吗?
3. 如果直接跳到int9ret,那pop es,es的数据应该是pushf入栈时的数据啊?那es不是就恢复不到原始数据了?----------------所以让你往前看书,子程序的调用和中断的过程有什么不一样的地方,你就没明白.
和直接跳到int9ret什么的,完全就没关系,这段有栈上的操作?会影响pop es?
iret和ret的区别再看看吧.
call和int的区别再看看吧.

归根到底,你的问题就是认为call就是call,call里面做了什么你也不知道,call->ret方式.
根本没搞懂中断方式的过程,所以你没看懂王老师是怎么模拟的,所以你也不清楚pushf call->iret方式.
书上都有讲.





技术问题,请不要以短消息方式提问
2011-03-06 14:44
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
这些问题多DEBUG几次就知道了,什么方式不方式的都不用去记,不过能问问题还是好的.

技术问题,请不要以短消息方式提问
2011-03-06 14:46
jsjscool
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-3-5
收藏
得分:0 
回复 7楼 zaixuexi
pushf不是入栈??这篇文章就说了call到原来的中断地址之后会有一个iret,所以正好抵消。
2011-03-07 18:36
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
以下是引用jsjscool在2011-3-7 18:36:21的发言:

pushf不是入栈??这篇文章就说了call到原来的中断地址之后会有一个iret,所以正好抵消。


简单的说,
call ≠ int
ret  ≠ iret

call 通常是指用户编写的子程序 ,与之配套的是ret;而int N 则指的是bios/dos中断, 中断例程里是用iret返回调用者的。pushf/popf通常用于编写外部中断的时候由于PSW发生变化所以才需要保存/恢复。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-07 21:09
快速回复:汇编关于中断求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040465 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved