求SATA硬盘IO方式读写一个扇区的资料,最好能有一个读出MBR并显示出来的示例程序,IDE的已经会了,期待大牛来回答了!!!

cxdzxc 2009-05-12 10:34:44
如题,不够还可以另发帖加分...
...全文
510 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wudir 2009-07-19
  • 打赏
  • 举报
回复
是不是有些SATA不行的?怎么我不能成功?
cxdzxc 2009-05-24
  • 打赏
  • 举报
回复
得XT指点,问题解决,我的SATA的IO端口地址是10C8H...
cxdzxc 2009-05-12
  • 打赏
  • 举报
回复
SATA与IDE的兼容模式貌似要BIOS支持才行的吧,要不为啥我读IDE的程序读不了SATA呢,另本人英文实在太烂,还是请大牛们给发个示例程序好些吧
cnzdgs 2009-05-12
  • 打赏
  • 举报
回复
跟IDE的一样,都是按照ATA标准,可以参考ATA-7以上标准文档。
pla_007 2009-05-12
  • 打赏
  • 举报
回复
MARK,我也想学习一下。
英语太差了,不然去看SATA的SPEC,应该也可以找出来。
cnzdgs 2009-05-12
  • 打赏
  • 举报
回复
先确定你要访问的是哪个控制器,你可以在Windows设备管理器中选择该ATA控制器,查看“属性”中的“资源”,上面写这端口范围。
xtdumpling 2009-05-12
  • 打赏
  • 举报
回复
猜测是PCI IDE,
LZ请将上面的
1F0h - 1F7h,替换为 从IDE/SATA Controller的PCI Config 0x10处读的值对应offset(0~7) Primary Channel
3F6h 替换为 从IDE/SATA Controller的PCI Config 0x14处读的值

170h - 177h,替换为 从IDE/SATA Controller的PCI Config 0x18处读的值对应offset(0~7) Secondary Channel
376h 替换为 从IDE/SATA Controller的PCI Config 0x1C处读的值

再试试!
cxdzxc 2009-05-12
  • 打赏
  • 举报
回复
使用网上介绍的代码如下:
.386
cseg segment use16
assume cs:cseg
org 100h
start:
mov dx,1f6h ; 要读入的磁盘号及磁头号
mov al,0a0h ;磁盘0,磁头0
out dx,al

mov dx,1f2h ;要读入的扇区数量
mov al,1 ;读一个扇区
out dx,al

mov dx,1f3h ;要读的扇区号
mov al,1 ;扇区号为1
out dx,al

mov dx,1f4h ;要读的柱面的低8位
mov al,0 ; 柱面低8位为0
out dx,al

mov dx,1f5h ; 柱面高2位
mov al,0 ; 柱面高2位为0(通过1F4H和1F5H端口我们可以确定
; 用来读的柱面号是0)
out dx,al

mov dx,1f7h ;命令端口
mov al,20h ; 尝试读取扇区
out dx,al
still_going:
in al,dx
test al,8 ;扇区缓冲是否准备好
jz still_going ;如果扇区缓冲没有准备好的话则跳转,直到准备好才向下执行。

mov cx,512/2 ;设置循环次数(512/2次)
mov di,offset buffer
mov dx,1f0h ;将要传输的一个字节的数据
rep insw ;传输数据

; ------

mov ax,201h ;以下是用INT13H读硬盘的0磁头、0柱面、1扇区
mov dx,80h
mov cx,1
mov bx,offset buffer2
int 13h

mov cx,512 ;以下部分用来比较2种方法读出的硬盘数据
mov si,offset buffer
mov di,offset buffer2
repe cmpsb
jne failure
mov ah,9
mov dx,offset readmsg
int 21h
jmp good_exit
failure:
mov ah,9
mov dx,offset failmsg
int 21h
good_exit: ;以下部分用来结束程序
mov ax,4c00h ;退出程序
int 21h

readmsg db 'The buffers match. Hard disk read using ports.$'
failmsg db 'The buffers do not match.$'
buffer db 512 dup ('V')
buffer2 db 512 dup ('L')

cseg ends
end start
pla_007 2009-05-12
  • 打赏
  • 举报
回复
把你的程序贴上来好了,大家一起分析/学习下?
cxdzxc 2009-05-12
  • 打赏
  • 举报
回复
找了下,实验平台资料如下:
处理器 Intel Celeron Duo T1400(1.73G主频,512Kb二级缓存,533MHz前端总线)
芯片组 SIS M672+SIS 968
标准内存 1G
硬盘类型 SATA
硬盘容量 120G
光驱 Combo
显示芯片 SiS Mirage 3+ Graphics Engine芯片集成
cnzdgs 2009-05-12
  • 打赏
  • 举报
回复
估计是端口地址用错了,各个硬盘控制器的端口地址是不同的。
cxdzxc 2009-05-12
  • 打赏
  • 举报
回复
神州---天运F1400,其他情况我就不知道了
xtdumpling 2009-05-12
  • 打赏
  • 举报
回复
请问LZ试验的平台是什么芯片组?硬盘是什么模式? Legacy IDE, PCI IDE or AHCI ?

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