注册 登录
编程论坛 汇编论坛

汇编关于中断求解

jsjscool 发布于 2011-03-05 23:06, 1166 次点击
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不是就恢复不到原始数据了?

10 回复
#2
ansic2011-03-05 23:25
看来王爽老师的书确实是基础中的基础呀!
#3
jsjscool2011-03-05 23:32
回复 2楼 ansic
能不能帮我解答下
#4
ansic2011-03-05 23:46
第一,你可以详读王爽老师的书里关于call/ret的详细讲解(第十章)。
第二,在子程序中开始压入栈的寄存器的值都是要在子程序里被使用的,故此才需要保护现场。
#5
jsjscool2011-03-06 00:17
回复 4楼 ansic
第2个我不是问这个……那这样你告诉我pop es之前栈顶的数据是什么??
#6
jsjscool2011-03-06 01:12
泪奔……我的问题解决了,对这位仁兄膜拜,大家看看
http://www.
#7
zaixuexi2011-03-06 14:44
以下是引用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方式.
书上都有讲.




#8
zaixuexi2011-03-06 14:46
这些问题多DEBUG几次就知道了,什么方式不方式的都不用去记,不过能问问题还是好的.
#9
jsjscool2011-03-07 18:36
回复 7楼 zaixuexi
pushf不是入栈??这篇文章就说了call到原来的中断地址之后会有一个iret,所以正好抵消。
#10
ansic2011-03-07 21:09
以下是引用jsjscool在2011-3-7 18:36:21的发言:

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


简单的说,
call ≠ int
ret  ≠ iret

call 通常是指用户编写的子程序 ,与之配套的是ret;而int N 则指的是bios/dos中断, 中断例程里是用iret返回调用者的。pushf/popf通常用于编写外部中断的时候由于PSW发生变化所以才需要保存/恢复。
#11
zaixuexi2011-03-07 22:48
以下是引用jsjscool在2011-3-7 18:36:21的发言:

pushf不是入栈??这篇文章就说了call到原来的中断地址之后会有一个iret,所以正好抵消。
所以我才说你没仔细看过书,或看了就过了
你再看看书前面是怎么说的,IRQ方式的中断你有没搞懂?
为什么call到原来的中断服务例程会有iret,这些根本就没必要看别人的分析.
我的感觉是那人也是没仔细看书才会那样去分析.
[pushf call 原中断服务例程]    到底模拟了什么的过程?
中断服务例程和普通的子程序有什么区别?
这些书上都有交代的吧.
1