汇编语言中DOS 42h功能调用的CX寄存器作用及异常现象咨询
DOS INT 21h 42h功能调用中CX寄存器的作用
DOS的INT 21h功能调用里,AH=42h是专门用来移动文件指针的操作,CX寄存器的核心作用是存储32位偏移量的高16位,和DX寄存器(存储低16位)共同组成完整的偏移值——因为DOS是16位系统,单个寄存器无法容纳大文件所需的32位偏移量。
42h功能调用的完整参数说明
AH=42h:指定移动文件指针的功能AL:移动模式:AL=0:从文件开头开始偏移(绝对位置)AL=1:从当前文件指针位置开始偏移(相对位置)AL=2:从文件末尾开始偏移(相对位置)
BX:文件句柄(由之前AH=3Dh的打开文件调用返回)CX:DX:32位偏移量,CX是高16位,DX是低16位,总偏移量计算公式为:偏移量 = (CX << 16) + DX- 返回值:CF=0时操作成功,
DX:AX返回新的文件指针位置;CF=1时操作失败,AX返回错误码
对你代码的分析
你原代码中AL=2(从文件末尾偏移),CX和DX都清0,意味着将文件指针移动到文件末尾,文件大小不会产生变化。
当你修改为mov cx, 1、xor dx, dx时,总偏移量是1 * 65536 + 0 = 65536字节(64KB)。此时如果后续执行写操作(哪怕只写1字节),DOS会自动将文件扩展到原文件大小 + 64KB的位置,中间用0填充。
你提到生成了15MB的文件,可能的原因包括:
- 原文件本身已有接近15MB的大小,加上64KB后总和达到15MB左右
- 代码中重复执行了多次该指针移动+写操作
- 可能误将CX设置为
0x000F(十进制15),此时偏移量为15 * 65536 = 983040字节(960KB),若原文件是14MB左右,总和会接近15MB;或者偏移量计算时搞反了CX和DX的顺序(但标准调用中CX是高16位)
内容的提问来源于stack exchange,提问作者Hashim Abbas
相关产品推荐
相关产品推荐

