HelloWorld123 发表于 2013-1-5 21:46:15

关于内中断,请大牛解惑

书中13.1的问题一、问题二 的中断程序7ch中安装 中断程序之后都有一个
mov ax,4c00h
mov 21h
这段代码不是返回上级程序的吗
也就是说这个 中断程序的运行流程是这样的吗?
debug=》实例程序=》中断=》(子程序)中断程序初始化=》(实例程序)返回=》0:200h 处代码

HelloWorld123 发表于 2013-1-5 22:03:06

所以说 内中断 的执行顺序是
1 取得中断代码类型n;
进行初始化程序
2 标志寄存器入栈
3 CS IP入栈
4 IP=(N*4) CS=(N*4+2)
5 执行CS IP中代码
6 iret
7 cs ip出栈 标志寄存器出栈
8 继续执行int 后代码

即是说如果我在中断之前给ax赋值为1
而在安装程序中改变ax值为2

我在执行中断程序的时候ax的值是多少?

小新110 发表于 2013-1-6 09:40:44

mov ax,4c00h
mov 21h错了
正确的是:mov ax,4c00h
int 21h

小新110 发表于 2013-1-6 10:16:39

mov ax,4c00h
int 21h表示程序执行21号中断例程的4ch号功能,功能为程序返回,可以提供返回值作为参数,ah是功能号,al里面是参数。
以上也可写为:mov ah,4ch   ;程序返回功能
mov al,0                  ;返回值
int 21h相关内容可以在13.7找到

小新110 发表于 2013-1-6 10:32:01

HelloWorld123 发表于 2013-1-5 22:03 static/image/common/back.gif
所以说 内中断 的执行顺序是
1 取得中断代码类型n;
进行初始化程序


你这个是专指int中断,内中断还有其他方式可以触发的,总共有4种方式,具体内容见12.1
int n指令相当于引发一个n号中断的中断过程,过程如下:
1、取中断类型码n;
2、标志寄存器入栈,IF=0,TF=0;
3、CS、IP入栈;
4、IP=(N*4) CS=(N*4+2)
5、执行中断
6、iret (此命令的意思就是你所说的第七步,不过注意顺序,汇编代码是)
iretpop IP
pop CS
popf就是说IP出栈,CS出栈,标志寄存器出栈,刚好和入栈顺序相反
iret的详细解释见:12.5

现学现卖,献丑了。兄弟学的够深的,在这之前我还没涉猎呢,只是初步了解,汗。

HelloWorld123 发表于 2013-1-6 21:53:34

1 除法溢出中断是 貌似调用的 int 0
2 单步中段 貌似调用的是int 1
3 into 指令
4 int 指令
因为1 2 号中断对应的中断向量表地址分别为0:2 0:0 0:6 0:4
所以cpu 的内中断机制分为 int into两种也不为过吧
我记得视频中有直接调用int 0 就执行除法溢出中断的片段

HelloWorld123 发表于 2013-1-6 21:58:28

还有那个问题我想通了
中断安装程序中的功能性代码只是以数据形式存储在0:200段中
安装程序只是把这些代码写入内存 并没有执行 然后调用int 21h 返回DOS
然后在执行程序中执行int 7ch的时候去调用0:200中存储的新int 7ch代码
安装程序和执行程序是两个程序
所以在安装程序中的ax值 不会影响执行程序中ax的值
页: [1]
查看完整版本: 关于内中断,请大牛解惑