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

使用MASM中INT 21h,40h打印文件内容无输出的问题

MASM汇编文件内容打印异常排查方案

问题梳理

你用MASM编写的程序可正常处理命令行参数、打开目标文件,但打印环节出现异常:

  • 调用INT 21h,40h(已单独验证能输出"Hello World")时,屏幕无任何输出,但Turbo Debugger显示AX返回文件大小,提示写入操作成功
  • 尝试用INT 21h,01h打印文件首字符,仅输出字符'r'

核心问题定位

INT 21h,40h返回值正常却无屏幕输出,最大可能是传错了句柄参数。该中断的功能是向指定句柄写入数据,标准输出(屏幕)的句柄是01h,若你将打开文件得到的句柄传给BX,数据会被写回文件而非屏幕,自然看不到输出。

而INT 21h,01h输出'r'的问题,是因为用错了中断:01h是读取键盘输入并回显,并非输出字符。同时这也说明,你读取文件后的缓冲区地址可能存在错误,或读取操作未正确获取文件内容。

INT 21h,40h功能说明(翻译自官方参考文档)

  • 功能:向已打开的文件或设备写入指定长度的数据
  • 输入参数:
    • AH = 40h
    • BX = 目标文件/设备的句柄(标准输出为01h,标准输入为00h,标准错误为02h)
    • CX = 要写入的字节数
    • DS:DX = 存放待写入数据的缓冲区起始地址
  • 返回值:
    • AX = 实际写入的字节数;若操作失败,CF标志位会被置位,AX存储对应错误码

解决步骤

  1. 修正INT 21h,40h的句柄参数:调用前确保BX的值为01h(标准输出句柄),而非打开文件时获取的句柄。示例代码:
    mov ah, 40h
    mov bx, 01h        ; 明确指定输出到屏幕的句柄
    mov cx, byte_count ; 文件读取到的有效字节数
    mov dx, offset buf ; 存放文件内容的缓冲区地址
    int 21h
    
  2. 验证文件读取结果:
    • 调用INT 21h,3Fh读取文件后,检查AX返回值是否与预期文件大小一致
    • 在Turbo Debugger中查看缓冲区地址的内存数据,确认与测试文件实际内容匹配
  3. 换用正确中断测试单个字符:使用INT 21h,02h输出单个字符,将缓冲区首字符存入DL后调用:
    mov dl, [buf]
    mov ah, 02h
    int 21h
    
  4. 检查段寄存器配置:确保DS寄存器正确指向数据段,避免因段地址错误导致缓冲区地址无效,比如程序初始化阶段是否正确设置了DS。

内容的提问来源于stack exchange,提问作者Gene Adam Oker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:32:34