汇编中的内中断

          中断是指CPU不再接着向下执行,而是转去处理这个特殊信息,这个特殊信息可以是CPU外部发过来的或内部产生的一种特殊信息,CPU在收到中断信息后,应该转去执行该中断信息的处理程序。发生中断时, CPU会收到中断信息,中断信息中包含有标识中断源的类型码,通过中断类型码可以在中断向量表中找到对应的中断处理程序的入口地址。对于8086pc机,中断向量表指定放在内存地址的0处。中断处理完成后,CPU会去执行前面发生中断指令的对应的下一跳指令,所以发生中断时要先保存当前程序的运行环境,再跳到中断处理程序。

assume cs:code,ss:stack

stack segment
    dw 4 dup (0)
stack ends

code segment
;安装中断处理程序,将中断处理程序安在0000:0200
start:  mov ax,cs       
        mov ds,ax          ;设置ds:si指向源地址
        mov si,offset do0   ;offset do0相当于取do0的偏移地址
        mov ax,0
        mov es,ax
        mov di,200h          ;设置es:di指向目的地址
        mov cx,offset do0end-offset do0 ;设置传输的长度
        cld                   ;设置传输的方向为正,告诉程序向前移动
        rep movsb         ;将do0的代码送到0:200处,rep是循环传送

;设置中断向量表,我们的中断处理程序就加载在这个地址,div产生的中断类型码为0
        mov word ptr es:[0*4],200h   
        mov word ptr es:[0*4+2],0

;写检测程序
        mov dx,152
        mov ax,0
        mov cx,2
        div cx

;编写中断处理程序
do0:    jmp short do0start
        db 'divide error!'
do0start:mov ax,cs
        mov ax,cs
        mov ds,ax
        mov si,202h   ;设置ds:si指向字符串,前提是我们把程序安装在200h开始的内存中

        mov ax,0b800h ;设置es:di指向显存中的位置,下面的指令是对字符串做显色处理
        mov es,ax
        mov di,160*12+34*2

        mov cx,13     ;设置字符串的长度
dnext:  mov al,[si] 
        mov es:[di],al
        mov byte ptr es:[di+1],81h
        inc si
        add di,2
        loop dnext

        mov ah,4ch
        int 21h
do0end:nop 
code ends
end start

下面来debug一下上面的程序。

上面是rep movsb执行完后,内存0000:02000的结果,可以看到程序已经被送到这里了。

上面是设置了中断向量表之后的结果,00 00 02 00刚好是中断程序对应的段地址和偏移地址。

   

执行到div发生了中断,调用了中断处理程序。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值