- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道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/
我不确定 cbw命令实际上可以。我有一段代码: mov ax,0FF0h cbw idiv ah cbw后ax的值如何变化? 最佳答案 cbw指令将一个字节符号扩展为一个字。在这种情况下,它将采用
MIPS 架构中的.s 和.asm 有什么区别? 最佳答案 .s 和.asm 之间没有天生的区别 如果你愿意,你可以用 .s 命名文本文件,用 .asm 命名十六进制文件,但这只是为了让它们保持正直。
我正在业余时间学习汇编语言,以成为更好的开发人员。 我在概念层面上理解基于堆栈的机器和基于寄存器的机器之间的区别,但我想知道基于堆栈的机器实际上是如何实现的。如果是虚拟机,例如JVM 或 .NET,在
几周后我开始上大学(软件工程学位),并且知道我将在第一年学习的一个模块是“建筑基础”或类似的东西;基本上它是在学习“汇编”中的编程。 我想做一些背景学习,所以我为此做好了准备(我在其他一些单元上做了同
我是汇编语言的新手。我目前正在经历这个 Assembly Guide .我对 LEA 指令有疑问。我对LEA指令的理解是LEA用source operand的有效地址加载destination ope
x86 汇编中是否有模运算符或指令之类的东西? 最佳答案 如果您的模数/除数是一个已知常数,并且您关心性能,请参阅 this和 this .对于直到运行时才知道的循环不变值,乘法逆甚至是可能的,例如见
我是汇编语言的新手。我目前正在经历这个 Assembly Guide .我对 LEA 指令有疑问。我对LEA指令的理解是LEA用source operand的有效地址加载destination ope
我相信这对大多数人来说非常简单,但我对 x86 汇编语言不是很熟悉。我只是想自学。 我在 window 里。在我读到的任何地方,我都被告知要使用 INT 21返回操作系统。这退出了程序,但我收到一条错
我正在尝试输入一个字符串,然后查看该字符串中的最后一个值是否为 EOL 字符。我想我会使用读入的字符串的长度,然后将它添加到缓冲区的地址以找到最后一个元素。这似乎不起作用。 编辑:很抱歉我没有包含更多
; This program checks for even or odd parities inside of an array. Displays 1 if even or 0 if odd. I
我一直在努力掌握 x86 汇编语言,并且想知道是否有一个与 movl $1, %eax 等效的快速简短的语言。就在那时,我认为列出该语言中经常使用的习语可能是个好主意。 这可能包括首选使用 xorl
有人知道如何在 ARMv6 汇编语言中开始注释(例如“#”、“;”、“/”、“/*”)吗? 最佳答案 应该是“;”根据我在 wikipedia article: 上找到的一些示例代码 loop
; This program checks for even or odd parities inside of an array. Displays 1 if even or 0 if odd. I
我是一名利用业余时间学习汇编语言的大学生。我注意到虽然有像 add 和 mul 这样的指令,但算术运算符经常在指令中使用。例如: mov eax,[ebx+ecx] 它等价于以下吗? add ebx,
我真的是学习汇编语言的新手,并且刚刚开始研究汇编语言,所以我想知道也许有些人可以帮助我解决一个问题。我有一个作业,告诉我将汇编语言指令与C代码进行比较,并告诉我哪些C代码与汇编指令等效。所以这是组装说
假设我有以下代码: C++ 代码和内联汇编代码如下: 方程式: X=40+5 Y=3*12 ---> X=45 Y=36 测试 if x < y - print x+y else print x-y
我正在编写一个程序,其中的要求如下: 有一个名为 Name 的字符串变量,该变量设置为您的全名,包括空格。 只清除 AL 寄存器,不清除 EAX 寄存器的其余部分。 遍历 Name 变量中的每个字符。
我有一个任务,描述如下: - Reads printable characters (20h-7Fh) from the keyboard without echoing - Uppercase le
我正在查看 switch 语句的汇编语言代码。 我了解代码的工作原理以及情况。我的问题是如何决定案例名称? 下面是汇编语言代码,下面是我的解释。我基本上只需要使用跳转表并填写案例名称。 1 8
我是汇编语言新手,我想到了这个问题:构建代码、宏或过程哪个是更好的解决方案?虽然宏中包含的代码只是复制到所需的部分,并且允许执行代码而无需昂贵的跳转,但它确实添加了必须在程序执行时加载的额外指令。此外
我是一名优秀的程序员,十分优秀!