I/O指令
寻址方式
存储器寻址
- 定义:
外设端口作为存储器中的一个地址
- 优点:
- 指令多
- 不需要专门的输入输出指令
- 缺点:
占用了内存空间
端口寻址
- 定义:
通过专门的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 | IN AL, 27H |
举例3:将某接口的命令寄存器(端口地址为126H)的第7位控制成组数据传送
因为一个字节能表示的无符号数范围是从0~255,126H > 255,所以无法直接使用立即数,而是要将126H先放到DX寄存器里
1 | MOV DX, 126H |
举例4:利用程序查询方式进行串口通信的程序
计算机串行数据端口地址为3F8H,状态寄存器地址是3FDH。
1 |
|
中断传送
中断分类
中断向量表
四个单元组成一个向量
中断向量表地址分配
中断响应过程
取中断类型号N;
标志寄存器(PSW)内容压栈;
当前代码段寄存器(CS)内容压栈;
当前指令指针(IP)内容压栈;
禁止外部中断和单步中断(置IF=0,TF=0);
从中断向量表中取4×n的字内容送IP,取4×n+2的字内容送CS;
转中断处理程序。
注:中断过程与子程序调用的区别: 除了保护返回地址CS:IP之外,还保存标志寄存器PSW的内容。
在中断发生时CPU自动清除了IF和TF
中断处理程序返回时使用IRET指令
中断优先级
中断处理程序
设置中断向量
共同点:设置中断向量的时候规定格式是DS:DX
手搓
- 先根据中断号计算在中断向量表中的偏移地址(如果已知要将当前中断子程序作为第N号中断,那么它在中断向量表中的位置是4 * N,设置BX = 4 * N)
- 关中断
- 分别设置段地址和偏移地址
- 开中断
1 | MOV AX,0 |
注:INTHAND表示被调用的中断处理程序
DOS功能调用25号功能
入口参数:
- AL :中断号
- DS:中断子程序段地址
- DX:中断子程序偏移地址
调用过程
- 将中断子程序的段地址通过AX赋给DS
- 将中断子程序的偏移地址副歌DX
- 调用25H号功能,设置AH=25H
- 将这个中断子程序对应的中断号写入AL
- 调用21H中断实现将中断向量写入中断向量表
举例:
1 | INTHAND: |
获取中断向量
获取中断向量的时候固定格式是ES:BX
手搓
- 根据中断号计算在中断向量表中的偏移地址
- 将ES:[中断向量表中的偏移地址]作为偏移地址,将ES:[中断向量表中的偏移地址作为偏移地址+2]作为段地址
1 | 【例5-5-3】利用直接读取法读取n号中断向量,并保存在双字变量OLDVECTOR中: |
DOS功能调用35号功能
入口参数: 中断号
出口参数
- ES:中断子程序的段地址
- BX:中断子程序的偏移地址
调用过程
- 调用35H号功能
- 将AL设置为中断号n
- 调用21H号中断
- 从BX中取出中断子程序的偏移地址,从ES中取出中断子程序的段地址
1 | 【例5-5-4】使用DOS功能调用取得n号中断的中断向量 |