Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





В принципе в приложениях на ассемблере можно использовать любые внешние процедуры, например из библиотек Visual Studio .NET. Эти процедуры могут иметь другие соглашения о вызовах, например cdeci.
Директива .data определяет область данных для программы. Это означает, что в непрерывном адресном пространстве выделяется логический сегмент данных. Если в 16-разрядных приложениях для инициализации области данных программист обычно использовал регистр DS, ТО в 32-разрядных приложениях об этом заботиться не нужно.
Директива . code обозначает начало кода нашей программы.
Теперь мы знаем достаточно, чтобы приступить к разработке первого приложения на ассемблере в операционной системе Windows. Программа будет выводить в окно текст "ПРИВЕТ ИЗ АССЕМБЛЕРА ! " .
Исходный текст программы (назовем ее HELLOW) приведен в листинге 4.12.
Листинг 4.12. Программе HELLOW, выводящая в окно строку символов
. HELLOW.ASM
.386
.model flat, stdcaii
option casemap : none ; различаем регистр символов
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

Прототипы функций
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
szDisplayName DB "ПЕРВОЕ ГРАФИЧЕСКОЕ ПРИЛОЖЕНИЕ HA АССЕМБЛЕРЕ", CommandLine DD О
hWnd DD 0
hlnstance DD О
szClassName DB "Demo_Class", О
textMes DB "ПРИВЕТ ИЗ АССЕМБЛЕРА!"
lenText EQU $-textMes
. code
start:
push NULL
call GetModuleHandle
mov hlnstance, EAX
call GetCommandLine
mov CommandLine, EAX
push SW_SHOWDEFAULT
push CommandLine
push NULL
push hlnstance
call WinMain
push EAX
call ExitProcess
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

; Локальные переменные процедуры
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
; Заполнение структуры WNDCLASSEX требуемыми параметрами
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hlnst
pop wc.hlnstance
}
mov wc.hbrBackground, C0L0R_BTNFACE+1
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
push IDI_APPLICATION
push NULL
call Loadlcon
mov wc.hlcon, EAX
push IDC_ARROW
push NULL
call LoadCursor
mov wc.hCursor, EAX
mov wc.hlconSm, 0
lea EAX, wc
push EAX
call Regist'erClassEx
push NULL
push hlnst
push NULL
push NULL
push CWJJSEDEFAULT
push CWJJSEDEFAULT
push CWJJSEDEFAULT
push CWJJSEDEFAULT
push WS_OVERLAPPEDWINDOW
push offset szDisplayName
mov EAX, msg.wParam
ret
WinMain endp
push offset szClassName
push WS_EX_OVERLAPPEDWINDOW
call CreateWindowEx
mov hWnd, EAX
push SW_SHOWNORMAL
push hWnd
call ShowWindow
push hWnd
call UpdateWindow

; Здесь выполняется цикл обработки сообщений
StartLoop:
push О
push О
push NULL
lea EAX, msg
push EAX
call GetMessage
cmp EAX, 0
je ExitLoop
lea EAX, msg
push EAX
call TranslateMessage
lea EAX, msg
push EAX
call DispatchMessage
jmp StartLoop
ExitLoop:

Оконная процедура нашего приложения
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
1Param :DWORD
LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
cmp uMsg, WM_PAINT
jne next_l
lea EDX, ps
push EDX
push hWnd
call BeginPaint
mov hdc, EAX
push lenText
push offset textMes
push 100
push 100
push hdc
call TextOut
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret
next_l:
cmp uMsg, WM_DESTROY
jne next_2
push NULL
call PostQuitMessage
xor EAX, EAX
ret
next 2:
push
push
push
push
wParam
hWin
uMsg
lParam
call DefWindowProc
ret
WndProc endp
end start


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru