Информация


Programm.ws - это сайт, на котором вы можете почитать литературу по языкам программирования, а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..

Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.

Глава 7. Работа с файлами в программах на ассемблере

Создание, открытие, закрытие и удаление файла

Создание и открытие файла в Win32 производится одной функцией CreateFile. HANDLE CreateFi1eCLPCTSTR ipFileName, DWORD dwDesiredAccess. DWORD dwShareMode. LPSECURITY_ATTRIBUTES ipSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes. HANDLE hTemplateFile):
Параметры данной функции имеют размер двойного слова. Их назначение следующее (параметры описаны в порядке, обратном их записи в стек):

  • lpFileName — указатель на ASCIIZ-строку с именем (путем) открываемого или создаваемого файла;
  • dwDesiredAccess — тип доступа к файлу:
  • GENERICREAD = 80000000b - доступ по чтению;
  • GENERIC_WRITE = 40000000b - доступ по записи;
  • GENERIC_READ+GENERIC_WRITE = 0C0000000h - доступ по чтению-записи;
  • DwShareMode — режим разделения файлов между разными процессами, данный параметр может принимать значения:
    0 — монополизация доступа к файлу;
  • FILE_SHARE_READ = 0000000th — другие процессы могут открыть файл, но только по чтению, запись в файл монополизирована процессом, открывшим файл;
    FILESHAREWRITE = 00000002b — другие процессы могут открыть файл, но только по записи, чтение в файл монополизировано процессом, открывшим файл;
  • FILE_SHARE_READ+FILE_SHARE_WRITE = 00000003b - другие процессы могут
    открывать файл по чтению-записи;
  • IpSecurityAttributes — указатель на структуру SecurityAttributes (файл winbase.h), определяющую защиту связанного с файлом объекта ядра, при отсутствии защиты заносится NULL;
    ш dwCreationDistribution — определяет действия для случаев, когда файл существует или не существует (аналог этого параметра используется при вызове описанных выше функций MS DOS 6ch и 716ch), данный параметр может принимать значения:
  • CREATE_NEW= 1 — создать новый файл, если файл не существует; если файл существует, то функция завершается формированием ошибки;
  • CREATE_ALWAYS=2 — создать новый файл, если файл не существует; если он существует, то заместить новым;
  • 0PEN_EXISTING=3 — открыть файл, если он существует; если файл не существует, то формируется ошибка;
  • 0PEN_ALWAYS=4 — открыть файл при его существовании и создать его если файла нет;
    TRUNCATE_EXISTING=5 — открыть файл с усечением его до нулевой длины; если файл не существует, то формируется ошибка;
    DwFlagsAndAttributes — флаги и атрибуты; этот параметр используется для задания характеристик создаваемого файла:
  • FILE_ATTRIBUTE_READ0NLY=OOOO0OOlh - файл только для чтения;
  • FILE_ATTRIBUTE_HIDDEN=00000002h - скрытый файл;
  • FILE_ATTRIBUTE_SYSTEM=00000004h - системный файл;
  • FILE_ATrRIBUTE_DIRECTORY=OO0000lOh - каталог;
  • FILE ATTRIBUTE ARCHIVE=00000020h - архивный ф'айл;
  • FILE_ATTRIBUTE_N0RMAL=00000080h - обычный файл для чтения-записи (этот атрибут нельзя комбинировать с другими);
  • FILE_ATTRIBUTE_TEMPORARY=0000Ol00h - создается временный файл (преимущество этого файла в том, что система стремится не записывать этот файл на диск, а работать с ним в памяти; этот атрибут выгодно комбинировать с флагом FILE_FLAG_DELETE_ON_CLOSE, тогда после закрытия файла в программе он будет удален, не оставив следов на диске, иначе, как и bMS DOS, программе придется «подчищать» за собой содержимое диска);
  • FILE_FLAG_WRITE_THR0UGH=80000000h - не использовать промежуточное кэширование при записи на диск, а все изменения записывать прямо на диск;
  • FILE_FLAG_NO_BUFFERING=20000000h - не использовать средства буферизации операционной системы;
  • FILE_FLAG_RANDOM_ACCESS=10000000h - прямой доступ к файлу (установка этого флага или флага
  • ILE_FLAG_SEQUENTIAL_SCAN позволяет оптимизировать системе процесс кэширования);
  • FILE_FLAG_SEQUENTIAL_SCAN=08000000h - последовательный доступ к файлу; 0
  • ILE_FLAG_DELETE_0N_CL0SE=04000000h - удалить файл после его закрытия (см. описание атрибута
  • ILEATTRIBUTETEMPORARY);
  • FILE_FLAG_0VERLAPPED=40000000h - асинхронный доступ к файлу (синхронность означает то, что программа, вызвавшая функцию для доступа к файлу, приостанавливается до тех пор, пока не закончит работу функция ввода-вывода);
  • hTemplateFile — параметр используется только при создании нового файла, его значением является дескриптор другого существующего и предварительно открытого файла, а новый файл создается с теми же значениями атрибутов и флагов, что и у файла, дескриптор которого указан в параметре hTemplateFile.

