【发布时间】:2017-11-18 18:50:05
【问题描述】:
【问题讨论】:
-
您必须先阅读该书中的页面,然后再阅读此页。我们不能神奇地知道你在读什么!
-
你取你想要的位置,将低16位放入
DX,将高16位放入CX。
【问题讨论】:
DX,将高16位放入CX。
文件指针是文件内容的地址。如果您有位图图像,并且您在代码中知道像素数据从偏移量 540 开始,并且您想跳过读取标题,则打开文件,然后将文件指针设置为偏移量 540,然后读取像素数据...
16 位可以容纳 216 = 65536 个设置为 0 或 1 的不同位组合。
因此,将 16 位解释为无符号整数值的常用方法是将第 i 位视为 i - 两个值的幂,即“b0”具有值 20 = 1,"b10" 的值是 210 = 1024,等等...通过这种解释,一个 16 位的值可以涵盖从 0 开始的所有无符号整数到 65535。
现在如果你有一些大文件,比如 1MB……嗯,那在 1980 年曾经是大文件,真的,不经常看到,当然今天是另一种方式,你可能会有小麻烦查找大小低于 65536 的文件... 1MB 不适合 16 位。所以如果你想沿着文件的内容“滑动”文件指针,你需要更多的位来指定你希望文件指针指向的位置。
将两个 16 位寄存器组合在一起可以得到 32 位值,可以有 232 = 4294967296 = 4Gi 不同的状态。现在这将覆盖最大 4GiB 大小的文件,这超过了整个硬盘的大小(80MiB 磁盘很常见)。因此,如果您设计文件系统的速度约为 198 倍,存储设备为数十兆字节,文件为千字节,那么拥有 32 位文件指针听起来像是面向未来的设计,至少半个世纪以来都是如此。
就是这样。 cx:dx 在此上下文中是单个 32 位值,cx 保存高 16 位,即“b16”到“b31”,dx 保存低 16 位“b0”到“b15”。要重建十进制值,您可以执行cx * 65536 + dx (*65536,因为这是dx 中所有可能值的数量,在递增过程中耗尽之后,您将cx 递增1,然后再次遍历整个@ 987654327@ 用于接下来的 65536 个值)。
在二进制中你不需要乘任何东西,只需将它用作大值的高位/低位,即添加两个偏移量ax:bx + cx:dx你可以使用这样的代码:
add dx,bx ; adding low 16bit parts
; (will set carry flag in case of overflow)
adc cx,ax ; adding high 16bit parts + CF
; here cx:dx is equal to the 32b addition result
注意:不要将这个 32 位值数学与由 segment:offset 组成的 16b 实模式寻址相混淆,虽然它也使用两个 16 位值来描述物理内存地址,但它们以特殊方式组合在一起 phys_adr = segment * 16 + offset只覆盖 20 位地址空间(1MiB 的内存看起来非常大,信不信由你:)),但有不同的重叠可能性。所以当涉及到像es, ds, cs, ss, ...这样的段寄存器时,很可能是内存地址计算,而不是由两个16位值组成的完整32位值。
【讨论】: