• 实验十三_编写、应用中断例程_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.编程的时候最好先把框架搭建起来,里面可以有中文的描述(称其为伪代码),这样不易漏掉东西,比如就
        这个程序而言可能会忘了设置中断向量表.
  • 相关阅读:
    C# Linq Enumerable 技巧
    Winform 踩坑
    BootStrap Table
    java8+junit5实现并发测试(多线程)
    Junit5+REST-assured 做接口测试
    log4j的使用
    ASP.NET项目启用SSL
    hyper-v虚拟机内存占用过高
    C#使用qq邮箱的smtp服务发邮件
    CALayer设置圆角
  • 原文地址:https://www.cnblogs.com/xpjiang/p/4524432.html
Copyright © 2020-2023  润新知