assembly - 如何编写汇编语言使 DMA 工作

标签 assembly io cpu x86-16

我知道IO数据传输有3种方式: 程序模式、中断模式和DMA模式。 而对于程序模式,如果我想从IO传输一个字节到RAM,我应该这样写

MOV PORT1,000AH        # tell io the address
IN ACC,PORT2           # read data from this address
MOV [0x5566], ACC      # mov this data to RAM

如果我想传输很多字节,我会 foreach 这个程序。没关系。 但这是我的问题:

如果我想使用 DMA 模式怎么办,如何编写我的汇编语言来将多个字节从 IO 传输到 RAM?

我知道DMA是如何工作的,但我很困惑是谁告诉他们这样做的?我认为cpu需要告诉IO起始地址,数据长度,RAM地址。这一切,汇编语言应该是什么?

我找到了很多,但没有找到答案。我是否错过了一些让我对此感到困惑的重要事情?我希望有人的帮助。谢谢

最佳答案

有一本书的书名很长:

“英特尔微处理器 8086/8088, 80186/80188, 80286, 80386, 80486, 奔腾, 奔腾 Pro 处理器, 奔腾 II、奔腾 III、奔腾 4 和 Core2 带有 64 位扩展 架构、编程和接口(interface) 第八版 巴里·B·布雷”

书中的例子:

;A procedure that transfers a block of data using the 8237A
;DMA controller in Figure 13–12. This is a memory-to-memory
;transfer.
;Calling parameters:
; SI = source address
; DI = destination address
; CX = count
; ES = segment of source and destination
LATCHB EQU 10H
CLEARF EQU 7CH
CHOA EQU 70H
CH1A EQU 72H
CH1C EQU 73H
MODE EQU 7BH
CMMD EQU 78H
MASKS EQU 7FH
REQ EQU 79H
STATUS EQU 78H
TRANS PROC NEAR USES AX
MOV AX,ES                ;program latch B
MOV AL,AH
SHR AL,4
OUT LATCHB,AL
OUT CLEARF,AL             ;clear F/L
MOV AX,ES                 ;program source address
SHL AX,4
ADD AX,SI
OUT CH0A,AL
MOV AL,AH
OUT CH0A
MOV AX,ES                 ;program destination address
SHL AX,4
ADD AX,DI
OUT CH1A,AL
MOV AL,AH
OUT CH1A,AL
MOV AX,CX                   ;program count
DEC AX
OUT CH1C,AL
MOV AL,AH
OUT CH1C,AL
MOV AL,88H              ;program mode
OUT MODE,AL
MOV AL,85H
OUT MODE,AL
MOV AL,1            ;enable block transfer
OUT CMMD,AL
MOV AL,0EH             ;unmask channel 0
OUT MASKS,AL
MOV AL,4                 ;start DMA
OUT REQ,AL
.REPEAT               ;wait for completion
IN AL,STATUS
.UNTIL AL & 1
RET
TRANS ENDP

此外,还可以找到完全相同的一段代码here

关于assembly - 如何编写汇编语言使 DMA 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52396915/

相关文章:

assembly - 数据危险的特定情况(当 R 类型指令出现在两个连续的 LW 之后时)

一个目标文件中的代码对齐会影响另一个目标文件中函数的性能

java - 我如何让我的 Java 扫描仪从该文件中读取这些字符串?

java - Logback 文件附加程序不会立即刷新

ios - CoreLocation Swift 因后台信号 9 而终止

python - CPU : AbstractConv2d Theano optimization failed 上的 Theano CNN

c - 如何获得C程序的最低可执行操作码?

c# - 非阻塞 io 函数而不是 cin.get()

64-bit - 64位处理器有什么优势?

assembly - 使用 qemu 运行二进制文件