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

编写并安装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.编程的时候最好先把框架搭建起来,里面可以有中文的描述(称其为伪代码),这样不易漏掉东西,比如就
    这个程序而言可能会忘了设置中断向量表.
原文地址:https://www.cnblogs.com/xpjiang/p/4524432.html