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

TASM 7.1汇编代码无法重命名文件:无报错但ww.txt未改为ww2.txt求助

TASM 7.1汇编文件重命名失败排查

我用TASM 7.1编写汇编代码,想要把d:\WW.TXT重命名为d:\WW2.TXT,程序运行无报错,但重命名操作没完成。试过处理@data段、将AX值移入DX寄存器等测试,问题仍未解决,请求排查原因。

相关汇编代码如下:

; TASM 7.1

.MODEL TINY
.STACK 100h
.CONST
  HW      DB      "Hallo Welt!$"
  CCW      DB      "TEST$"
  FILEX     DB  "d:\WW.TXT",0
  FILEY     DB  "d:\WW2.TXT",0
  Daten1 DB "Daten1",0
  handle dw 0
.CODE

start: 
  ; Text 1 Output
  MOV AX,@data
  MOV DS, AX
  MOV DX, OFFSET HW
  MOV AH, 09H
  INT 21H

  ; Text 2 Output
  MOV AX,@data
  MOV DS, AX
  MOV DX, OFFSET CCW
  MOV AH, 09H
  INT 21H

  ; Create File
  MOV AX, @data
  MOV DS, AX
  MOV CX, 0
  MOV DX, OFFSET FILEX
  MOV AH, 3CH
  INT 21h

  ; Rename file - do not work - why?
  MOV AX, @data
  MOV DS, AX
  MOV DX, OFFSET FILEX
  MOV AX, @data
  MOV DS, AX
  MOV DI, OFFSET FILEY
  MOV ah, 56h
  int 21h

  ; Program beenden
  MOV AH, 4Ch
  INT 21H
end start

问题原因

  1. 重命名功能参数错误:DOS中断INT 21H的56H号功能(文件重命名)明确要求:

    • DS:DX 指向旧文件名(这部分代码是正确的)
    • ES:DI 指向新文件名
      你的代码仅给DI赋值了新文件名的偏移地址,但未设置ES寄存器指向@data段。默认情况下ES不属于数据段,导致系统无法定位到正确的新文件名,最终重命名失败。
  2. 冗余的段寄存器设置:代码中多次重复执行MOV AX,@data和MOV DS,AX,实际上在程序开头设置一次DS即可,后续无需重复操作,这部分不影响功能,但属于冗余代码。

  3. 缺少错误检查逻辑:调用3CH(创建文件)和56H(重命名)功能后,未检查返回值。比如3CH调用失败时AX会返回0FFFFh,56H失败时会置位CF标志位,这些信息可以帮助快速定位问题。

修正后的代码示例

; TASM 7.1

.MODEL TINY
.STACK 100h
.CONST
  HW      DB      "Hallo Welt!$"
  CCW     DB      "TEST$"
  FILEX   DB      "d:\WW.TXT",0
  FILEY   DB      "d:\WW2.TXT",0
  Daten1  DB      "Daten1",0
  handle  dw      0
.CODE

start: 
  ; 初始化段寄存器,仅需执行一次
  MOV AX,@data
  MOV DS, AX
  MOV ES, AX  ; 设置ES指向数据段,满足重命名功能的参数要求

  ; Text 1 Output
  MOV DX, OFFSET HW
  MOV AH, 09H
  INT 21H

  ; Text 2 Output
  MOV DX, OFFSET CCW
  MOV AH, 09H
  INT 21H

  ; Create File
  MOV CX, 0
  MOV DX, OFFSET FILEX
  MOV AH, 3CH
  INT 21h
  ; 可选:检查文件创建是否成功
  JC create_error
  MOV handle, AX

  ; Rename file
  MOV DX, OFFSET FILEX
  MOV DI, OFFSET FILEY
  MOV ah, 56h
  int 21h
  ; 可选:检查重命名是否成功
  JC rename_error

create_error:
rename_error:
  ; 程序退出
  MOV AH, 4Ch
  INT 21H
end start

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:15:17