Чтение, запись, позиционирование в файле
Чтение из файла или устройства
Чтение из файла в область памяти осуществляется функцией 3Fh.
Вход: АН = 3Fh; BX = дескриптор файла; СХ = количество байтов для чтения; DS-.DX – указатель на область памяти, в которую помещаются прочитанные байты.
Выход: CF = 0 – АХ = число действительно прочитанных байтов из файла; CF = 1 – АХ = код ошибки: 5 – в доступе отказано; 6 – недопустимый дескриптор.
Чтение данных производится начиная с текущей позиции в файле, которая после успешного чтения смещается на значение, равное количеству прочитанных байтов. Если в качестве файла используется стандартная консоль (клавиатура), то чтение производится до первого символа CR (carriage return) с кодом 0dh, соответствующего нажатию клавиши Enter. Это, кстати, еще один способ ввода данных с клавиатуры в программу. Кроме символов введенной строки в ее конец помещаются символы 0dh и Oah. Это необходимо учитывать при задании размера буфера для ввода.
Способ ввода данных с экрана с помощью функции 3Fh демонстрирует приведенный ниже пример программы.
:prg07_10.asm – программа демонстрации ввода данных с экрана с помощью функции 3Fh. .data string db 80 dup Г ") 1en_string=$-string point_fname dd string .code :………вводим с экрана……-----…..---------------- movbx.O стандартный дескриптор – клавиатура mov cx.len_string Ids dx.point_fname:формируем указатель на строку string movah,3fh;номер функции DOS int 21h jc exit:переход в случае ошибки;---------выводим на экран---------------------……….. movbx.l стандартный дескриптор – экран:две строки ниже в данном случае можно опустить mov ex.len_string Ids dx.point_fname;0opMnpyeM указатель на строку string movah.40h;номер функции DOS int 21h открываем файл jc exit:переход в случае ошибки
Для демонстрации работы функции с дисковым файлом приведем программу чтения и вывода на экран содержимого файла, имя которого вводится в командной строке. Побочная цель этой программы – научиться обрабатывать в программе командную строку DOS. Поясним последний момент.
Содержимое командной строки, следующее за именем программы при ее вызове и называемое хвостом команды, помещается в префикс программного сегмента (PSP) со смещением 80h от его начала и максимально имеет размер 128 байт. Первый байт этой области содержит длину хвоста команды, а первый символ хвоста, при его наличии, располагается со смещением 81h от начала PSP. Последний символ хвоста команды – всегда 0dh. Начало PSP найти очень легко – когда программа загружается в память для исполнения, то загрузчик устанавливает регистры ES и DS равными адресу PSP.
:prg07_ll.asm – программа чтения и вывода на экран содержимого файла. ;имя которого вводится в командной строке. .data filejiame db 128 dup (" ");буфер, в который будет помещен путь к файлу point_fname dd file_name string db 80 dup (" ") len_stnng=$-string point_string dd string >handle dw 0 дескриптор файла [size_f dd 0:размер файла .code main::копируем командную строку в filejiame ;вначале уберем (установкой указателя) ведущие пробелы в командной строке :перед путем к файлу: movdi,81h mov al," " mov ex. 128 repe scasb dec di push di pop si movax.@data – . адрес сегмента данных – в регистр АХ mov es.ax:ax в es iTOvcl.ds:[80h] deccl lea di.filejiame rep movsb push es pop ds :--------открываем файл--……-----------------……… moval.OOh:режим доступа – только чтение Ids dx.point_fname:формируем указатель на имя файла movah.3dh;номер функции DOS int 21h открываем файл jc exit:переход в случае ошибки mov handle.ax ;--------определяем размер файла------------------------- raovbx.ax – . дескриптор файла – в bх mov al.2 xor ex .ex xordx.dx:CX:DX =0 – нулевое смещение mov ah.42h int 21h;в DX:AX возвращается длина файла в байтах jc exit :если ошибка:формируем полную длину в edx shl eax.16 shld edx.eax.16 mov size_f.edx ;сохраним как условие выхода из программы при достижении снизу ;--------устанавливаем указатель на начало файла---……. mov bх.handle:дескриптор файла – в bх mov al.0 xor ex.ex xordx.dx;CX:DX =0 – нулевое смещение mov ah,42h int 21h:текущий указатель в начале файла jc exit:если ошибка ;………читаем файл по lenjstring байт…………….--- cycl: mov bx.handle:дескриптор файла в bх mov cx.lenjsthng Ids dx.pointjstring:формируем указатель на строку string movah.3fh :номер функции DOS int 21h:открываем файл jc exit;переход в случае ошибки ;………выводим на экран целиком…..---------…….---------- movbx.l стандартный дескриптор – экран mov cx.len_string Ids dx.point_string.формируем указатель на строку string movah.40h ;номер функции DOS int 21h открываем файл jc exit:переход в случае ошибки cwde расширяем количество выведенных байт sub size_f.eax cmp size_f.О jleexit:достигли конца файла .jmp cycl exit::выход из программы mov al.1 int 21h …….
Не забывайте после определения размера файла возвращать файловый указатель в нужное место файла.