标题:关于硬盘DMA传送
取消只看楼主
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
结帖率:100%
 问题点数:0 回复次数:13 
关于硬盘DMA传送
;本人硬盘的总线号 0,设备号31,FUNTION 2(SLAVE),主设备为0,31,5但不能作为DMA主控设备(PCI CMD REG=3,BIT2不能置位)
;硬盘DMA基地址REG=0E091H(OFFSET 20H),即CONTROL REG=0E090H,STATUS REG=0E092H,PRD REG=0E094H
;base address reg=0e0d0h
;本人的问题在于:为什么按照INTEL 82801AA(ICH0)的资料无法用DMA读去硬盘缓冲区?本论坛藏龙卧虎,请进到此贴的大牛一定留下个一言半语点化下小弟,不胜感激!!!
;程序如下:
.model small
.386
.code
start:
cli
mov al,0ffh
out 0a1h,al

mov dx,0e090h
mov al,0
out dx,al

mov dx,0e092h
mov al,6
out dx,al

mov ax,4000h
mov es,ax
mov di,0
mov eax,40000h
mov dx,0e094h
out dx,eax
mov eax,20000h
stosd
mov eax,80000200h
stosd

mov eax,0
call readsector

mov al,1
mov dx,0e090h
out dx,al

mov dx,0e092h
l1:
in al,dx
test al,4
jz l1
mov al,6
out dx,al

mov ah,4ch
int 21h

readsector proc near
push eax
push dx
mov dx,0e0d3h
out dx,al
inc dx
shr eax,8
out dx,al
inc dx
shr eax,8
out dx,al
inc dx
shr eax,8
add al,0e0h
out dx,al

mov dx,0e0d2h
mov al,1
out dx,al
mov dx,0e0d7h
mov al,20h
out dx,al
l0:
in al,dx
cmp al,58h
jnz l0
pop dx
pop eax
retn
end start



搜索更多相关主题的帖子: address 藏龙卧虎 不胜感激 硬盘 
2012-06-02 14:08
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
大哥有话直说,膜拜什么??
2012-06-04 12:55
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
大哥,这点我还不知道么,当然是在DOS下了,我的目标人群是主板开发人员,但遗憾的是这些底层武工高手一般没时间上论坛这类网站,很难在这里碰到
2012-06-07 19:58
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
我连个学生都不是啊,我是农民工啊,我自学的,(别歧视我)  :)
2012-06-07 20:07
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
回复 4楼 zjsxwc
多谢ZJSXWC兄的关心,现在我已经独立解决了。这个问题的关键点在于命令的顺序不能颠倒
如下
.MODEL SMALL
.386
.CODE
START:
CLD
MOV AX,40000H ;PRD DESCRIPTOR
MOV ES,AX
MOV DI,0
MOV EAX,20000H
STOSD
MOV EAX,80000200H
STOSD

MOV DX,0E094H  ;PRD ADDRESS
MOV EAX,40000H
OUT DX,EAX

MOV AL,1 ;STATUS REG
MOV DX,0E092H
OUT DX,AL
INC DX
MOV AL,0
OUT DX,AL
INC DX
OUT DX,AL
INC DX
OUT DX,AL
INC DX
MOV AL,0E0H
OUT DX,AL
INC DX
MOV AL,0C9H ;DMA READ CMD
OUT DX,AL

MOV AL,0
MOV DX,0E090H
OUT DX,AL

MOV DX,0E092H
MOV AL,6
OUT DX,AL

MOV AL,9
MOV DX,0E090H ;READ START
OUT DX,AL

MOV AH,4CH
INT 21H
END START


;该DEMO用于将硬盘MBR扇区读入绝对地址2000:0处,大家可以试是,结尾为55AA
关于各自寄存器的来源遍历PCI总线,唯一确定的OFFSET 0BH,0AH值为01 00(硬盘)
2012-06-13 12:23
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
回复 11楼 zklhp
大哥,我无语了,汇编语言即是机器语言,现在还有8086么,都是P4以上了吧,还有什么指令不能执行的??
还32位,都64位了,参看指令前缀66,67H
2012-06-13 12:26
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
回复 12楼 zklhp
32寄存器位不用进保护模式,指令前缀66H,67H
2012-06-13 12:27
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
实模式甚至能访问4G内存,你们不知道么
2012-06-13 12:31
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
.386p
code segment para use16
assume cs:code
start:
xor eax,eax
mov ebx,eax
mov ax,seg gdt0
she eax,4
mov bx,offset gdt0
add eax,ebx
mov dword ptr cs:[gdtbase],eax

cli
in al,0eeh
lgdt qword ptr cs:[gdtlen]
mov eax,cr0
or al,1
mov cr0,eax
mov bx,8
mov fs,bx
and al,0feh
mov cr0,eax

mov edi,0fffffff0h
mov cx,8
mov ax,2000h
mov ds,ax
mov si,0
l0:
mov ax,fs:[di]
mov ds:[si],ax
add ax,2
add si,2
add di,2
dec cx
cmp cx,0
jnz l0
mov ah,4ch
int 21h
gdtlen dw 0fh
gdtbase dd 0
gdt0 dq 0
gdt1 dq 00cf92000000ffffh
code ends
end start
;access 4g memory in dos,将2000:0与FFFF:0的16各字节比较一下吧,CPU上电的第一条指令
2012-06-13 12:43
ljg438
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-27
得分:0 
;错了2处,SHL EAX,4   去掉ADD AX,2

.386p
code segment para use16
assume cs:code
start:
xor eax,eax
mov ebx,eax
mov ax,seg gdt0
shl eax,4
mov bx,offset gdt0
add eax,ebx
mov dword ptr cs:[gdtbase],eax

cli
in al,0eeh
lgdt qword ptr cs:[gdtlen]
mov eax,cr0
or al,1
mov cr0,eax
mov bx,8
mov fs,bx
and al,0feh
mov cr0,eax

mov edi,0fffffff0h
mov cx,8
mov ax,2000h
mov ds,ax
mov si,0
l0:
mov ax,fs:[di]
mov ds:[si],ax
add si,2
add di,2
dec cx
cmp cx,0
jnz l0
mov ah,4ch
int 21h
gdtlen dw 0fh
gdtbase dd 0
gdt0 dq 0
gdt1 dq 00cf92000000ffffh
code ends
end start
2012-06-13 12:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-370658-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.209425 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved