You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:20:29