首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇编程序无法打开文件

汇编程序无法打开文件
EN

Stack Overflow用户
提问于 2019-05-10 21:19:53
回答 2查看 1.4K关注 0票数 2

组装了迷你版-44卷之后,我试着运行MINI-44.com_。然后显示“无法打开文件”。然后,为了以防万一,我将MyBuild中的所有文件复制到MySource和vdrive\c。但要么没有找到任何文件,要么无法打开文件。我该怎么解决这个问题?

代码语言:javascript
复制
;#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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-11 08:50:24

除了迈克尔·佩奇和彼得·科德斯的评论中已经提到的事情之外:

您不应该使用固定地址(9Eh),而应该使用文件名的标签。

如果修改代码,则地址不再正确。使用标签就能解决这个问题。

而且9Eh 不能是正确的地址,因为.com文件从地址100h开始,所以.com文件中的所有地址至少必须是100h

它不确定地址9Eh的位置(它是为命令行保留的地址空间中的地址;但是,如果命令行参数长度小于20字节,则不使用此地址)。但是,显然存储在9Eh中的数据不是文件名!

因此很明显,您将得到一个“文件未找到”错误,因为dx寄存器包含9Eh,但是在address 9Eh上没有有效的文件名。

票数 0
EN

Stack Overflow用户

发布于 2019-05-16 10:50:55

要编译到.COM文件,只需:

代码语言:javascript
复制
.model tiny
ORG 100h

DOS.SearchFirst函数需要CX参数。为了搜索任何普通文件,请指定CX=0

代码语言:javascript
复制
 mov ah, 4Eh
 xor cx, cx
 mov dx, offset COM_FILE
 int 21h
 jc  Done

将此ASCIIZ文件与通配符一起使用:

代码语言:javascript
复制
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给您的文件名附加到用于请求文件的相同路径上:

代码语言:javascript
复制
 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

有了这些数据定义:

代码语言:javascript
复制
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程序),但您应该使之成为使用正确的程序终止代码的好方法:

代码语言:javascript
复制
mov ax, 4C00h
int 21h
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56084976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档