组装了迷你版-44卷之后,我试着运行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;发布于 2019-05-11 08:50:24
除了迈克尔·佩奇和彼得·科德斯的评论中已经提到的事情之外:
您不应该使用固定地址(9Eh),而应该使用文件名的标签。
如果修改代码,则地址不再正确。使用标签就能解决这个问题。
而且9Eh 不能是正确的地址,因为.com文件从地址100h开始,所以.com文件中的所有地址至少必须是100h。
它不确定地址9Eh的位置(它是为命令行保留的地址空间中的地址;但是,如果命令行参数长度小于20字节,则不使用此地址)。但是,显然存储在9Eh中的数据不是文件名!
因此很明显,您将得到一个“文件未找到”错误,因为dx寄存器包含9Eh,但是在address 9Eh上没有有效的文件名。
发布于 2019-05-16 10:50:55
要编译到.COM文件,只需:
.model tiny
ORG 100hDOS.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文件名将位于地址9 9Eh。
但是,如果DTA地址被更改(通常这是您通过职能1Ah自己做的事情),则需要使用另一个地址。您可以通过功能2Fh检索当前的DTA地址。结果将在ES:BX。
我已经在C:\ and 8086上安装了emu8086,我想打开的所有COM文件都在C:\emu8086\MyBuild上。程序集文件位于C:\emu8086\MySource中。现在哪条路是正确的?
如果您仍然无法打开该文件,这可能是因为一方面您在的p f i c目录(C:\emu8086\MyBuild)中搜索它,但另一方面您试图在c t目录(???)中打开它。
解决方案是将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,42 H;MOV DX,100 h;INT 21H;
.Writing可能会失败。检查CF!
.The大小参数是CX,而不仅仅是CL。
已完成: RET
虽然这在这里可以工作(具有完整堆栈的.COM程序),但您应该使之成为使用正确的程序终止代码的好方法:
mov ax, 4C00h
int 21hhttps://stackoverflow.com/questions/56084976
复制相似问题