Сборник по задачам и примерам 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 Ьх.handle :дескриптор файла - в Ьх

mov al .0

xor ex.ex

xordx.dx ;CX:DX =0 - нулевое смещение

mov ah,42h

int 21h :текущий указатель в начале файла

jc exit :если ошибка

;.........читаем файл по lenjstring байт................---

cycl: mov bx.handle :дескриптор файла в Ьх 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

.......

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


Содержание раздела