Мне пришлось исправить ваш код в следующих пунктах:
boolean db 'boolean.txt',0
изменено на (чтобы был определен символ file_name
):
file_name db 'boolean.txt',0
И "главный"не настраивал ds
:
...
START:
mov ax,SEG _DATI
mov ds,ax
call ReadFile
...
После этого я скомпилировал код с помощью TASM (tasm so_readf.asm
tlink /x so_readf.obj
, предупреждение о пропаже стека сообщалось и игнорировалось, затем td so_readf.exe
для его отладки),создал файл "BOOLEAN.TXT", содержащий два байта 0x78 0x0A (буква "x" с новой строкой, отредактированный с помощью текстового редактора linux), и использовал турбо-отладчик для проверки его работоспособности (в эмуляторе dosbox
).
ПослеСлужба «чтения» в представлении памяти ds:0000
показывает 78
«x» вместо 00
байтового значения, как и ожидалось.
У меня была проблема с открытием файла, потому что я создал его после того, как уже запустилdosbox, поэтому о его существовании не было известно dosbox, и он впервые сообщил о CF=1, ax=2
после службы «открыть файл».После использования команды «rescan» dosbox следующий запуск отладчика работал как положено.Но эта проблема связана только с моей средой тестирования (dosbox под linux), если вы используете другой эмулятор или живую систему DOS, вы можете не столкнуться с этим.Также, если файл «boolean.txt» создан в результате выполнения другого кода внутри того же эмулятора / dosbox, файл должен быть виден.Вы можете выполнить в командной строке DOS «type boolean.txt
», чтобы увидеть его текущее содержимое и убедиться в его существовании.
Но в остальном, как и ожидалось, то, что вы делали, является правильным, если все предварительные условия, т.е. вываш ds
действителен, и вы находитесь в правильном рабочем каталоге, и вы не исчерпали дескрипторы файлов (закрываете ли вы все файлы, которые открывались раньше?) и т. д. Также при отладке в отладчике встречаются недопустимые случаис неправильным именем файла (неправильное ds
), и dosbox не знает о файле, правильно завершился с CF = 1 после «открытия файла», так что я мог завершить код в отладчике раньше (так как нет кода обработки ошибок, поэтомубудет делать неправильные вещи потом).
Попробуйте еще раз в отладчике определить, что именно не работает, и все возвращаемые значения из каждых int 21h
, например, «прочитанные» возвращают количество байтов, прочитанных в ax
, должно быть 1 в случае успеха.