-192- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
7.3 FCB记录的随机存取 | |||||||||||||||||||||
所谓随机存取是相对于我们前面讨论的顺序存取而言的,顺序存取要求我们给出当前记录块号和当前记录号,而使用随机存取功能时DOS要求我们换一种眼光看待文件,即将一个文件从头至尾全部看作是由记录组成,而不需先将文件分成记录块后。再分记录。这样做的目的是使我们可以更方便地读写文件中任意位置的数据,无需做更多的附加工作。我们先来看看使用随机存取功能时要使用FCB中哪些数据。 回顾一下前面给出的FCB数据结构图,可以看到在FCB的末尾有一个双字的数据,这个数据称为"相对记录号"。在使用随机存取功能前我们必须设置这个值使得操作系统知道我们要读取哪个记录。 值得注意的是一般情况下这个双字的数据只有前3个字节有效,最后一个字节总为0。这是因为文件的长度是有限制的,DOS要求文件长度要小于1073741824个字节。这里所说的"一般情况",其实指得是当一个记录的长度大于64字节的时候。我们可以验算一下:如果一个文件长度恰好是最大长度,即1073741824字节,而一个记录长度是64字节,那么这个文件包含的记录数应是16777216个,这个数恰好是2的24次方。也就是说如果用二进制表示这个数,就需要24个Bit,正好是三个字节。 这里就有了这样一个问题,如果记录长度小于64字节,那么DOS是否会使用整个双字呢?很遗憾,没有哪一本教科书上谈到了这个问题,笔者也不想讨论它。实话说吧,我没有做过实验研究这个问题,因为我的硬盘根本装不下2的30次方个字节。 DOS究竟如何处理这个数据?其实很简单,DOS会根据这个数据自己算出当前记录块号和当前记录号然后使用顺序存取功能取得相应的数据。换句话说,DOS要求我们改变对文件的认识,而它自己并未改变。下面是DOS提供的随机存取功能的应用方法。 |
|||||||||||||||||||||
7.3.1 随机读写 | |||||||||||||||||||||
![]() |
功能号: 用 途: 参 数: 调 用: 返 回: |
21H 随机读取文件中的某个记录 DS:DX--打开的FCB首地址 INT 21H AL = 0--读取成功 AL = 1--已读到文件尾 AL = 2--记录溢出段 AL = 3--读出部分记录 |
| | | | | | | | |
功能号: 用 途: 参 数: 调 用: 返 回: |
22H 随机将某记录写入文件 DS:DX--打开的FCB地址 INT 21H AL = 0--成功写入 AL = 1--磁盘满 AL = 2--记录溢出段 |
||||||||||||||||
看来这两个功能的调用方法和我们前面讨论过的一些功能有相同之处,如果大家掌握了前面的顺序存取功能,那么随机存取功能应该不难学会,无非是变变观念而已。下面这个程序演示了这两个功能的应用,这个程序名叫MIRROR,它可以将源文件反过来写入目的文件中。
|
|||||||||||||||||||||
MIRROR.ASM ;数据段定义与程序FCB7.ASM相同,此处省略 |
|||||||||||||||||||||
CODE |
SEGMENT ASSUME |
CS:CODE |
|||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |