使用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 = 40hBX = 目标文件/设备的句柄(标准输出为01h,标准输入为00h,标准错误为02h)CX = 要写入的字节数DS:DX = 存放待写入数据的缓冲区起始地址
- 返回值:
AX = 实际写入的字节数;若操作失败,CF标志位会被置位,AX存储对应错误码
解决步骤
- 修正
INT 21h,40h的句柄参数:调用前确保BX的值为01h(标准输出句柄),而非打开文件时获取的句柄。示例代码:mov ah, 40h mov bx, 01h ; 明确指定输出到屏幕的句柄 mov cx, byte_count ; 文件读取到的有效字节数 mov dx, offset buf ; 存放文件内容的缓冲区地址 int 21h - 验证文件读取结果:
- 调用
INT 21h,3Fh读取文件后,检查AX返回值是否与预期文件大小一致 - 在Turbo Debugger中查看缓冲区地址的内存数据,确认与测试文件实际内容匹配
- 调用
- 换用正确中断测试单个字符:使用
INT 21h,02h输出单个字符,将缓冲区首字符存入DL后调用:mov dl, [buf] mov ah, 02h int 21h - 检查段寄存器配置:确保DS寄存器正确指向数据段,避免因段地址错误导致缓冲区地址无效,比如程序初始化阶段是否正确设置了DS。
内容的提问来源于stack exchange,提问作者Gene Adam Oker
相关产品推荐
相关产品推荐

