Как читать из текстового файла в сборке? - PullRequest
0 голосов
/ 19 мая 2018

Я новичок в сборке.Я пытаюсь прочитать текстовый файл, это мой код:

_DATI SEGMENT PARA PUBLIC 'DATA' USE16

 Text_Buffer      dw ?
 filehandle       dw ?
 boolean          db 'boolean.txt',0
_DATI ENDS

_CODE SEGMENT PARA PUBLIC 'CODE' USE16
 ASSUME CS:_CODE, DS:_DATI, ES:_DATI

 ReadFile proc 
   mov ah, 3dh ;open the file
   mov al, 0 ;open for reading
   lea dx, file_name 
   int 21h 
   mov [filehandle], ax 

   mov ah, 3fh  
   lea dx, Text_Buffer
   mov cx, 1 ; Read 1 Byte
   mov bx, [filehandle] 
   int 21h

   mov bx, [filehandle]
   mov ah, 3eh ;close file
   int 21h
   ret
ReadFile endp
START:

call ReadFile

_end:

mov ax, 4c00h
int 21h

_CODE ENDS

END START

Разве ASCII из файла не должен быть сохранен в выделенном буфере (Text_Buffer)?

Все, что я сейчас получаю, - это какой-то случайный сохраненный байт, и по какой-то причине программа заканчивается после ввода ввода.Может кто-нибудь объяснить, в чем проблема и как ее решить?Заранее спасибо.

1 Ответ

0 голосов
/ 19 мая 2018

Мне пришлось исправить ваш код в следующих пунктах:

 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 в случае успеха.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...