中断处理的流程(牢记)

关于第三步

为什么要设置第8位 TF?

这就涉及到debug程序的原理:

debug的原理,通过设置 TF 为1,引发单步中断去执行debug准备好的中断代码

但是这样会有问题,在处理中断的时候是不能去触发单步中断的,所以CPU要提前设置TF为0

中断过程具体的操作

lab12

代码如下:

assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do0

mov ax,0
mov es,ax
mov di,200H

mov cx,offset do0end-offset do0

rep movsb

mov ax,0
mov es,ax
mov word ptr es:[0],200H
mov word ptr es:[2],0

mov ax, 1000h
mov bh, 1
div bh
mov ax,4C00H
int 21H

do0:
jmp short do0start
db "divide error!"
do0start:
mov ax,cs
mov ds,ax
mov si,202H
mov ax,0B800H
mov es,ax
mov di,12*160+33*2;这里要注意一下,不能因为字符串长度为13,为了居中输出就设置成12*160+67,会出现意想不到的情况
mov cx,13
s:
mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4C00H
int 21H
do0end:nop
code ends
end start

通过 offset 获得偏移地址

通过 rep movsb 来拷贝 do0 程序

这里特别注意,do0 要使用的字符串必须存储在 do0 子程序中,并且需要手动计算一下字符串的位置

当然最后还需要来触发这个中断

mov ax, 1000h
mov bh, 1
div bh

如果直接存放原来data中的位置

assume cs:code

data segment
db "overflow!"
data ends

code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do0

mov ax,0
mov es,ax
mov di,200H

mov cx,offset do0end-offset do0

rep movsb

mov ax,0
mov es,ax
mov word ptr es:[0],200H
mov word ptr es:[2],0

mov ax, 1000h
mov bh, 1
div bh
mov ax,4C00H
int 21H

do0:
mov ax,data
mov ds,ax
mov si,0
mov ax,0B800H
mov es,ax
mov di,12*160+33*2
mov cx,13
s:
mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4C00H
int 21H
do0end:nop
code ends
end start

也是可以执行的