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
问题原因
重命名功能参数错误:DOS中断
INT 21H的56H号功能(文件重命名)明确要求:DS:DX指向旧文件名(这部分代码是正确的)ES:DI指向新文件名
你的代码仅给DI赋值了新文件名的偏移地址,但未设置ES寄存器指向@data段。默认情况下ES不属于数据段,导致系统无法定位到正确的新文件名,最终重命名失败。
冗余的段寄存器设置:代码中多次重复执行
MOV AX,@data和MOV DS,AX,实际上在程序开头设置一次DS即可,后续无需重复操作,这部分不影响功能,但属于冗余代码。缺少错误检查逻辑:调用
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
相关产品推荐
相关产品推荐

