无忧启动论坛

标题: 扩展INT13H调用 [打印本页]

作者: sgw888    时间: 2012-5-21 11:05
标题: 扩展INT13H调用
扩展INT13H的调用,在网上找了很多资料,但是测试时总不能成功。

看了下 1JF9Y (井底蛙)的汇编源代码,SI 用于指向 磁盘地址数据包 ,但网上的资料全部是 DS:DI 指向磁盘地址数据包。网上的资料是错的吧???

我在虚拟机VM中启动DOS,用DEBUG跟踪,测试时,把DS:SI指向我构造的磁盘地址数据包,能成功把硬盘第一扇区读到 0:7C00处,但是尝试读硬盘 1 扇区时,总也不成功,把 7C 改成7F也能读到7F00处。但是改成别的总也不成功。 用DEBUG的D命令显示内存,看不到想要的内容,但看寄存器的返回值,INT13成功执行了。

以下是磁盘地址数据包的示例:  
10 00 01 00 00 7c 00 00 00 00 00 00 00 00 00
资料上 10 00 是固定的 01表示块大小,暂时指定为1块(扇区)  00 00 7C 00 是内存缓冲区,此处是如何表示的? 是 00 00 : 7C 00 这样吗? 改7C为7F是成功的,但是改成 00 00 7C FF 之类的总也不成功?

还有把后面的 00 00 00 00 00 00 00 00 硬盘地址尝试改成 01 00 00 00 00 00 00 00 试图读1扇区,不改动7C00的缓冲区也不成功是怎么回事?
作者: 不点    时间: 2012-5-21 11:29
第一个问题,如果我没记错的话,DI 是错的,SI 是正确的。

第二个问题,00 7C FF 00 就是 00FF:7C00,而 00 00 7C FF 就是 FF7C:0000,所以,是你自己汇编基础概念含糊不清造成的。

第三个问题,读扇区 1 失败,有点意外。这可能是 BIOS 的 bug。你可以试试从扇区 0 开始读,读两个扇区,这样就有可能绕过 BIOS 的 bug。
作者: sgw888    时间: 2012-5-21 14:18
磁盘地址数据包 Disk Address Packet (DAP)
    DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾
越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.
    DAP 的结构如下:


struct DiskAddressPacket   {
    BYTE PacketSize; // 数据包尺寸(16字节)
    BYTE Reserved;    // ==0
    WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
    DWORD BufferAddr; // 传输缓冲地址(segment:offset)
    QWORD BlockNum;    // 磁盘起始绝对块地址
};

多谢不点的回复,在此表示感谢。
是我太粗心了,搞错了DAP的结构,所以才会犯低级的错误。
要传输的数据块个数类型是 WORD,自己测试的时候一直把它当成了BYTE 。 所以后面的数据缓冲区地址跟磁盘起始绝对块地址全部搞错了。  

在看1JF9的源码时,仍然因为粗心没有找到问题的根本原因,一直以为 00 00 7C 00表示的是缓冲区地址,实际上 最前面的00 跟01 00是一起的 用于表示传输的数据块的个数, 00 7C 00 00 这样表示的才是缓冲区地址,导致了误会。 基础的东西还是没有问题的,只是一开始测试总也不成功,后来看1JF9的源码时,注意到了SI,然后就直接用1JF9的地址包给测了一下,当时并没注意到自己到地址包的定义理解有误。
作者: sgw888    时间: 2012-5-21 14:23
10 00 01 00    00 7c 00 00   00 00 00 00 00 00 00 00

这样才是正确的磁盘地址数据包。
10 00 前两个字节是固定的。
01 00 两个字节(WORD) 用于表示要传输的数据块个数 以扇区为单位
00 7C 00 00 : 数据缓冲区地址,  偏移地址:段地址 ,低位在前,高位在后。
00 00 00 00 00 00 00 00 : 8字节,用于表示硬盘绝对地址(LBA地址)




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3