汇编语言---关于int中断问题的思考

看着王爽老师的书-----对int,iret,和栈的深入理解

让用int中断实现loop循环

原版的代码:


这个是中断例程:




我想着能不能将26 行的dec cx 一句从中断例程中放置到外面,然后尝试了一下,

将dec cx 放在int 7ch下面

结果报了错,而且中断运行完后出现的是一段我程序中没有出现的代码


由于我用的是dosbox编写,以为是软件的问题,又把原版的拿出来,看见没有那一段程序

才确定是我修改以后的错误


然后我又将dec cx 放在 inc 7ch 上面,结果是成功了,于是很纳闷,为什么放在上面就可以成功

用debug跟踪后,发现到了中断以后,系统会将当前的ip,cs以及标志寄存器入栈保存,以便中断执行完后可以恢复现场,因为当前栈顶的元素依次为BP,IP,CS,标志寄存器


然后修改的时候,要用bp+2,指向IP,因为段地址都是相同的,只是偏移位移的不同,所以只修改ip,前面S 和Se 之间的位移我们已经算出,我们是用s减去的se

所以 bx中的值肯定是负值,加上ip后,会恰好指向S 从而实现了循环


界面中为什么会出现程序中没有的程序,因为修改IP的时候,多了一个 dec cx,多占了一个字节,然后导致bx中为FFF1(本来是FFF2),,本来S的偏移地址是 000E,由于多加了一个,算出来的IP是 000D,程序中上一个是mov  cx,000A,占三个字节,而且偏移地址是000B,所以当ip是 000D的时候会出现一些程序中没有的代码

你可能感兴趣的:(汇编语言---关于int中断问题的思考)