汇编从入门到入土八

  1. 中断处理的流程(牢记)
  2. lab12

中断处理的流程(牢记)

关于第三步

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

也是可以执行的


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论

文章标题:汇编从入门到入土八

文章字数:503

本文作者:prontosil

发布时间:2020-04-29, 11:03:16

最后更新:2020-04-29, 11:38:14

原始链接:http://prontosil.com/posts/90d750b6/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录