汇编器无法打开文件

时间:2019-05-10 21:19:53

标签: assembly dos x86-16 emu8086

组装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;

2 个答案:

答案 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,并且我要打开的所有C​​OM文件都在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上没有有效的文件名。