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

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


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


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

Макросы и стандартные диалоги Windows


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

Как видно из заголовка сегодняшнего урока, я решил обратить ваше внимание на одно из приемуществ ассемблера, макросы. Наверняка многие из Вас уже знают, что это такое, но одно дело знать, а другое использовать. А использовать правильно - это ещё труднее. В зтом уроке мы поговорим об основах написания макросов и сделаем пару примеров, которые будем использовать в нашей программе. Макрос - это часть программы, которая ассемблируется каждый раз, когда компилятор встречает, причём этот код может получать параметры и выполняться в зависимости от них! Например мокрос обнуления регистра директивой xor может быть очень удобен, давайте создадим файл makros.inc и запишем в него следующий макрос:
null macro param1
xor param1,param1
endm
после добавление в файл с кодом программы строки include macros.inc команда null eax будет интерпритироваться как xor eax,eax, null ebx - xor ebx,ebx и т.д. Вы спросите нафиг это надо, ведь и так не было так трудно написать, однако если кто-то не очень соображающий в ассемблере увидит xor eax,eax, он в 99 случаях из ста непоймёт что это такое, а null eax заставит его подумать, что происходит обнуление еах. Это вторая полезность макросов, они делают программу более понятной. Пока макросы нам не особо нужны, но при написании более серьёзных программ они начинают играть серьёзную роль.


Другой вопрос, который я хотел бы рассмотреть сегодня, это использование стандартных диалогов Windows. В принципе, мы уже сталкивались с этим явлением, так как MessageBox тоже является стандартным диалогом. Сегодня мы познакомимся со стандартным диалогом открытия файла, который вызывается функцией Windows GetOpenFileName, которая получает один(!) параметр, offset структуры OPENFILENAME, которую мы сейчас и рассмотрим:
OPENFILENAME struc
 lStructSizedd?Размер структуры
 hwndOwnerdd?Окно-родитель
 _hInstancedd?Индификатор модуля породителя
 lpstrFilterdd?Фильтр поиска
 lpstrCustomFilterdd?Дополнительный фильтр
 nMaxCustFilterdd?Размер дополнительного фильтра в байтах
 nFilterIndexdd?Показывает какой дополнительный фильтр используется
 lpstrFiledd?Пока нас не интересует
 nMaxFiledd?Максимальный размер предидущего параметра
 lpstrFileTitledd?offset на строку, в которую будет записано имя файла
 nMaxFileTitledd?Максимальный размер имени файла
 lpstrInitialDirdd?Директория инициализации
 lpstrTitledd?Название диалога
 Flagsdd?Флаги поиска
 nFileOffsetdw?Пока нас не интересует
 nFileExtensiondw?Пока нас не интересует
 lpstrDefExtdd?Пока нас не интересует
 lCustDatadd?Пока нас не интересует
 lpfnHookdd?Пока нас не интересует
 lpTemplateNamedd?Пока нас не интересует
OPENFILENAME endsМногие параметры я оставил без объяснения так как мы ещё не умеем использовать операции для которых они существуют.


includekernel32.inc
includeuser32.inc
includedef32.inc
includecomdlg32.inc;добавляем библиотеку стандартных диалогов Windows
includemacros.inc;и наш макрос (пока один)
MAXFILENAMEequ260
.386
.model flat
.data
errordb'Ошибка',0
error1db'Файл не задан',0
error2db'Заданный файл не существует',0
filtersdb'Text files',0,'*.txt',0;Фильтры поиска
db'All Files',0,'*.*',0,0
fileNamedd0
programHandledd0
fileHandledd0
memoryHandledd0
memoryOffsetdd0
SizeRWdd0
filename_dbMAXFILENAME dup(0)
ofnOPENFILENAME<size ofn,?,?,offset filters,?,?,?,offset filename_,MAXFILENAME,0,?,0,?,?,?,?,0,?,?,?>
.code
_start:
nullebx;используем наш макрос
pushebx
callGetModuleHandle
movprogramHandle,eax
callGetCommandLine
movedi,eax
moval,20h
movecx,-1
repnescasb
cmpbyte ptr [edi],0
jneFile_OK
movofn.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXISTor OFN_EXPLORER
pushoffset ofn
callGetOpenFileName;вызываем диалог
testeax,eax;Если не "отмена", то возвращено ненулевое значение
jzprogram_end
movfileName,offset filename_для совместимости с уже написаным!
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

Следующие файлы Вы можете скачать к этому уроку:
0012asm - код программы
0012exe - компиляторы и сама программа
0012inc - файлы дополнения
0012lib - библиотеки импорта


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



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

be number one


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

В избранное