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

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

关键修正说明

  1. 严格的错误检查:每次调用DOS文件操作中断后,检查CF标志,一旦出错立即终止并提示,避免后续无效操作。
  2. 正确的循环终止逻辑:读取后判断返回的AX(实际读取字节数)是否为0,为0则结束读取循环,解决无限循环问题。
  3. 匹配的字节数处理:加密和写入时都使用实际读取的字节数,避免处理缓冲区中的无效数据,消除乱码。
  4. 清晰的句柄管理:分别保存输入、输出文件的句柄,避免混淆导致读写目标错误。

内容的提问来源于stack exchange,提问作者Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:46:03