При удачном завершении функция возвращает в регистре ЕАХ дескриптор нового файла. В случае неудачи функция возвращает в регистре ЕАХ значение NULL.

Закрытие файла

Закрытие файла производится функцией Cl oseHandl e:
B00L C1oseHandle( HANDLE hObject );
Функция имеет один параметр размером в двойное слово — дескриптор, полученный при открытии файла функцией CreateFile.
При удачном завершении функция возвращает ненулевое значение в регистре ЕАХ. В случае неудачи функция возвращает в регистре ЕАХ значение NULL.
Win32 поддерживает несколько функций для часто используемых операций над файлами: копирование, перемещение и переименование файлов.

Копирование файла

Для копирования файлов в Win32 используется функция CopyFile:
B00L CopyFile(LPCTSTR lpExistingFileName. LPCTSTR ipNewFileName. B00L bFailIfExists): Параметрами этой функции являются:

  • lpExistingFileName — указатель на ASCIIZ-строку с именем файла-источника;
  • lpNewFileName — указатель на ASCIIZ-строку с именем файла-приемника, который может и не существовать;
  • bFailIfExists — параметр, задаваемый равным 0 или 1, в зависимости от условий копирования:
  • 0 — при наличии файла он удаляется и создается новый с содержимым файла-источника;
  • 1 — при наличии файла копирование не производится, а функция CopyFile
    возвращает ошибку.

При удачном завершении функция возвращает ненулевое значение в регистре ЕАХ. В случае неудачи функция возвращает в регистре ЕАХ значение NULL.

;prg07_29.asm - Win32-nporpaMMa консольного приложения для исследования
;работы функции CopyFile API Win32.
;..........................................................
.data
TitleText db 'Копирование файлов в Win32'.О
s_file db "p".O ;имя входного файла
d_file db "pi".0 ;имя выходного файла
.code
mov eax.l
push eax
push offset d_file
push offset s_file
call CopyFileA
cmp eax.O
jz exit .выход в случае неудачи
:.........

Перемещение файла

Для перемещение файла Win32 содержит две функции MoveFile и MoveFi 1 еЕх:
BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileNam):
BOOL MoveFileEx(LPCTSTR TpExistingFileName. LPCTSTR ipNewFileName. DWORD dwFlags):
Параметрами функции MoveFile являются указатели на ASCIIZ-строки с именами файла-источника и файла-приемника. Функция MoveFi 1 еЕх обладает дополнительными свойствами благодаря наличию третьего параметра, который определяет особенности перемещения:

  • MOVEFILE REPLACE_EXISTING=00000001h - при существовании целевого файла он замещается содержимым файла-источника;
  • MOVEFILE_COPY_AL10WED=00000002h - если не указывать специально, то
  • функция MoveFi 1 еЕх не перемещает файлы на другой диск, а если перемещение требуется, необходимо устанавливать этот флаг; .
  • MOVEFILE_DELAY_UNTIL_REBOOT=00000004h - (только для Windows NT и выше) файл-источник не удаляется до перезагрузки системы;
  • MOVEFILE_WRITE_THROUGH=00000008h — установка флага гарантирует, что возврат из функции не произойдет до фактического перемещения и удаления файла.

Кроме этого, функция MoveFi 1 еЕх допускает указание на месте второго параметра значения NULL, тем самым моделируя вызов функции Del eteFi I e.
При удачном завершении функции MoveFile и MoveFi 1 еЕх возвращают ненулевое значение в регистре ЕАХ. В случае неудачи функции возвращают в регистре ЕАХ значение NULL.

:prg07_30.asm - Win32-nporpaMMa консольного приложения для исследования :работы функции MoveFile(Ex) API Win32.
:
.data
TitleText db 'Перемещение файлов в Win32'.О
s_file db "p",0 ;имя входного файла
d_file db "pi".0 :имя выходного файла
.code
:.........
push offset d_file
push offset s_file
call MoveFileA
cmp eax.O
jz exit :выход в случае неудачи

Переименование файла

Специальной функции для переименования файла нет, так как она и не нужна — перемещение файла в пределах одного каталога по сути и является его переименованием.

Удаление файла

Для удаления файла применяется функция Del eteFi I e:
BOOL DeleteFile(LPCTSTR TpFileName);
У нее единственный параметр — указатель на ASCIIZ-строку с именем (путем) удаляемого файла. Перед удалением файл необходимо закрыть, хотя в некоторых версиях Windows это не является обязательным.
При удачном завершении функция возвращает ненулевое значение в регистре ЕАХ. В случае неудачи функция возвращает в регистре ЕАХ значение NULL.