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

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


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


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

Windows = Окна


Доброго время суток, уважаемые подписщики. Сегодня у нас первый урок ассемблера под Windows. А что есть Windows?! В переводе с англиского это значит окна, и самым главным элементом Windows, на мой взгляд являются окна.(Я думаю MessageBox все уже умеют вызывать;) В этом уроке Вы узнаете как создавать окна на языке ассемблер. Для начала нам нужны инструменты для компиляции наших программ, поэтому я предполагаю, что следующие программы у Вас есть(всё это есть в MASM32):
- ml.exe
- link.exe
- kernel32.lib
- user32.lib
Если нет, пишите мне, я вышлю. (очень важно, чтобы link.exe был 32-ух битным, тот, чем Вы компилили под Дос нам не пойдёт!) Для написания програм Вам понадобится любой текстовой редактор, я лично пользуюсь блокнотом (Notepad) из стандартной инсталяции Windows. На мой взгляд лучше создать директорию, в которую сложить все эти файлы, и в которой создавать свои, но это дело каждого.


В Windows, в отличии от Доса, всё происходит путём обращения к системным функциям, а прирывания используются для системных нужд. Существует набор так называемых библиотек (файлы с расширением .dll), к которым и происходит обращение. Библиотеки удобны тем, что их можно загрузить, если они требуются, в память, а когда их никто не использует, выгружаются. Также одну и туже библиотеку может использовать одновременно несколько программ. Тоесть это, как процедуры в памяти, которые можно использовать из любого места памяти. Однако надо сказать программе, где находятся эти процедуры. Именно для этого нам и нужны файлы kernel32.lib и user32.lib, они и содержат эти метки. Но чтоб ассемблер мог понять что они значат, и как их использовать, нам самим нужно создать файлы .inc с описанием процедур. Тоесть для начала нам потребуется создать два файла, kernel32.inc и user32.inc. В них нам надо указать, какие процедуры из какой библиотеки нам доступны.

kernel32.inc:

extrn__imp__GetModuleHandleA@4:dword
extrn__imp__ExitProcess@4:dword
ExitProcessequ__imp__ExitProcess@4:
GetModuleHandleequ__imp__GetModuleHandleA@4

user32.inc:

extrn__imp__DispatchMessageA@4:dword
extrn__imp__TranslateMessage@4:dword
extrn__imp__GetMessageA@16:dword
extrn__imp__LoadIconA@8:dword
extrn__imp__UpdateWindow@4:dword
extrn__imp__ShowWindow@8:dword
extrn__imp__CreateWindowExA@48:dword
extrn__imp__DefWindowProcA@16:dword
extrn__imp__PostQuitMessage@4:dword
extrn__imp__RegisterClassExA@4:dword
extrn__imp__LoadCursorA@8:dword
extrn__imp__DestroyWindow@4:dword
DispatchMessageequ__imp__DispatchMessageA@4
TranslateMessageequ__imp__TranslateMessage@4
GetMessageequ__imp__GetMessageA@16
LoadIconequ__imp__LoadIconA@8
UpdateWindowequ__imp__UpdateWindow@4
ShowWindowequ__imp__ShowWindow@8
CreateWindowExequ__imp__CreateWindowExA@48
DefWindowProcequ__imp__DefWindowProcA@16
PostQuitMessageequ__imp__PostQuitMessage@4
RegisterClassExequ__imp__RegisterClassExA@4
LoadCursorequ__imp__LoadCursorA@8
DestroyWindowequ__imp__DestroyWindow@4

Ещё есть один момент, нам понадобиться структуры и другие подобные описания. В принципе их можго спокойно записать и в сам файл программы, но зачем захламлять код. Я считаю достаточно удобным создать файл def32.inc и записать в него все параметры!

def32.inc:

