Turbo Assembler 16位二进制文件加密程序故障修复请求
修复Turbo Assembler 16位二进制文件加密程序的常见问题
下面针对你遇到的加密失败、写入错误、无限循环及乱码问题,给出具体的故障分析和修复方案:
核心故障点分析
- 文件操作调用错误:DOS中断
INT 21H的功能号或参数传递错误,导致文件句柄无效,后续读写失败。 - 循环终止条件缺失:读取文件时未判断
EOF(文件结束),导致反复读取空数据,陷入无限循环。 - 内存/计数管理混乱:读写后未正确更新缓冲区指针或处理字节数,导致重复处理数据或越界访问,出现乱码。
- 错误处理缺失:未检查DOS中断的
CF标志,无法及时发现读写失败的原因。
修复后的示例代码
.MODEL SMALL .STACK 100H .DATA INFILE DB 'input.bin',0 ; 待加密的输入文件 OUTFILE DB 'encrypted.bin',0 ; 加密后的输出文件 BUFFER DB 1024 DUP(0) ; 1KB读写缓冲区 ERR_PROMPT DB 'Operation failed!$' .CODE MAIN PROC MOV AX, @DATA MOV DS, AX ; 打开输入文件(只读模式) MOV AH, 3DH MOV AL, 0 LEA DX, INFILE INT 21H JC SHOW_ERROR ; CF置位=打开失败,跳转到错误处理 MOV BX, AX ; 保存输入文件句柄 ; 创建/覆盖输出文件(普通属性) MOV AH, 3CH MOV CX, 0 LEA DX, OUTFILE INT 21H JC SHOW_ERROR ; CF置位=创建失败 MOV SI, AX ; 保存输出文件句柄 READ_NEXT_BLOCK: ; 读取输入文件到缓冲区 MOV AH, 3FH MOV CX, 1024 ; 每次最多读1024字节 LEA DX, BUFFER INT 21H JC SHOW_ERROR ; CF置位=读取错误 CMP AX, 0 JE CLEAN_UP ; 读取字节数为0=文件结束,退出循环 ; 执行加密逻辑(示例:异或固定密钥) LEA DI, BUFFER MOV CX, AX ; 用实际读取的字节数作为循环计数 ENCRYPT_BLOCK: XOR [DI], 0AAH ; 与0xAA异或,可替换为自定义密钥 INC DI LOOP ENCRYPT_BLOCK ; 写入加密后的数据到输出文件 MOV AH, 40H MOV BX, SI ; 传入输出文件句柄 LEA DX, BUFFER MOV CX, AX ; 写入字节数=读取的字节数 INT 21H JC SHOW_ERROR ; CF置位=写入错误 JMP READ_NEXT_BLOCK ; 继续处理下一块数据 CLEAN_UP: ; 关闭输入文件 MOV AH, 3EH INT 21H ; 关闭输出文件 MOV AH, 3EH MOV BX, SI INT 21H ; 正常退出程序 MOV AH, 4CH INT 21H SHOW_ERROR: ; 显示错误提示 LEA DX, ERR_PROMPT MOV AH, 09H INT 21H ; 错误退出 MOV AH, 4CH INT 21H MAIN ENDP END MAIN
关键修正说明
- 严格的错误检查:每次调用DOS文件操作中断后,检查
CF标志,一旦出错立即终止并提示,避免后续无效操作。 - 正确的循环终止逻辑:读取后判断返回的
AX(实际读取字节数)是否为0,为0则结束读取循环,解决无限循环问题。 - 匹配的字节数处理:加密和写入时都使用实际读取的字节数,避免处理缓冲区中的无效数据,消除乱码。
- 清晰的句柄管理:分别保存输入、输出文件的句柄,避免混淆导致读写目标错误。
内容的提问来源于stack exchange,提问作者Lin
相关产品推荐
相关产品推荐

