После сборки 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
Nemesis 11 Май 2019 в 00:19

2 ответа

Лучший ответ

В дополнение к вещам, уже упомянутым в комментариях Майкла Петча и Питера Кордеса:

Не следует использовать фиксированный адрес (9Eh), но метку для имени файла.

Если вы измените код, адрес больше не будет правильным. Использование ярлыка исправит это.

И 9Eh не может быть правильным адресом, поскольку файл .com начинается с адреса 100h, поэтому все адреса в файле .com должны быть как минимум 100h .

Неясно, что находится по адресу 9Eh (это адрес внутри адресного пространства, зарезервированного для командной строки; однако этот адрес не используется, если аргументы командной строки имеют длину менее ~ 20 байт). Однако очевидно, что данные, хранящиеся в 9Eh, не являются именами файлов!

Таким образом, ясно, что вы получите ошибку «файл не найден», поскольку в регистре dx содержится 9Eh, но по адресу 9Eh нет действительного имени файла.

0
Martin Rosenau 11 Май 2019 в 08:50

Все, что вам нужно для компиляции в файл .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 (область передачи диска) составляет 80 часов, вы можете сказать: FNAME equ 9EH.
Если DOS обнаружит какой-либо соответствующий файл, его имя файла ASCIIZ будет по адресу 9Eh.

Если, однако, адрес DTA был изменен (обычно это то, что вы бы сделали самостоятельно с помощью функции 1Ah ) вам нужно использовать другой адрес. Вы всегда можете получить текущий адрес DTA с помощью функции 2Fh. Результат будет в ES:BX.

Я установил emu8086 на C: \ 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!
. Параметр размера CX не просто CL.


DONE:
RET

Хотя здесь это работает (программа .COM с неповрежденным стеком), вы должны сделать это привычкой, чтобы использовать правильный код завершения программы:

mov ax, 4C00h
int 21h
2
Fifoernik 16 Май 2019 в 12:39