IDI_APPLICATIONequ32512
WM_DESTROYequ2
CS_HREDRAWequ2
cs_vREDRAWequ1
CW_USEDEFAULTequ80000000H
WS_OVERLAPPEDWINDOWequ0CF0000H
IDC_ARROWequ32512
SW_SHOWNORMALequ1
COLOR_WINDOWequ5
WNDCLASSEXstruc
cbSizedd?
styledd?
lpfnWndProcdd?
cbClsExtradd?
cbWndExtradd?
hInstancedd?
hIcondd?
hCursordd?
hbrBackgrounddd?
lpszMenuNamedd?
lpszClassNamedd?
hIconSmdd?
WNDCLASSEXends
MSGstruc
hwnddd?
messagedd?
wParamdd?
lParamdd?
timedd?
ptdd?
MSGends

Всё, приготовления закончены! Теперь начинаем писать программу!
window.asm:

includedef32.inc;добавляем наши библиотеки и описания
includeuser32.inc
include kernel32.inc
.386;модель памяти flat появилась на 386 - ом процессоре
.modelflat
.const;константы
classdb"window class 1",0;класс окна
name_db"Da window!",0;Имя окна
.data;переменные
wcwndclassex<4*12,cs_hredraw or cs_vredraw,offset win_proc,0,0,?,?,?, color_window+1,0,offset class,0>
.data?
msg_msg<?,?,?,?,?,?>;сообщения
.code;сам код
_start:;начальная метка
xorebx,ebx
pushebx
callGetmodulehandle
movesi,eax;получаем указатель на нашу программу и помещаем в esi
movdword ptr wc.hInstance,eax;так-же устанавливаем его отцом нашего окна
pushIDI_Application
pushebx
callloadicon
movwc.hIcon,eax;опредиляем нашему окну стандартную иконку Windows
pushidc_arrow
pushebx
callLoadCursor
movwc.hCursor,eax;стандартную мышь
pushoffset wc
callregisterclassEx;регистрируем его (переменную окна wc)
movecx,CW_usedefault
pushebx
pushesi
pushebx
pushebx
pushecx
pushecx
pushecx
pushecx
pushws_overlappedwindow
pushoffset name_
pushoffset class
pushebx
callcreatewindowex;И создаём окно!
pusheax
pushsw_shownormal
pusheax
callshowwindow;показываем его народу;)
callupdatewindow;показываем его и обновляем!
movedi,offset msg_
main_:
pushebx
pushebx
pushebx
pushedi
callGetmessage;получаем сообщение
testeax,eax
jzexit_;если это 0, то выход
pushedi
calltranslatemessage
pushedi
calldispatchmessage;преобразуем сообщения для процедуры окна.
jmpmain_
exit_:
pushebx
callexitprocess;выход из программы
win_procproc;процедура окна!
pushebp
movebp,esp
wp_hWndequdword ptr [ebp+08h];так как сообщения передаются
wp_uMsgequdword ptr [ebp+0Ch];при помощи стека,
wp_wParamequdword ptr [ebp+10h];то можно напрямую
wp_lParamequdword ptr [ebp+14h];к ним обращатся!
cmpwp_uMsg,wm_destroy;если сообщение о закрытии окна
jnenot_
push0
callpostquitmessage;послать сообщение о выходе
jmpend_
not_:;если нет
leave
jmpDefWindowProc;Вернуться к окну, прыгнув на процедуру окна
end_:
leave
ret16;Возвращение из процедуры с удалением из стека четырёх(16/4=4) параметров
win_procendp
end_start

Конечно это кажется каким-то бредом, однако в этом есть логика!

И, самое главное, как это компилировать (переводить в запускаемый формат!). Для этого Вам понадобятся вышеописанные инструменты! Можно компилировать двумя способами, в ручную и батником (файл формата .bat, в который вносятся все команды поочерёдно в порядке их выполнения!). Я предпочитаю батник, и Вам советую. Итак нужно создать файл имя.bat и вписать в него:

ml /c /coff имя_программы.asm
link имя_программы.obj /subsystem:windows

где имя_программы имя файла с кодом!

К сожалению, если б я ещё всё объяснил, то этот урок занял-бы конкретно времени и места, к тому же всегда есть те, кто жаждет понять сам, без чьей либо помощи, поэтому здесь только очень поверхносная инфа, обещаю в течении пары дней описать всё это дело подробно, а на пока хватит! Если что пишите, Dark_Lord@land.ru


be number one Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

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

В избранное