FILE END ;Способ перемещения — относительно конца файла
Рассмотрим еще один пример использования функции SetFilePointer. В файле Sudba записана фраза «Хранить нельзя помиловать». Необходимо поставить в нужном месте запятую:
.586 Model flat, stdcall BSIZE equ 128 Data fname db “Sudba”, 0 fhandle dd? cwritten dd? cread dd? cwrite dd? cоmmo db ”, ” buffer db BSIZE dup(?) Code start: invoke GetStdHandle, ADDR fname, GENERIC_READ+GENERIC_WRITE, 0, \ NULL, OPEN_EXISTING, FIlE_ATTRIBUTE_NORM, 0 Mov fhandle, eax Invoke SetFilePointer, fhandle, 7, NULL, FILE_BEGIN Invoke ReadFile, fhandle, ADDR buffer, BSIZE, ADDR cread, NULL Invoke SetFilePointer, fhandle, 7, NULL, FILE_BEGIN Invoke WriteFile, fhandle, ADDR commo, 1, ADDR cwrite, NULL Invoke WriteFile, fhandle, ADDR buffer, cread, ADDR cwrite, NULL Invoke CloseHandle, fhandle ExitProcess, 0 End start Пример. Написать программу с записью данных в файл. Проанализировать 2 массива, которые состоят из 15 элементов каждый. Подсчитать количество элементов первого массива, которые имеют равные значения во втором массиве. Вывести соответствующие сообщения в файл лабораторная по файлам.txt. Текст программы: Директива определения типа микропроцессора .model flat, stdcall; задание линейной модели памяти option casemap: none; отличие малых и больших букв Include windows.inc Include kernel32.inc Includelib user32.lib Includelib kernel32.lib BSIZE equ 42; количество байтов, записываемых в файл Data; директива определения данные fName BYTE " N: \5050-43 Программирование на языке ассемблера\MASM_32\лабораторная по файлам.txt", 0 fHandle DWORD?; резервирование у памяти 32-разрядной cWritten DWORD?; резервирование участка памяти размером в слово с именем cWritten для адреса символов выведения st1 db 'Количество одинаковых чисел в массиве = ', 0; нуль-завершенная строка st1_kol = $ - st1 St2 db 50 dup(0) Stemp2 db 2 dup(0), 0 ifmt db " %d ", 0; нуль завершенная строка формата вывода целых чисел MasivA db 1, 6, 4, 6, 9, 15, 21, 2, 51, 8, 12, 3, 13 MasivB db 1, 5, 4, 43, 13, 4, 65, 9, 7, 21, 32, 23, 15, 51, 66 Temp db 15 Prom db 0 .code; директива начала сегмента данных start:; метка начала программы с именем start Mov eax, 0 Mov ebx, 0 Lea esi, masivA M1: Mov eax, 0 mov al, byte ptr[esi] Lea edi, masivB Dec temp Jz _end Inc esi Mov ecx, 15 Temp1: mov bl, byte ptr[edi] Inc edi Cmp eax, ebx Jz M3 M2: Loop Temp1 Jmp M1 M3: Inc prom Jmp M1 _end: Lea edi, st2 Lea esi, st1 Mov ecx, st1_kol _m1: mov al, [esi] mov [edi], al Inc esi Inc edi Loop _m1 Mov eax, 0 Mov al, prom invoke wsprintf, \; АПИ-ФУНКЦИЯ преобразования числа ADDR stemp2, \; адрес буфф., куда будет записан помет. символов ADDR ifmt, \; адрес строки преобразования формата eax; регистр, содержание которого преобразовывается Lea esi, stemp2 Mov ecx, 2
|