第十三章 int指令
第十四章 端口
第十三章 int 指令
int 指令可以引发中断
13.1 int 指令
int n
功能:引发 n 号中断
13.2 编写供应用程序调用的中断例程
问题一:编写、安装中断7ch的中断例程
功能:求一 word 型数据的平方
参数:(ax)=要计算的数据
返回值:dx 存放高16位,ax 存放低16位
应用举例:求 2*3456^2
程序框架如下:
1 | assume cs:code |
同样的,我们还是要完成以下这些工作:
- 编写求平方功能的函数
- 在 0000:0200 处安装程序
- 设置中断向量表,将程序的入口地址保存在 7ch 表项中,使其成为中断处理程序
安装程序的程序如下:
1 | assume cs:code |
13.3 对 int、iret 和 栈 的深入理解
问题:用 7ch 中断例程完成 loop 指令的功能
应用举例:在屏幕中间显示80个 ‘!’
1 | assume cs:code |
7ch 中断处理程序如下:
1 | 1p: push bp |
检测点13.1
- 在上面的内容中,我们用 7ch 中断例程实现 loop 的功能,则上面的 7ch 中断例程所能进行的最大转移位移是多少?
16位寄存器能表示的有符号数的范围,-32768~32767
- 用 7ch 中断例程完成
jmp near ptr s
指令的功能,用 bx 向中断例程传送转移位移
应用举例:在屏幕的第12行,显示 data 段中以 0 结尾的字符串
1 | assume cs:code |
中断例程:
1 | jnp: push bp |
13.4 BIOS 和 DOS 所提供的中断例程
在系统板的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BIOS中主要包含以下几部分内容:
(1)硬件系统的检测和初始化程序;
(2)外部中断(第15章中进行讲解)和内部中断的中断例程;
(3)用于对硬件设备进行I/O操作的中断例程;
(4)其他和硬件系统相关的中断例程。
13.5 BIOS 和 DOS 中断例程的安装过程
(1)开机后,CPU一加电,初始化 (CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0 处有一条转跳指令,CPU 执行该指令后,转去执行 BIOS 中的硬件系统检测和初始化程序。
(2)初始化程序将建立 BIOS 所支持的中断向量,即将 BIOS 提供的中断例程的入口地址登记在中断向量表中。注意,对于 BIOS 所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到 ROM 中的程序,一直在内存中存在。
(3)硬件系统检测和初始化完成后,调用int 19h
进行操作系统的引导。从此将计算机交由操作系统控制。
(4)DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
检测点 13.2
判断下面说法的正误:
- 我们可以编程改变 FFFF:0 处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序
错误。仅仅靠编程(软件)是不行的,还要硬件支持
int 19h
中断例程,可以由DOS提供
错误。如果 19h 中断例程是由DOS 提供的话,BIOS在完成它自己的工作后就没办法把控制权交给DOS了
13.6 BIOS 中断例程应用
设置光标:
1 | mov ah,2 ;置光标 |
显示字符:
1 | mov ah,9 ;在光标位置显示字符 |
在屏幕的 5行12列 显示 3 个 红底高亮闪烁绿色 的 ‘a’
1 | assume cs:code |
13.7 DOS 中断例程应用
实验十三 编写、应用中断例程
- 编写并安装
int 7ch
中断例程,功能为显示一个用 0结束的字符串,中断例程安装在 0:200 处
参数:(dh) = 行号,(dl) = 列号,(cl) = 颜色,ds:si 指向字符串首地址
1 | assume cs:codesg |
测试程序:
1 | assume cs:code |
运行结果:

- 下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序
1 | assume cs:code |
运行结果:

第十四章 端口
在PC机系统中,和CPU通过总线相连的芯片除各种存储器外,还有以下3种芯片
(1)各种接口卡(比如,网卡、显卡)上的接口芯片,它们控制接口卡进行工作;
(2)主板上的接口芯片,CPU通过它们对部分外设进行访问;
(3)其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。在这些芯片中,都有一组可以由CPU读写的寄存器。这些寄存器,它们在物理上可能处于不同的芯片中,但是它们在以下两点上相同:
(1)都和CPU的总线相连,当然这种连接是通过它们所在的芯片进行的;
(2)CPU对它们进行读或写的时候都通过控制线向它们所在的芯片发出端口读写命令。可见,从CPU的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间。每一个端口在地址空间中都有一个地址
CPU可以直接读写以下3个地方的数据
(1)CPU内部的寄存器;
(2)内存单元;
(3)端口。
操作端口是为了操作不同芯片上的寄存器
14.1 端口的读写
对端口的读写不能用mov、push、pop等内存读写指令。端口的读写指令只有两条:in
和 out
,分别用于从端口读取数据和往端口写入数据。
访问端口时总线上的信息
1 | in al,60h ;从 60h 号端口读入一个字节 |
① CPU通过地址线将地址信息 60h 发出;
② CPU通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读取数据;
③ 端口所在的芯片将 60h 端口中的数据通过数据线送入CPU。
注意,在 in 和 out 指令中,只能使用 ax 或 al 来存放从端口中读入的数据或要发送到端口中的数据。
访问8位端口时用al,访问16位端口时用ax
对 0~255 以内的端口进行读写时:
1
2 in al,20h ;从20h端口读入一个字节
out 20h,al ;往20h端口写入一个字节对256~65535的端口进行读写时,端口号放在dx中:
1
2
3 mov dx,3f8h ;将端口号3f8h送入dx
in al,dx ;从3f8h端口读入一个字节
out dx,al ;向3f8h端口写入一个字节
14.2 CMOS RAM 芯片
CMOS RAM 芯片的特征如下:
(1)包含一个实时钟和一个有128个存储单元的RAM存储器(早期的计算机为64个字节)。
(2)该芯片靠电池供电。所以,关机后其内部的实时钟仍可正常工作,RAM中的信息不丢失。
(3)128个字节的RAM中,内部实时钟占用 0~0dh 单元来保存时间信息,其余大部分单元用于保存系统配置信息,供系统启动时BIOS程序读取。BIOS也提供了相关的程序,使我们可以在开机的时候配置 CMOS RAM 中的系统信息。
(4)该芯片内部有两个端口,端口地址为 70h 和 71h。CPU通过这两个端口来读写 CMOS RAM
(5)70h 为地址端口,存放要访问的 CMOS RAM单元的地址;71h 为数据端口,存放从选定的 CMOS RAM 单元中读取的数据,或要写入到其中的数据。可见,CPU对 CMOS RAM 的读写分两步进行,比如,读 CMOS RAM 的2号单元:
① 将 2 送入端口 70h;
② 从端口 71h 读出2号单元的内容。
检测点 14.1
- 编程,读取 CMOS RAM 的2号单元的内容
1 | mov al,2 |
- 编程,向 CMOS RAM 的 2 号单元写入 0
1 | mov al,0 |
14.3 shl 和 shr 指令
shl
逻辑左移,功能是:
(1)将一个寄存器或内存单元中的数据向左移位;
(2)将最后移出的一位写入CF中;
(3)最低位用0补充。
如果移动的位数大于1,必须将移动的位数放在 cl 中
1 | mov al,01010001b |
shr
是逻辑右移指令,它和 shl
所进行的操作刚好相反
(1)将一个寄存器或内存单元中的数据向右移位;
(2)将最后移出的一位写入CF中;
(3)最高位用0补充。
同样的,如果移动的位数大于1,必须将移动的位数放在 cl 中
检测点 14.2
编程,用加法和移位指令计算 (ax)=(ax)*10
1 | mov bx,ax |
14.4 CMOS RAM 中存储的时间信息
这一节全部摘抄
在 CMOS RAM 中,存放着当前的时间:年、月、日、时、分、秒。这 6 个信息的长度都为 1 个字节,存放单元为:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD码的形式存放
![]()
编程,在屏幕中间显示当前的月份
1 | assume cs:code |
实验 十四 访问 CMOS RAM
编程,以 ”年/月/日 时:分:秒“ 的格式显示当前的日期和时间
我打算一个一个字符写入
1 | assume cs:codesg |
运行结果:
