0%

第五章_输入输出和中断程序设计

I/O指令

寻址方式

存储器寻址

  • 定义:

外设端口作为存储器中的一个地址

  • 优点:
  1. 指令多
  2. 不需要专门的输入输出指令
  • 缺点:

占用了内存空间

端口寻址

  • 定义:

通过专门的I/O端口

  • 优点:

不会占用内存空间,因为,I/O设备通过专用的端口地址进行访问。这些端口地址与内存地址空间是分开的,因此不会占用内存地址空间。

输入输出指令

只能使用AL或AX寄存器

间接输入输出指令

AL是8位,DX是16位,那么是不是觉得很奇怪为什么DX能送入AL?其实DX里面是一个地址,是将DX这个地址里指向的内容放入AL或者AX中

注:由于DX位外设端口地址,范围从0000H~0FFFFH,允许有65536个端口地址

举例1:

举例2:测试某状态寄存器(端口地址为27H)的第2位是否为1,若为1,则转移到ERROR进行处理。其指令序列为

1
2
3
IN AL, 27H
TEST AL, 00000100B
JNZ ERROR

举例3:将某接口的命令寄存器(端口地址为126H)的第7位控制成组数据传送

因为一个字节能表示的无符号数范围是从0~255,126H > 255,所以无法直接使用立即数,而是要将126H先放到DX寄存器里

1
2
3
4
MOV DX, 126H
IN AL, DX
OR AL, 80H
OUT DX, AL

举例4:利用程序查询方式进行串口通信的程序

计算机串行数据端口地址为3F8H,状态寄存器地址是3FDH。

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

;输入子程序
TELI PROC FAR ;查询读入数据
PUSH DX
MOV DX, 03FDH
TEL1:
IN AL, DX ;读入端口状态
TEST AL, 01 ;测试
JZ TEL1 ;未准备好,循环查询
MOV DX, 03F8H ;准备好,读入数据
IN AL, DX
POP DX
RET
TELI ENDP

TELO PROC FAR ;输出子程序
PUSH DX
PUSH AX
MOV DX, 03FDH
TELO1:
IN AL, DX ;读入端口状态
TEST AL, 20H ;测试
JZ TELO1 ;第5位为1,发送寄存器空,继续等待
MOV DX, 03F8H ;发送寄存器不空,输出数据
OUT DX, AL
POP AX
POP DX
RET
TELO ENDP

中断传送

中断分类

中断向量表

四个单元组成一个向量

中断向量表地址分配

中断响应过程

  1. 取中断类型号N;

  2. 标志寄存器(PSW)内容压栈;

  3. 当前代码段寄存器(CS)内容压栈;

  4. 当前指令指针(IP)内容压栈;

  5. 禁止外部中断和单步中断(置IF=0,TF=0);

  6. 从中断向量表中取4×n的字内容送IP,取4×n+2的字内容送CS;

  7. 转中断处理程序。

注:中断过程与子程序调用的区别: 除了保护返回地址CS:IP之外,还保存标志寄存器PSW的内容。

在中断发生时CPU自动清除了IF和TF

中断处理程序返回时使用IRET指令

中断优先级

中断处理程序

设置中断向量

共同点:设置中断向量的时候规定格式是DS:DX

手搓

  1. 先根据中断号计算在中断向量表中的偏移地址(如果已知要将当前中断子程序作为第N号中断,那么它在中断向量表中的位置是4 * N,设置BX = 4 * N)
  2. 关中断
  3. 分别设置段地址和偏移地址
  4. 开中断
1
2
3
4
5
6
7
MOV	AX,0
MOV DS,AX
MOV BX,N*4 ;设置N号中断向量
CLI ;关中断
MOV WORD PTR[BX],OFFSET INTHAND ;置偏移
MOV WORD PTR[BX+2],SEG INTHAND ;置段值
STI ;开中断

注:INTHAND表示被调用的中断处理程序

DOS功能调用25号功能

入口参数:

  • AL :中断号
  • DS:中断子程序段地址
  • DX:中断子程序偏移地址

调用过程

  1. 将中断子程序的段地址通过AX赋给DS
  2. 将中断子程序的偏移地址副歌DX
  3. 调用25H号功能,设置AH=25H
  4. 将这个中断子程序对应的中断号写入AL
  5. 调用21H中断实现将中断向量写入中断向量表

举例:

1
2
3
4
5
6
7
INTHAND:
MOV AX,SEG INTHAND ;中断处理程序的段地址
MOV DS,AX
MOV DX,OFFSET INTHAND ;中断处理程序的偏移地址
MOV AH,25H
MOV AL,N
INT 21H

获取中断向量

获取中断向量的时候固定格式是ES:BX

手搓

  1. 根据中断号计算在中断向量表中的偏移地址
  2. 将ES:[中断向量表中的偏移地址]作为偏移地址,将ES:[中断向量表中的偏移地址作为偏移地址+2]作为段地址
1
2
3
4
5
6
7
8
9
10
【例5-5-3】利用直接读取法读取n号中断向量,并保存在双字变量OLDVECTOR中:
……
XOR AX,AX
MOV ES,AX
MOV AX,ES:[n*4] ;取偏移地址
MOV WORD PTR OLDVECTOR,AX ;保存
MOV AX,ES:[n*4+2] ;取段地址
MOV WORD PTR OLDVECTOR+2,AX ;保存
……

DOS功能调用35号功能

入口参数: 中断号

出口参数

  • ES:中断子程序的段地址
  • BX:中断子程序的偏移地址

调用过程

  1. 调用35H号功能
  2. 将AL设置为中断号n
  3. 调用21H号中断
  4. 从BX中取出中断子程序的偏移地址,从ES中取出中断子程序的段地址
1
2
3
4
5
6
7
8
9
10
【例5-5-4】使用DOS功能调用取得n号中断的中断向量
……
MOV AH,35H
MOV AL,n ;中断类型号为n
INT 21H ;中断向量在ES:BX中
MOV WORD PTR OLDVECTOR,BX
MOV WORD PTR OLDVECTOR+2,ES

……