0%

《汇编语言》(第四版) 实验 12

《汇编语言(第四版)》 . 王爽著 . 清华大学出版社 . 2019

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

内中断

搞清楚几个概念
中断 - 中断源 - 中断类型码 - 中断向量表 - 中断过程 - 中断处理程序

对于 8086PC 机,中断向量表指定放在内存地址 0 处,从内存 0000:00000000:03FF 的 1024 个单元中存放着中断向量表

8086CPU 在收到中断信息后,引发中断过程
1)(从中断信息中)取得中断类型码 N
2)中断过程中需要改变标志寄存器的值,于是先将标志寄存器的值入栈(pushf)
3)设置标志寄存器的第 8 位 TF 和第 9 位 IF 的值为 0(TF=0, IF=0)
4)CS 的内容入栈(push CS)
5)IP 的内容入栈(push IP)
6)从内存地址为 N*4 和 N*4+2 的两个字单元中读取中断处理程序的入口地址设置 IP 和 CS(IP=N*4, CS=N*4+2)

中断处理程序的编写方法
1)保存用到的寄存器
2)处理中断
3)恢复用到的寄存器
4)用 iret 指令返回

1
2
3
iret                    ;pop IP
;pop CS
;popf

检测点 12.1

(1)三号中断源对应的中断处理程序的入口地址为:0070:018B
(2)存储 N 号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:4N(一个表项占两个字,四个字节)
存储 N 号中断源对应的中断处理程序入口的段地址的内存单元的地址为:4N+2

实验任务


要做以下几件事情

(1)编写可以显示 “divide error!” 的中断处理程序:do0;
(2)将 do0 送入内存 0000:0200 处;
(3)将 do0 的入口地址 0000:0200 存储在中断向量表 0 号表项中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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,0200h ;设置 es:di 指向目的地址
;找一块别的程序不会用到的内存区,将 do0 传送到其中
;从 0000:0200 至 0000:02FF 的 256 个字节的空间所对应的中断向量表项都是空的
;操作系统和其他应用程序都不占用

mov cx,offset do0end-offset do0 ;设置 cx 为传输长度
;(利用编译器来计算 do0 的长度)

cld ;设置传输方向为正
rep movsb ;串传送操作

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

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+33*2 ;设置 es:di 指向显存空间的中间位置

mov cx,13 ;设置 cx 为字符串长度

s: mov al,ds:[si]
mov es:[di],al ;将字符串送入显存空间,默认黑底白字
inc si
add di,2
loop s

mov ax,4c00h
int 21h

do0end: nop

code ends
end start

测试程序

1
2
3
4
5
6
7
8
9
10
11
assume cs:code
code segment
start: mov ax,4240h
mov dx,000fh
mov cx,0ah
div cx ;1000000/10

mov ax,4c00h
int 21h
code ends
end start
测试程序运行


汇编语言实验合集

汇编语言实验合集

实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
实验 2 用机器指令和汇编指令编程
实验 3 编程、编译、连接、跟踪
实验 4 [bx] 和 loop 的使用
实验 5 编写、调试具有多个段的程序
实验 6 实践课程中的程序
实验 7 寻址方式在结构化数据访问中的应用
实验 8 分析一个奇怪的程序
实验 9 根据材料编程
实验 10 编写子程序
课程设计 1
实验 11 编写子程序
实验 12 编写 0 号中断的处理程序
实验 13 编写、应用中断例程
实验 14 访问 CMOS RAM
实验 15 安装新的 int9 中断例程
实验 16 编写包含多个功能子程序的中断例程
实验 17 编写包含多个功能子程序的中断例程
课程设计 2