Code .386 .model flat, stdcall option casemap:none
;Следующие две строчки можно написать если включаемых процедур немного, иначе лучше включить файл с описаниями названий и параметрами ;ExitProcess PROTO:DWORD ;MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
include user32.inc include kernel32.inc
includelib user32.lib includelib kernel32.lib
.data MsgCaption db "Небольшая модификация примера IceZelion'а №2",0 MsgBoxText db "Ассемблирование круто!", 0
.code start: comment + Вариант без invoke push 0 mov eax, offset MsgCaption push eax mov eax, offset MsgBoxText push eax push 0 call MessageBoxA push eax call ExitProcess +++++++++++++++++++++++++++ invoke MessageBoxA ,0, addr MsgBoxText, addr MsgCaption, 0 invoke ExitProcess, eax end start Имеется данный код. Здесь два варианта в одном, упрощённый и как оно было раньше. С введением Invoke (является макросом, а не операцией ассемблера), код стал гораздо читабельнее. Как видно из текста, Invoke производит заталкивание переменных в стек и вызов функции. Заталкивание происходит с лева на право. Нужно отметить, что команда Call тоже заталкивает одну переменную в стек, это адрес возврата в вызывающую функцию. Сразу отмечу блочные комментарии, пишется comment, а за ним указывается символ который будет закрывать блок. В данном случае я выбрал символ плюс. В файлах с расширением .inc находятся описания прототипов функций, константы и т.п. .lib - библиотеки импорта. Размер собранного файла равен 2560 байт. О размерах я ещё напишу как-нибудь, когда будем разбираться с форматом исполняемого файла Windows. Ну в общем то пока всё, для начала.
|