实验十三_编写、应用中断例程_2 & 总结

来源:互联网 发布:猫鼠游戏结局知乎 编辑:程序博客网 时间:2024/06/07 00:42
编写并安装int 7ch中断例程,功能为完成loop指令的功能
参数:(cx)= 循环次数,(bx)= 位移
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后cs、ip和栈中的状态。
在屏幕中间显示80个‘!’
assume cs:code code segment start: mov ax,0b800h         mov es,ax         mov di,160*12         mov bx,offset s - offset se;设置从标号se到s的转移位移         mov cx,80    s:  mov byte ptr es:[di],'!'         add di,2         int 7ch                        ;如果(ch)!=0,转移到标号s处    se: nop         mov ax,4c00h         int 21h code ends end start ;--------------------int 7ch中断安装例程-------------------------------------- assume cs:code code segment start:mov ax,cs         mov ds,ax         mov si,offset sub_loop         mov ax,0         mov es,ax         mov di,200h         mov cx,offset sub_loopend - offset sub_loop         cld         rep movsb                  mov ax,0         mov es,ax         mov es:[7ch*4],200h         mov es:[7ch*4+2],0                  mov ax,4c00h         int 21h sub_loop:push bp         dec cx         jcxz ok         mov bp,sp         add ss:[bp+2],bx             ok:  pop bp          iret sub_loopend:nop code ends end start 
总结:
遇到的问题:无法显示字符串"!!!!!!(80个)"
解决方法:用测试程序调试,发现调用int 7ch中断例程后程序的指向不正确
    找到以下逻辑错误(非语法错误),都是中断例程安装时的问题:
        1.mov si,sub_loop 忘了offset操作符,反汇编了一下发现有无操作符offset对生成的机器码没有影响,
    程序照样能正确的跑起来.
        2.mov si,200h 应该改为mov di,200h,因为后边用了串传送指令,默认的目的地址在es:[di]中.
收获:   1.编写程序到底是一口气先写完了再添加注释,还是边写边添加注释,我自己的看法是前者节省时间,
    思路不易被打断,写完了会比较爽.但是出了问题查错比较麻烦,后者与其相反.到底采用哪种方式,还在思索中...
        2.编程的时候最好先把框架搭建起来,里面可以有中文的描述(称其为伪代码),这样不易漏掉东西,比如就
    这个程序而言可能会忘了设置中断向量表.
0 0