程序集移动文件指针

时间:2017-11-18 18:50:06

标签: assembly offset lseek

enter image description here

如何计算CX:DX值? 我不知道这意味着什么 有人帮助我

1 个答案:

答案 0 :(得分:0)

文件指针是文件内容的地址。如果您有位图图像,并且您在代码中知道像素数据从偏移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磁盘是常见的)。因此,如果你的设计文件系统是198x,存储设备是几十兆字节,文件是千字节,32位文件指针听起来像是面向未来的设计,至少半个世纪。

就是这样。在此上下文中cx:dx是单个32位值,cx保持高16位,即" b16"到" b31",dx保持低16位" b0"至" b15"。要重建十进制值,您可以cx * 65536 + dx(* 65536,因为它是dx中所有可能值的数量,在增量期间耗尽之后,您增加{{1}一个,然后再遍历整个cx以获得下一个65536个值。)

在二进制文件中,您不需要将任何内容相乘,只需将其用作较大值的上/下位,即添加两个偏移量dx即可使用以下代码:

ax:bx + cx:dx

注意:不要将这个32位值数学误认为由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 组成的16b实模式寻址,而确实使用两个16位值来描述物理内存地址,它们组合在一起方式segment:offset只覆盖20位地址空间(1MiB的内存确实看起来非常大,信不信由你:)),但具有不同的重叠可能性。因此,当涉及像phys_adr = segment * 16 + offset这样的段寄存器时,它很可能是关于存储器地址计算,而不是由两个16位值组成的完整32位值。