汇编语言(第3版,王爽著):实验12 编写 0 号中断的处理程序

实验12 编写 0 号中断的处理程序

1. 我们要做以下几个事情:

  1. 编写可以显示 "divide error!" 的中断处理程序:do0
  2. 将 do0 送入内存 0000:0200 处
  3. 将 do0 的入口地址 0000:0200 存储在中断向量表 0 号表项中
  4. 编写一个除法溢出的测试程序,用于触发除法错误,产生内中断

2. 代码实现:

文件名:exp12.asm

assume cs:code

code segment

    start:
        mov ax, cs
        mov ds, ax
        mov si, offset do0                      ; 设置 ds:si 指向源地址

        mov ax, 0
        mov es, ax
        mov di, 200h                            ; 设置 es:di 指向目的地址

        mov cx, offset do0end - offset do0      ; 设置 cx 为传输长度
        cld                                     ; 设置传输方向为正
        rep movsb

        ; 设置中断向量表
        mov ax, 0
        mov es, ax
        mov word ptr es:[0 * 4], 200h           ; 中断处理程序的偏移地址
        mov word ptr es:[0 * 4 + 2], 0h         ; 中断处理程序的段地址

        mov ax, 4c00h
        int 21h


    do0:
        jmp short do0start
        db "divide error!"
    do0start:
        mov ax, cs
        mov ds, ax
        mov si, 202h                            ; 设置 ds:si 指向字符串

        mov ax, 0b800h
        mov es, ax
        mov di, 12*160 + 36*2                   ; 设置 es:di 指向显存空间的中间位置

        mov cx, 13                              ; 设置 cx 为字符串的长度
    s:
        mov al, ds:[si]
        mov es:[di], al
        mov byte ptr es:[di + 1], 02h           ; 设置字符属性
        inc si
        add di, 2
        loop s

        mov ax, 4c00h
        int 21h


    do0end:
        nop

code ends

end start

3. 跟踪调试过程:

实验12 跟踪调试过程

4. 测试程序:

参考书本第 12 章中的例子,编写一个除法溢出的测试程序

文件名:exp12div.asm

assume cs:code

code segment
    start:
        mov ax, 1000h
        mov bh, 1
        div bh

        mov ax, 4c00h
        int 21h
code ends

end start

5. 测试程序的联调测试过程:

实验12 中断处理程序和测试程序联调测试过程

posted @ 2022-05-26 13:05  夏夜星空晚风  阅读(173)  评论(0编辑  收藏  举报