如何计算 CX:DX 值?我不知道这是什么意思有人帮助我
1 回答
文件指针是文件内容的地址。如果您有位图图像,并且您在代码中知道像素数据从偏移量 540 开始,并且您想跳过读取标题,则打开文件,然后将文件指针设置为偏移量 540,然后读取像素数据...
16 位可以容纳 2 16 = 65536 个设置为 0 或 1 的不同位组合。
因此,将 16 位解释为无符号整数值的常用方法是将第i位视为两个值的i次方,即“b0”的值为 2 0 = 1,“b10”的值为 2 10 = 1024,等等...通过这种解释,一个 16 位的值可以涵盖从 0 到 65535 的所有无符号整数。
现在,如果你有一些大文件,比如 1MB ......好吧,那在 1980 年曾经是大文件,真的,不经常看到,当然今天是另一种方式,你可能很难找到文件大小低于 65536 ... 1MB 不适合 16 位。因此,如果您想沿着其内容“滑动”文件指针,您需要更多位来指定您希望文件指针指向的位置。
将两个 16 位寄存器组合在一起可以得到 32 位值,可以有 2 32 = 4294967296 = 4Gi 不同的状态。现在这将覆盖最大 4GiB 大小的文件,这超过了整个硬盘的大小(80MiB 磁盘很常见)。因此,如果您设计文件系统的速度约为 198 倍,存储设备为数十兆字节,文件为千字节,那么拥有 32 位文件指针听起来像是面向未来的设计,至少半个世纪。
就是这样。cx:dx
在此上下文中是单个 32 位值,cx
保存高 16 位,即“b16”到“b31”,dx
保存低 16 位“b0”到“b15”。要重建十进制值,您可以执行cx * 65536 + dx
(* 65536,因为这是 中所有可能值的数量,dx
在递增过程中耗尽之后,您递增cx
1,然后再次遍历整个dx
下一个 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 位值数学与由 组成的 16b 实模式寻址相混淆segment:offset
,虽然它也使用两个 16 位值来描述物理内存地址,但它们以特殊方式组合phys_adr = segment * 16 + offset
以仅覆盖 20 位地址空间(1MiB内存确实看起来非常大,信不信由你:)),但有不同的重叠可能性。所以当es, ds, cs, ss, ...
涉及到段寄存器之类的时候,很可能是关于内存地址计算,而不是由两个 16 位值组成的完整 32 位值。