Иллюстрированный самоучитель по задачам и примерам Assembler

Чтение, запись, позиционирование в файле

Чтение из файла или устройства

Чтение из файла в область памяти осуществляется функцией 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
…….

Не забывайте после определения размера файла возвращать файловый указатель в нужное место файла.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.