PC 机 8237A 通道 2 传送的内存起始地址为 C8020H,请给其地址寄存器编程。
时间: 2024-03-10 16:48:51 浏览: 27
8237A是Intel推出的DMA控制器,它可以通过编程来实现数据传输。在PC机中,最常用的是8237A通道2,该通道连接主机内存和外设,可以用于高速数据传输。
要设置8237A通道2传送数据,需要对其地址寄存器进行编程。地址寄存器是一个16位寄存器,用于存储内存地址。
具体编程如下:
1. 将地址寄存器的高8位和低8位分别设置为内存起始地址的高8位和低8位。
```
mov dx, 0810h ; 将DX设置为地址寄存器的地址
mov ax, 0C802h ; 将AX设置为内存起始地址
out dx, ax ; 将AX中的值输出到地址寄存器中
```
在上述代码中,`dx` 寄存器中的值为地址寄存器的地址,`ax` 寄存器中的值为内存起始地址。首先将 `dx` 设置为地址寄存器的地址,然后将 `ax` 中的值输出到地址寄存器中。
2. 等待DMA控制器完成传输操作。
在向DMA控制器发出传输命令之前,需要等待DMA控制器完成前一次的传输操作。这可以通过检测DMA控制器的状态寄存器来实现。具体编程如下:
```
wait:
in al, 0fh ; 从状态寄存器中读取状态值
and al, 01000000b ; 判断通道2是否空闲
jnz wait ; 如果通道2不空闲,继续等待
```
在上述代码中,`in al, 0fh` 从状态寄存器中读取状态值,`and al, 01000000b` 则判断通道2是否空闲,如果通道2不空闲,则继续等待。
完成上述两个步骤后,就可以开始向外设传送数据了。
相关问题
已知在IBM Pc中,使用了8088 CPU和 一片8237 DMA控制器.并用8237 DMA控制器的通2道控制软盘的读写。假没需要从软盘读取 4kb的数据,将其放入到内存起始地址为28086H的缓冲区中,采用单字节增量 方式、正常时序。请给出施满足上述要求,对8237通道2初始化程序段。
对8237 DMA控制器进行初始化,可以采取以下步骤:
1. 设置控制字寄存器(Command Word Register,CWR)。
控制字寄存器的格式为:
Bit 0-2: 传输方式,01 表示单字节增量传输
Bit 3-4: 通道选择,10 表示通道 2
Bit 5-6: 存储器读写方向,01 表示写入存储器
Bit 7 : 内部/外部命令,0 表示内部命令
控制字寄存器的值为 00101001B,即 29H。
2. 设置模式寄存器(Mode Word Register,MWR)。
模式寄存器的格式为:
Bit 0-1: 传输类型,00 表示单次传输
Bit 2-3: 自动初始化方式,00 表示不自动初始化
Bit 4-5: 传输方向,10 表示从外设读取数据
Bit 6-7: 传输速率,00 表示最高速率
模式寄存器的值为 00010100B,即 14H。
3. 设置外设地址寄存器(Address Register,AR)。
外设地址寄存器的值为 02H,表示使用通道 2。
4. 设置计数器寄存器(Counter Register,CR)。
计数器寄存器的值为 4096-1,即 0FFFH。
5. 设置存储器地址寄存器(Memory Address Register,MAR)。
存储器地址寄存器的值为 28086H。
6. 启动传输。
启动传输需要向命令寄存器(Command Register,CR)写入 01H。
完整的初始化程序如下:
```
MOV DX, 0D00H ; 将 8237 DMA 控制器的基址端口地址 0D00H 存入 DX
MOV AL, 29H ; 控制字寄存器的值为 29H
OUT DX, AL ; 将控制字寄存器的值写入 8237 DMA 控制器的基址端口
INC DX ; 选择命令字寄存器
MOV AL, 01H ; 启动 DMA 传输
OUT DX, AL ; 将命令字寄存器的值写入 8237 DMA 控制器的基址端口
DEC DX ; 选择模式字寄存器
MOV AL, 14H ; 模式寄存器的值为 14H
OUT DX, AL ; 将模式寄存器的值写入 8237 DMA 控制器的基址端口
DEC DX ; 选择外设地址寄存器
MOV AL, 02H ; 外设地址寄存器的值为 02H
OUT DX, AL ; 将外设地址寄存器的值写入 8237 DMA 控制器的基址端口
DEC DX ; 选择计数器寄存器
MOV AX, 0FFFH ; 计数器寄存器的值为 0FFFH
OUT DX, AL ; 将计数器寄存器的低8位写入 8237 DMA 控制器的基址端口
DEC DX ; 选择计数器寄存器
MOV AL, AH ; 计数器寄存器的值为 0FFFH
OUT DX, AL ; 将计数器寄存器的高8位写入 8237 DMA 控制器的基址端口
DEC DX ; 选择存储器地址寄存器
MOV AX, 28086H ; 存储器地址寄存器的值为 28086H
OUT DX, AL ; 将存储器地址寄存器的低8位写入 8237 DMA 控制器的基址端口
DEC DX ; 选择存储器地址寄存器
MOV AL, AH ; 存储器地址寄存器的值为 28086H
OUT DX, AL ; 将存储器地址寄存器的高8位写入 8237 DMA 控制器的基址端口
```
这样,就完成了对8237 DMA控制器通道2的初始化,可以开始进行DMA传输了。
编写程序:实现用通道 1 输入 8KB 的数据块,传送至内存 3000H 开始的区域(增量传送,连续传送方式,传送完毕不自动预置,DREQ 为低电平有效,DACK 为高电平有效)。 假设 8237A 的端口地址为 270H-27FH。
以下是一个简单的程序,实现了将通道 1 输入的 8KB 数据块传送至内存 3000H 开始的区域:
```
MOV DX, 270H ; 将 8237A 的端口地址 270H 存入 DX 寄存器
MOV AL, 9 ; 将 1001B 存入 AL 寄存器,表示使用通道 1、增量传送、连续传送方式、DREQ 为低电平有效、DACK 为高电平有效
OUT DX, AL ; 将 AL 寄存器中的值输出至 8237A 的端口地址 270H,选择通道 1、传输模式等参数
MOV DX, 272H ; 将 8237A 的端口地址 272H 存入 DX 寄存器,表示设置传输起始地址
MOV AX, 3000H ; 将内存地址 3000H 存入 AX 寄存器
OUT DX, AL ; 将 AL 寄存器中的低 8 位写入 8237A 端口地址 272H
INC DX ; DX 指向 8237A 端口地址 273H
MOV AL, AH ; 将 AX 寄存器中的高 8 位存入 AL 寄存器
OUT DX, AL ; 将 AL 寄存器中的值写入 8237A 端口地址 273H,设置传输起始地址为 3000H
MOV DX, 274H ; 将 8237A 的端口地址 274H 存入 DX 寄存器,表示设置传输计数
MOV AX, 2000H ; 将 8KB 的数据块大小(2000H 字节)存入 AX 寄存器
OUT DX, AL ; 将 AL 寄存器中的低 8 位写入 8237A 端口地址 274H
INC DX ; DX 指向 8237A 端口地址 275H
MOV AL, AH ; 将 AX 寄存器中的高 8 位存入 AL 寄存器
OUT DX, AL ; 将 AL 寄存器中的值写入 8237A 端口地址 275H,设置传输计数为 8KB
MOV DX, 27CH ; 将 8237A 的端口地址 27CH 存入 DX 寄存器,表示启动传输
IN AL, DX ; 读取 8237A 端口地址 27CH 中的值,将启动传输位清零
OR AL, 1 ; 将启动传输位置为 1,启动传输
OUT DX, AL ; 将 AL 寄存器中的值写入 8237A 端口地址 27CH,启动传输
WAIT: ; 等待传输完成
IN AL, DX ; 读取 8237A 端口地址 27CH 中的值,判断传输是否完成
AND AL, 2 ; 将传输完成位取出
JZ WAIT ; 如果传输未完成,继续等待
HLT ; 停机
```
需要注意的是,该程序中的地址和端口地址都是示例值,需要根据实际情况进行修改。此外,由于程序中使用了端口 I/O 操作,需要在操作系统中以特权级 0 运行。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)