int指令02 - 零基础入门学习汇编语言65
第十三章:int指令02
让编程改变世界
Change the world by program
对int、iret和栈的深入理解
问题:用7ch中断例程完成 loop指令的功能。
loop s的执行需要两个信息:循环次数和到s的位移 所以,7ch中断例程要完成loop指令的功能,也需要这两个信息作为参数。 我们用cx存放循环次数,用bx存放位移。应用举例:在屏幕中间显示80个‘!’。
认识框架代码:相关代码下载 在上面的程序中,用int 7ch调用7ch中断例程进行转移,用 bx 传递转移的位移。分析,为了模拟loop指令,7ch中断例程应具备下面的功能:
(1)dec cx (2)如果(cx)≠0,转到标号s 处执行,否则向下执行。下面我们分析7ch中断例程如何实现到目的地址的转移:
(1)转到标号s显然应设(CS)=标号s的段地址,(IP)=标号s的偏移地址; (2)那么,中断例程如何得到标号s的段地址和偏移地址呢? (3)现在知道,可以从栈中直接和间接地得到标号s的段地址和偏移地址,那么如何用它们设置CS:IP呢? int 7ch引发中断过程后,进入 7ch 中断例程,在中断过程中,当前的标志寄存器、CS和IP都要压栈。 此时压入的CS和IP中的内容,分别是调用程序的段地址(可以认为是标号 s 的段地址)和int 7ch后一条指令的偏移地址(即标号se的偏移地址)。 可见,在中断例程中,可以从栈里取得标号s 的段地址和标号 se的偏移地址,而用标号se的偏移地址加上bx中存放的转移位移就可以得到标号s的偏移地址。 可以利用iret指令,我们将栈中的se的偏移地址加上 bx 中的转移位移,则栈中的se的偏移地址就变为了s的偏移地址。 我们再使用iret指令,用栈中的内容设置CS、IP,从而实现转移到标号s处。7ch中断例程如下:
lp:push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:pop bp
iret