组装MINI-44.asm之后,我尝试运行MINI-44.com_。然后它显示“无法打开文件”。然后,为了以防万一,我将MyBuild中的所有文件复制到MySource和vdrive \ c。但是,要么找不到任何文件,要么无法打开文件。我该如何解决?
;#MAKE_EXE#
.model small
.code
FNAME equ 9EH
ORG 100H
START:
MOV AH,4EH;
MOV DX,OFFSET COM_FILE;
INT 21H;
SEARCH_LOOP:
JC DONE;
MOV AX,3D01H;
MOV DX,FNAME;
INT 21H;
XCHG AX,BX;
MOV AH,40H;
MOV CL,42H;
MOV DX,100H;
INT 21H;
MOV AH,3EH;
INT 21H;
MOV AH,4FH;
INT 21H;
JMP SEARCH_LOOP;
DONE:
RET;
;COM_FILE DB 'C:\EMU8086\vdrive\C\*.com_',0;
;COM_FILE DB 'C:\EMU8086\MyBuild\*.com_',0;
COM_FILE DB '\MySource\*.com',0;
;COM_FILE DB '\vdrive\C\*.com_',0;
;COM_FILE DB '\MySource\*.com_',0;
;COM_FILE DB 'C:\EMU8086\MySource\*.com_',0;
END START;
答案 0 :(得分:2)
要编译成.COM文件,您需要做的是:
.model tiny
ORG 100h
DOS.SearchFirst函数需要CX
参数。为了搜索任何普通文件,请指定CX=0
:
mov ah, 4Eh
xor cx, cx
mov dx, offset COM_FILE
int 21h
jc Done
将此ASCIIZ文件规范与通配符一起使用:
COM_FILE db 'C:\EMU8086\MyBuild\*.com', 0
由于默认的DTA(磁盘传输区)为80h,因此您可以正确地说:FNAME equ 9EH
。
如果DOS找到任何匹配的文件,则其ASCIIZ文件名将位于地址9Eh。
但是,如果DTA地址已更改(通常是通过function 1Ah完成的操作),则需要使用其他地址。您始终可以通过function 2Fh检索当前的DTA地址。结果将在ES:BX
中。
我已经在C:\ emu8086上安装了emu8086,并且我要打开的所有COM文件都在C:\ emu8086 \ MyBuild上。程序集文件位于C:\ emu8086 \ MySource中。现在哪一条是正确的路径?
如果仍然无法打开文件,可能是因为,一方面,您在特定的目录(C:\emu8086\MyBuild
)中搜索了文件,另一方面,您尝试打开放在当前目录(???
)中。
解决方案是将DOS给您的文件名附加到用于询问文件的相同路径:
mov si, FNAME
mov di, FileName
More:
lodsb
stosb
cmp al, 0 ;Copy includes the terminating zero
jnz More
mov dx, Path
mov ax, 3D01h ;Access write-only
int 21h
jc OpenFileError
mov bx, ax ;Handle
具有以下数据定义:
COM_FILE db 'C:\EMU8086\MyBuild\*.com', 0
Path db 'C:\EMU8086\MyBuild\'
FileName db '.............'
MOV AX,3D01H; MOV DX,FNAME; INT 21H;
如果无法打开文件,则DOS返回CF集。检查一下!
MOV AH,40H; MOV CL,42H; MOV DX,100H; INT 21H;
。写入可能会失败。检查CF!
.size参数不仅是CX
,而且是CL
。
DONE: RET
尽管此方法在这里有效(堆栈完整的.COM程序),但您应该习惯使用正确的程序终止代码:
mov ax, 4C00h
int 21h
答案 1 :(得分:0)
除了迈克尔·皮奇(Michael Petch)和彼得·科德斯(Peter Cordes)的评论中已经提到的内容之外,
您不应使用固定地址(9Eh
),而应使用文件名标签。
如果您修改代码,则地址不再正确。使用标签可以解决此问题。
并且9Eh
不能是正确的地址,因为.com
文件从地址100h
开始,因此.com
文件中的所有地址都必须至少为100h
。
不确定地址9Eh
中的内容(它是为命令行保留的地址空间内的地址;但是,如果命令行参数小于约20个字节,则不使用此地址长)。但是,显然存储在9Eh
上的数据不是文件名!
因此很明显,您会收到“找不到文件”错误,因为dx
寄存器包含9Eh
,但地址9Eh
上没有有效的文件名。