zoukankan      html  css  js  c++  java
  • 汇编语言实验:编写0号中断处理程序

    汇编语言实验:编写0号中断处理程序

    任务:编写0号中断处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回操作系统。

    下面写给出效果,再给出实现代码,最后给出设计思路(为什么这样做呢?因为本次实验没有任何难度,改编之前的示范程序就可以了,我也偷个懒,不写注释了)

    这里写图片描述

    实现代码如下:

    assume      cs:code,ss:stack
    
    stack       segment
        db  512 dup(?)
    stack       ends
    
    code        segment
    
    main:           mov     ax,stack
                    mov     ss,ax
                    mov     sp,512
                    mov     ax,0
                    mov     ds,ax
    
                    call    install_do0
    
                    mov     ax,1000h
                    mov     bh,0
                    div     bh
    
    
                    mov     ax,4c00h
                    int     21h
    ;***********************************************************
    install_do0:    push    ax
                    push    cx
                    push    ds
                    push    es
                    push    si
                    push    di
    
                    mov     ax,0
                    mov     es,ax
                    mov     di,200h
    
                    mov     ax,cs
                    mov     ds,ax
                    mov     si,offset do0
                    mov     cx,offset install_end - offset do0
                    cld
                    rep     movsb
    
                    mov     ax,0
                    mov     es,ax
                    mov     word ptr es:[0*4],200h
                    mov     word ptr es:[0*4+2],0
    
                    jmp     near ptr install_end
    ;------------------------------------------------------------
    do0:            jmp     short do0_start
                    db 'divide error!'
        do0_start:  mov     ax,cs
                    mov     ds,ax
                    mov     si,202h
    
                    mov     ax,0b800h
                    mov     es,ax
                    mov     di,10*160+20*2
    
                    mov     cx,13
        s:          mov     al,[si]
                    mov     es:[di],al
                    mov     byte ptr es:[di+1],2
                    inc     si
                    add     di,2
                    loop    s
    
                    mov     ax,4c00h
                    int     21h
    ;------------------------------------------------------------
    install_end:    pop     di
                    pop     si
                    pop     es
                    pop     ds
                    pop     cx
                    pop     ax
                    ret
    code        ends
    
    end     main
    

    中断的过程其实很容易理解,概括的说就是CPU自己完成一下操作
    1. 取得中断类型码N
    2. pushf, 标志寄存器压栈
    3. 设置标志为TF=0,IF=0
    4. push CS,将CS压栈
    5. push IP,将IP压栈
    6. 设置IP,CS为中断向量表存放的地址,也就是使(IP) = (N*4),
    (CS) = (N*4+2)

    至于编写中断处理程序,和编写普通的子程序没有多大区别:
    1. 保存用到的寄存器
    2. 处理中断
    3. 恢复寄存器
    4. iret 返回
    其中,iret 指令相当于先retf ,然后popf

    这里我在编写0号中断处理程序do0时,直接返回操作系统,没有使用iret,因为我在debug中调试时,发现中断过程发生时,堆栈区存入的CS,IP指向的仍然时div bh 指令(这不是玩我吗),所以干脆在do0中直接返回操作系统算了。

    最后,总结一下我此次实验的思路:

    • 首先,编写安装子程序install_do0,功能是将中断处理程序do0安装到内存空间0:0200~0:02FF(中断向量表中的空余表项,没有任何信息,是一段安全空间)中。
    • 在子程序install_do0中,修改中断向量表,使得0号中断发生时,可以执行程序do0(do0程序的代码就在子程序install_do0中,只不过作为数据传送到目的地址中,没有被执行罢了,这也充分说明了代码和数据没有本质的区别)

    好了,总算是把王爽的教材中“内中断”的部分学习完了,任务也算基本完成了。可以继续学习新的内容了,我在学习汇编的路上越走越远……

  • 相关阅读:
    ubuntu 制做samba
    《Programming WPF》翻译 第4章 前言
    《Programming WPF》翻译 第4章 3.绑定到数据列表
    《Programming WPF》翻译 第4章 4.数据源
    《Programming WPF》翻译 第5章 6.触发器
    《Programming WPF》翻译 第4章 2.数据绑定
    《Programming WPF》翻译 第4章 1.不使用数据绑定
    《Programming WPF》翻译 第5章 7.控件模板
    《Programming WPF》翻译 第5章 8.我们进行到哪里了?
    《Programming WPF》翻译 第5章 5.数据模板和样式
  • 原文地址:https://www.cnblogs.com/wyf12138/p/6581526.html
Copyright © 2011-2022 走看看