Raye's Journey

汇编从入门到入土八

中断处理的流程(牢记)

关于第三步

为什么要设置第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

也是可以执行的


>  cd ..