汇编从入门到入土八
中断处理的流程(牢记)

关于第三步
为什么要设置第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
也是可以执行的

