Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


Информационный Канал Subscribe.Ru


Ассемблер под Windows №10

Работа с файлами


Доброго времени суток, уважаемые подписчики.

При написании программы-примера к сожалению понял, что нам не обойтись без использования функций Windows работы с памятью. Поэтому перед программой я кратко опишу все используемые функции, их не так уж и много, всего 4:

GlobalAlloc
Создаёт блок памяти. Вход:
  • Размер запрашиваемой памяти
  • Аттрибуты создаваемого блока памяти
Выход = handle блока памяти

GlobalLock
Отображает блок в памяти. Вход:

  • Блок памяти для отображения
Выход = offset на начало отображённых данных

GlobalUnlock
Прекращает отображения блока в память. Вход:

  • Отображаемый блок
Выход = не 0

GlobalFree
Уничтожает блок памяти. Вход:

  • Handle блока для уничтожения
Выход = не 0

Как Вы уже успели заметить, в Windows мы должны не просто выделить программе блок памяти, а создать её блок виртуальной памяти и открыть его в память


А теперь сама программа:

includekernel32.inc
includeuser32.inc
includedef32.inc
.386
.model flat
.data
errordb'Ошибка',0
error1db'Файл не задан',0
error2db'Заданный файл не существует',0
fileNamedd0
programHandledd0
fileHandledd0
memoryHandledd0
memoryOffsetdd0
SizeRWdd0
.code
_start:
xorebx,ebx
push0
callGetModuleHandle
movprogramHandle,eax
callGetCommandLine
movedi,eax
moval,20h
movecx,-1
repnescasb
cmpbyte ptr [edi],0
jneFile_OK
moveax,offset error1
jmpprogram_error
File_OK:
repescasb
decedi
movesi,edi
movfileName,edi
pushebx
pushFILE_ATTRIBUTE_ARCHIVE
pushOPEN_EXISTING
pushebx
pushFILE_SHARE_READ
pushGENERIC_READ
pushesi
callCreateFile
testeax,eax
jnzfile_opened_OK
moveax,offset error2
jmpprogram_error
file_opened_OK:
movfileHandle,eax
pushebx
pusheax
callGetFileSize
movedi,eax
pusheax
pushGMEM_MOVEABLE or GMEM_ZEROINIT
callGlobalAlloc
movmemoryHandle,eax
pusheax
callGlobalLock
movmemoryOffset,eax
pushebx
pushoffset SizeRW
pushedi
pusheax
pushfileHandle
callReadFile
pushfileHandle
callCloseHandle
callCheckSymbol
pushebx
pushFILE_ATTRIBUTE_ARCHIVE
pushTRUNCATE_EXISTING
pushebx
pushFILE_SHARE_WRITE
pushGENERIC_WRITE
pushfileName
callCreateFile
pushebx
pushoffset SizeRW
pushedi
pushmemoryOffset
pushFileHandle
callWriteFile
pushfileHandle
callCloseHandle
program_end:
pushmemoryOffset
callGlobalUnlock
pushmemoryHandle
callGlobalFree
pushebx
callexitProcess
program_error:
pushMB_IconWarning
pushoffset error
pusheax
pushebx
callMessageBox
jmpprogram_end
CheckSymbolproc
pushedi
moval,'s'
movecx,edi
incecx
movedi,memoryOffset
loop_check:
repnescasb
testecx,ecx
jzend_check
movbyte ptr [edi-1],'$'
jmploop_check
end_check:
popedi
ret
CheckSymbolendp
end_start

Программа заменяет все 's' на '$', использование: имя_программы имя_файла

Обязательное содержимое файлов дополнений, допишите недостающие части:
kernel32.inc:
 extrn __imp__ExitProcess@4:dword
 extrn __imp__GetModuleHandleA@4:dword
 extrn __imp__GetCommandLineA@0:dword
 extrn __imp__CloseHandle@4:dword
 extrn __imp__GlobalAlloc@8:dword
 extrn __imp__GlobalLock@4:dword
 extrn __imp__GlobalUnlock@4:dword
 extrn __imp__GlobalFree@4:dword
 extrn __imp__CreateFileA@28:dword
 extrn __imp__ReadFile@20:dword
 extrn __imp__WriteFile@20:dword
 extrn __imp__GetFileSize@8:dword
ExitProcess equ __imp__ExitProcess@4
GetModuleHandle equ __imp__GetModuleHandleA@4
GetCommandLine equ __imp__GetCommandLineA@0
CloseHandle equ __imp__CloseHandle@4
GlobalAlloc equ __imp__GlobalAlloc@8
GlobalLock equ __imp__GlobalLock@4
GlobalUnlock equ __imp__GlobalUnlock@4
GlobalFree equ __imp__GlobalFree@4
CreateFile equ __imp__CreateFileA@28
ReadFile equ __imp__ReadFile@20
WriteFile equ __imp__WriteFile@20
GetFileSize equ __imp__GetFileSize@8
def32.inc:
OPEN_EXISTINGequ3
CREATE_ALWAYSequ2
TRUNCATE_EXISTINGequ5
GMEM_MOVEABLEequ2
GMEM_ZEROINITequ40h
GENERIC_READequ80000000h
GENERIC_WRITEequ40000000h
FILE_SHARE_READequ1
FILE_SHARE_WRITEequ2
FILE_ATTRIBUTE_ARCHIVE equ20h
MB_ICONWARNINGequ30h


На сегодня это всё. Если есть какие вопросы, пишите, обязательно отвечу. В следующий раз мы рассмотрим написанную сегодня программу. Пишите, Dark_Lord@RusFAQ.ru, Dark_Lord@land.ru.
Или свяжитесь со мной по ICQ, мой номер 126222874!



При поддержке RusFAQ.ru

be number one


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное