Макросредства ассемблера в Windows

 

1.Содержание


1. Содержание

. Введение

. Описание использованного набора макросредств.

. Использованные API-функции и системные константы.

.1 Список использованных констант и структур.

.2 Список использованных API-функций.

.3 Основы вызова API-функций

. Демонстрационная программа

.1 Листинг

.2 Результат работы программы

. Вывод


2.Введение


Целью курсовой работы является изучение основ программирования на 32-битном ассемблере, при помощи которого необходимо разработать программу, демонстрирующую работу одного из разделов ОС WINDOWS.

В данном отчете отражена работа макросредств ассемблера в WINDOWS. На основании описанных функций разработана программа, иллюстрирующая возможности макросредств.

Первый вопрос, который задает себе человек, впервые услышавший об ассемблере, - а зачем он, собственно, нужен? Особенно теперь, когда все пишут на C/C++, Delphi или других языках высокого уровня? Действительно очень многое можно создать на С, но ни один язык, даже такой популярный, не может претендовать на то, чтобы на нем можно было написать абсолютно все.

Итак, на ассемблере пишут:

·все, что требует максимальной скорости выполнения: основные компоненты компьютерных игр, ядра операционных систем реального времени и просто критические участки программ;

·все, что взаимодействует с внешними устройствами: драйверы, программы, работающие напрямую с портами, звуковыми и видеоплатами;

·все, что использует полностью возможности процессора: ядра многозадачных операционных систем, DPMI-серверы и вообще любые программы, переводящие процессор в защищенный режим;

·все, что полностью использует возможности операционной системы: вирусы и антивирусы, защиты от несанкционированного доступа, программы, обходящие эти защиты, и программы, защищающиеся от данных программ;

·и многое другое. Стоит познакомиться с ассемблером поближе, как оказывается, что большую часть из того, что обычно пишут на языках высокого уровня, лучше, проще и быстрее написать на ассемблере.

Большинство операционных систем написано преимущественно на языке ассемблера. Поэтому операционную систему Windows нагляднее изучать, используя именно этот язык.

Одно из самых мощных языковых средств ассемблера - макроопределения.

Макроопределением (или макросом) называется участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы. Макрос начинается директивой MACRO и заканчивается ENDM.

Например: пусть описано макроопределение hex2ascii, переводящее шестнадцатеричное число, находящееся в регистре AL, в ASCII-код соответствующей шестнадцатеричной цифры:


hex2ascii macro

cmp al,10

sbb al,69h

das

endm

макросреда ассемблер программа текст

Сейчас в программе можно использовать слово hex2ascii, как если бы это было имя команды, и ассемблер заменит каждое такое слово на три команды, содержащиеся в макроопределении. Разумеется, можно оформить этот же участок кода в виде процедуры и вызывать его командой CALL - если процедура вызывается больше одного раза, этот вариант программы займет меньше места, но вариант с макроопределением станет выполняться быстрее, так как в нем не будет лишних команд CALL и RET. Однако скорость выполнения - не главное преимущество макросов. В отличие от процедур макроопределения могут вызыватьсяс параметрами.

Транслятор ассемблера состоит из двух частей - непосредственно транслятора, формирующего объектный модуль, и макроассемблера (рис. 1).

Рис. 1. Макроассемблер в общей схеме трансляции программы на TASM


Таким образом, обработка программы на ассемблере с использованием макросредств неявно осуществляется транслятором в две фазы(рис. 1).

На первой фазе работает часть компилятора, называемая макроассемблером.

На второй фазе трансляции работает непосредственно ассемблер, задачей которого является формирование объектного кода, содержащего текст исходной программы в машинном виде.


3. Описание использованного набора макросредств


3.1Псевдооператор equ


Этот псевдооператор предназначен для присвоения некоторому выражению символического имени или идентификатора. Впоследствии, когда в ходе трансляции этот идентификатор встретится в телепрограммы, макроассемблер подставит вместо него соответствующее выражение.

В качестве выражения могут быть использованы константы, имена меток, символические имена и строки в апострофах. После присвоения этим конструкциям символического имени его можно использовать везде, где требуется размещение данной конструкции.


.2Структура


Директива STRUC позволяет объединить несколько разнородных данных в одно целое. Эти данные называются полями. Вначале при помощи STRUC определяется шаблон структуры, затем с помощью директивы < > можно определить любое количество структур. Рассмотрим пример:

STRUC COMPLEXDD ?DD ?ENDS

...

;в сегменте данных

COMP1 COMPLEX <?>

COMP2 COMPLEX <?>


3.3Условное ассемблирование


Условное ассемблирование дает возможность при трансляции обходить тот или иной участок программы. Существует три вида условного ассемблирования.

а)выражение

...

б)выражение

...

...

в)выражение 1

...выражение 2

...выражение 3

...

...

Условие считается


3.4Макроповторения


. Повторение, заданное определенное число раз. Используется макродиректива REPT. Например:

A EQU 10100A

Будет сгенерировано 100 директив DB 10.

. Директива IRP.

IRP параметр,<список>

...

Блок будет вызываться столько раз, сколько параметров в списке. Например:

IRP REG, <EAX,EBX,ECX,EDX,ESI,EDI>REG

Приведет к генерации следующих строк:

PUSH EAXEBXECXEDXESIEDI

4. Использованные API-функции и системные константы


.1 Список использованных констант и структур


Сообщения:

WM_SETFOCUS equ 7h - Сообщение, посылаемое окну, после того, как оно получило фокус.

WM_DESTROYequ2 - Завершить приложение.

WM_CREATEequ1 - Создать окно.

WM_PAINTequ 0FH - Отрисовка окна из буфера.

WM_COMMAND equ 111h - Сообщение, приходящее на функцию окна, при наступлении события с управляющим элементом, пунктом меню, а также от акселератора.

WM_SETTEXT equ 0Ch - Сообщение, используемое приложением для посылки текстовой строки окну и интерпретируемое в зависимости от типа окна (обычное окно - заголовок, кнопка - надпись на кнопке, окно редактирования - содержимое этого окна и т.д.).

WM_GETTEXT equ 0Dh - Посылается окну для получения текстовой строки, ассоциированной с данным окном (строка редактирования, заголовок окна и т.д.).

Стили окна:

CS_VREDRAW equ1h- Посылка WM_PAINT при изменении.

CS_HREDRAW equ2h- Размеров окна.

CS_GLOBALCLASS equ 4000h- Класс окна._OVERLAPPEDWINDOW equ 000CF0000H- Стиль окна.

Интерфейс:_APPLICATION equ 32512- Иконка_ARROW equ 32512 - Курсор_SHOWNORMAL equ 1 - Режим

показа окна

Структуры:

WNDCLASS STRUC- Класс окна

CLSSTYLE DD ?-Стиль окна

CLWNDPROC DD ? - Основная оконная процедура

CLSCBCLSEX DD? - Пространство для данных

CLSCBWNDEX DD? - Пространство для структур

CLSHINST DD?- Определение класса

CLSHICON DD?- Иконка DD? - КурсорDD? - Фон DD ?-Имя окнаDD ? - Имя классаENDS STRUC- Окраска клиентской области

hdcDD0- Указатель на контекст устройства

fEraseDD0- Стирать ли фон при перерисовке?

leftDD0- Координаты прямоугольника

topDD0- Окна для рисования

right DD 0 - Правая граница

bottom DD 0 - Нижняя граница

fRes DD 0- Зарезервировано Windows

fIncUp DD 0- Зарезервировано Windows

Reserv DB 32 dup(0)- Зарезервировано WindowsENDS STRUC- Структура сообщения

MSHWNDDD?- Указатель на окно

MSMESSAGE DD ? - СообщениеDD ? - Дополнительная информация

MSLPARAMDD?- Дополнительная информация

MSTIMEDD?- Время отправки сообщения

MSPT DD? - Позиция курсора

MSGSTRUCT ENDS


4.2 Список использованных API-функций

- Установить фокус на заданное окно.

SendMessage - Послать сообщение окну.

CreateWindow - Создать окно.

DefWindowProc - Вызывается для сообщений, которые не обрабатываются функцией окна.

DispatchMessage - Вернуть управление Windows с передачей сообщения предназначенному окну.

ExitProcess - Закончить данный процесс со всеми подзадачами (потоками).

GetMessage - Получить очередное сообщение из очереди сообщений данного приложения.

GetModuleHandle - Получить дескриптор приложения.

LoadCursor - Загрузить системный курсор или курсор, определенный в файле ресурсов.

LoadIcon - Загрузить системную иконку или иконку, определенную в файле ресурсов.

PostQuitMessage - Послать текущему приложению сообщение WM_QUIT.

RegisterClass - Зарегистрировать класс окон.

ShowWindow - Показать окно, установить статус показа.

TranslateMessage - Транслировать клавиатурные сообщения в ASCII-коды.

UpdateWindow - Обновить рабочую область окна.

BeginPaint - Получить контекст при получении сообщения WM_PAINT- Удалить контекст, полученный при помощи BeginPaint.- Вывести текст в окно.- Установить цвет фона для вывода текста.- Перерисовать окно.


.3 Основы вызова API-функций


Функции API в ассемблере вызываются способом, схожим с вызовом в языках высокого уровня. Для этого все передаваемые параметры передаются в стек в обратном порядке.

Например, функция:

SendMessage(

__in HWND hWnd,

__in UINT Msg,

__in WPARAM wParam,

__in LPARAM lParam

);

будет вызвана в ассемблере по следующему шаблону:

includelibuser32.lib

EXTERNSendMessageA@16:NEARDB 'Введите текст',0

HWNDEDT1 DWORD 0


OFFSET TEXT0WM_SETTEXTHWNDEDT1SendMessageA@16

В таком вызове API функции SendMessage добавляется символ А, указывающий на ANSI-стандарт, символ @ в роли разделителя и число N в конце, обозначающий количество байт информации, которая передается в функцию через стек.

Далее представим, какие параметры передаются для остальных API-функции:

HWND WINAPI SetFocus(

__in_opt HWND hWnd

);

Тип: HWND

Дескриптор окна, которое будет получать ввод с клавиатуры. Если этот параметр равен NULL , нажатия клавиш игнорируются.

HWND WINAPI CreateWindow(

__in_opt LPCTSTR lpClassName,//строка

__in_opt LPCTSTR lpWindowName,//имя окна

__in DWORD dwStyle,//стиль задаваемого окна

__in int x,//первоначальное горизонтально положение окна

__in int y,//первоначальное вертикальное положение окна

__in int nWidth, //ширина

__in int nHeight, //высота

__in_opt HWND hWndParent, //окно владельца создаваемого окна

__in_opt HMENU hMenu, //обращаться к меню

__in_opt HINSTANCE hInstance, //дескриптор

__in_opt LPVOID lpParam //указатель

);WINAPI DefWindowProc(

__in HWND hWnd, //дескриптор окна

__in UINT Msg, //сообщение

__in WPARAM wParam, //дополнительная информация сообщения

__in LPARAM lParam //дополнительная информация сообщения

);

LRESULT WINAPI DispatchMessage(

__in const MSG *lpmsg //указатель на структуру, содержащую сообщение

);WINAPI ExitProcess(

__in UINT uExitCode //код выхода

);WINAPI GetMessage(

__out LPMSG lpMsg, //указатель на MSG структуру

__in_opt HWND hWnd, //дескриптор окна

__in UINT wMsgFilterMin, // целое число из самых низких сообщение значение для поиска

__in UINT wMsgFilterMax // целое значение самого высокого значения сообщения должны быть извлечены.

);

HMODULE WINAPI GetModuleHandle(

__in_opt LPCTSTR lpModuleName // имя загружаемого модуля (либо DLL или EXE-файл),если EXE файл то параметр равен NULL

);WINAPI LoadCursor(

__in_opt HINSTANCE hInstance, //дескриптор экземпляра модуля

__in LPCTSTR lpCursorName //имя ресурса курсора для загрузки

);WINAPI LoadIcon(

__in_opt HINSTANCE hInstance,

__in LPCTSTR lpIconName //имя ресурса иконки для загрузки

);WINAPI PostQuitMessage(

__in int nExitCode //код выхода из приложения

);WINAPI RegisterClass(

__in const WNDCLASS *lpWndClass //указатель на WINDCLASS структуры

);WINAPI ShowWindow(

__in HWND hWnd, //дескриптор окна

__in int nCmdShow //как окно будет показано на экране

);WINAPI TranslateMessage(

__in const MSG *lpMsg //указатель на MSG структуру

);

BOOL UpdateWindow(

__in HWND hWnd //обращается к окну, чтобы быть обновиться

);

HDC BeginPaint(

__in HWND hwnd, //обращается к окну, чтобы перекрасить

__out LPPAINTSTRUCT lpPaint //указатель на PAINTSTRUCT структуру

);

BOOL EndPaint(

__in HWND hWnd, //дескриптор окна, которое было перекращено

__in const PAINTSTRUCT *lpPaint // указатель на PAINTSTRUCT структуру

);TextOut(

__in HDC hdc, //дескриптор контекста устройств

__in int nXStart, //координата Х

__in int nYStart, //коорданата Y

__in LPCTSTR lpString, //указатель на строку

__in int cchString //длина строки

);SetBkColor(

__in HDC hdc, //дескриптор контекста устройств

__in COLORREF crColor //новый цвет фона, используется RGB макрос

);InvalidateRect(

__in HWND hWnd, //дескриптор окна

__in const RECT *lpRect, //указатель на RECT структуру

__in BOOL bErase //указывает будет ли фон внутри области

);

Аналогичным образом задаются структуры. Так, структуре:

typedef struct tagMSG { // msghwnd;message;wParam;lParam;time;pt;

} MSG;

Соответствует код:STRUCDD ?DD ?DD ?DD ?DD ?DD ?

MSGSTRUCT ENDS

typedef struct tagWNDCLASS {style;lpfnWndProc;cbClsExtra;cbWndExtra;hInstance;hIcon;hCursor;hbrBackground;lpszMenuName;lpszClassName;

} WNDCLASS, *PWNDCLASS;

Соответствует код:STRUCDD ?DD ?DD ?DD ?DD ?DD ?DD ?DD ?DD ?DD ?ENDSstruct tagPAINTSTRUCT { // pshdc;fErase;rcPaint;fRestore;fIncUpdate;rgbReserved[32];

} PAINTSTRUCT;

Соответствует код:STRUCDWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DB 32 dup(0) ENDS

5. Демонстрационная программа

5.1 Листинг:

Файл edit.inc:

; константы_SETFOCUS equ 7h

; сообщение приходит при закрытии окна_DESTROY equ 2

; сообщение приходит при содании окна_CREATE equ 1

; сообщение, если что-то происходит с элементами на окне_COMMAND equ 111h

; сообщение, позволяющее послать элементу строку

WM_SETTEXT equ 0Ch_PAINT equ 0FH

; сообщение, позволяющее получить строку_GETTEXT equ 0Dh

; компоненты цветовequ 49equ 106equ 197equ 195 shl 13equ 0 ; черный

; свойства окна

CS_VREDRAW equ 1h

CS_HREDRAW equ 2h_GLOBALCLASS equ 4000h_OVERLAPPEDWINDOW equ 000CF0000Hequ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

; CS_HREDRAW equ 2h_DEFPUSHBUTTON equ 1h_VISIBLE equ 10000000h_CHILD equ 40000000h_BORDER equ 800000h_TABSTOP equ 00010000hequ WS_CHILD + BS_DEFPUSHBUTTON + WS_VISIBLE + WS_TABSTOPequ WS_CHILD + WS_VISIBLE + WS_BORDER + WS_TABSTOP

; идентификатор стандартной иконки_APPLICATION equ 32512

; идентификатор курсора_ARROW equ 32512 ;

; режим показа окна - нормальный_SHOWNORMAL equ 1

; прототипы внешних процедур

EXTERN SetFocus@4:NEAR

EXTERN SendMessageA@16:NEARMessageBoxA@16:NEARCreateWindowExA@48:NEARDefWindowProcA@16:NEARDispatchMessageA@4:NEARExitProcess@4:NEARGetMessageA@16:NEARGetModuleHandleA@4:NEARLoadCursorA@8:NEARLoadIconA@8:NEARPostQuitMessage@4:NEARRegisterClassA@4:NEARShowWindow@8:NEARTranslateMessage@4:NEARUpdateWindow@4:NEARBeginPaint@8:NEAREndPaint@8:NEARTextOutA@20:NEARGetStockObject@4:NEARCreateSolidBrush@4:NEARSetBkColor@8:NEARSetTextColor@8:NEAR InvalidateRect@12:NEAR

; структуры

; структура сообщения

MSGSTRUCT STRUCDD ?DD ?DD ?DD ?DD ? DD ?

MSGSTRUCT ENDS

;----структура класса окон

WNDCLASS STRUCDD ?DD ?DD ?DD ?DD ?DD ?DD ?DD ?DD ?DD ?ENDSSTRUCDWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DB 32 dup(0)ENDS

Файл edit.asm:

.386P

; плоская модель

.MODEL FLAT, stdcall qq.inc

; подключение библиотек

includelib user32.lib ;Модуль для поддержки пользовательского интерфейса

includelib kernel32.lib ;Модуль для работы с ядром ОС

includelib gdi32.lib ;Модуль для поддержки графического интерфейса

;------------------------------------------------------------

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'DD 0 ;хэндлер окнаMSGSTRUCT <?>WNDCLASS <?>PAINTSTR <?>DD 0 ; дескриптор приложенияDB 'Macro Assembler',0DB 'CLASS32',0 DB 'Копировать',0

CPBUT1 DB 'Повторить 20 раз с помощью REPT',0DB ' ',0DB 'BUTTON',0DB 'EDIT',0DB 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 10DWORD 90DB 'Введите текст',0 50 DUP(0) ; продолжение буфера

TEXTM DB 'Строка выведена 10 раз с помощью макрокоманды REPT',0

DB 50 DUP(0) ; продолжение буфера

_DATA ENDS


; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE':

; получить дескриптор приложения

PUSH 0

CALL GetModuleHandleA@4 ; Возвращает дескриптор модуля, содержащего тип, представленный данным экземпляром

MOV [HINST], EAX

REG_CLASS: ;регистрация класса окна

; заполнить структуру окна

; стиль

MOV [WC.CLSSTYLE], STYLE

; процедура обработки сообщений

MOV [WC.CLWNDPROC], OFFSET WNDPROC

MOV [WC.CLSCBCLSEX],0

MOV [WC.CLSCBWNDEX],0

MOV EAX, [HINST][WC.CLSHINST], EAX

;-------- иконка окнаIDI_APPLICATION0LoadIconA@8 ;загружаем иконку[WC.CLSHICON], EAX

;---------- курсор окнаIDC_ARROW0LoadCursorA@8 ;загружаем курсор[WC.CLSHCURSOR], EAX

;---------[WC.CLBKGROUND], 28 ; цвет окнаDWORD PTR [WC.CLMENNAME], 0DWORD PTR [WC.CLNAME], OFFSET CLASSNAME OFFSET WC

CALL RegisterClassA@4 ;Регистрирует класс, определенный конструктором, с дополнительным базовым типом и типом интерфейса

; создать окно зарегистрированного класса

PUSH 0

PUSH [HINST]00600 ; DY - высота окна 1200 ; DX - ширина окна

PUSH 100 ; Y - координата левого верхнего угла

PUSH 100 ; X - координата левого верхнего угла

PUSH WS_OVERLAPPEDWINDOWOFFSET TITLENAME ; имя окнаOFFSET CLASSNAME ; имя класса0 CreateWindowExA@48

; проверка на ошибку

CMP EAX, 0

JZ _ERR

MOV [NEWHWND], EAX ; дескриптор окна

PUSH SW_SHOWNORMAL[NEWHWND] ShowWindow@8 ; показать созданное окно

;------------------------------------------------------------

PUSH [NEWHWND]

CALL UpdateWindow@4 ; команда перерисовать видимую

; часть окна, сообщение WM_PAINT

; цикл обработки сообщений

MSG_LOOP:000 OFFSET MSG

CALL GetMessageA@16 ;получаем сообщение из очереди

CMP EAX, 0 ;если в очередь пришел ноль, значит выходим из программы

JE END_LOOPOFFSET MSGTranslateMessage@4OFFSET MSGDispatchMessageA@4MSG_LOOP_LOOP:

; выход из программы (закрыть процесс)

PUSH [MSG.MSWPARAM]ExitProcess@4

_ERR:

JMP END_LOOP

;----------- функция определения длины строки ------------------------

; длина строки

; [EBP+08H] - указатель на строку

LENSTR PROCEBPEBP, ESPESIESI, DWORD PTR [EBP+8]EBX, EBX:BYTE PTR [ESI], 0LBL2EBXESILBL1:ESIEBP 4

LENSTR ENDP

; процедура окна

; расположение параметров в стеке

; [EBP+014Н] ; LPARAM

; [EBP+10H] ; WAPARAM

; [EBP+0CH] ; MES

; [EBP+8] ; HWNDPROCEBPEBP,ESP

; PUSH EBX

; PUSH ESI

; PUSH EDIREG, <EBX,ESI,EDI> ; макроповторение IRPREGDWORD PTR [EBP+0CH] ,WM_DESTROYWMDESTROYDWORD PTR [EBP+0CH] ,WM_CREATEWMCREATEDWORD PTR [EBP+0CH] ,WM_PAINTWMPAINTDWORD PTR [EBP+0CH] ,WM_COMMANDWMCOMMNDDEFWNDPROC:EAX,HWNDBTNDWORD PTR [EBP+14H],EAX ; определяем нажата ли кнопка «Событие 1» BUTT1

; получить отредактированную строку

PUSH OFFSET TEXT

PUSH 150WM_GETTEXTHWNDEDT SendMessageA@16 ; показать эту строку

; записать отредактированную строку текстовое поле HWNDEDT1

PUSH OFFSET TEXT0WM_SETTEXTHWNDEDT1SendMessageA@16NODESTROY:EAX,HWNDBTN1DWORD PTR [EBP+14H],EAX ; определяем нажата ли кнопка «Событие 2»NODESTROY[NEWHWND]0 0

CALL InvalidateRect@12 ; принудительная перерисовка окна

.IF TMP==0 ; изменение условий перерисовки окна

MOV TMP,1

.ELSETMP,0

.ENDIFNODESTROY:EAX, 0FINISH:OFFSET PNTDWORD PTR [EBP+08H] BeginPaint@8

PUSH EAX ; сохранить контекст (дескриптор)

;---------------- цвет фона = цвет окна

PUSH RGBW

PUSH EAXSetBkColor@8

;---------------- контекстEAX EAX

;---------------- цвет текста

PUSH RGBT

PUSH EAXSetTextColor@8EAX

.IF TMP==1 ; проверка условия прорисовки текста по событию 2

REPT 20 ; макроповторение REPT

PUSH EAX

;---------------- вывести текст

PUSH OFFSET TEXT

CALL LENSTR; вызов процедуры определения длины сообщения

PUSH EBX ; длина строки

PUSH OFFSET TEXT ; адрес строки

ADD YT,20YT ; YXT ; XEAX ; контекст окнаTextOutA@20EAX

.ENDIFYT,90OFFSET PNTDWORD PTR [EBP+08H]EndPaint@8EAX, 0FINISH:

; создать окно-кнопку "Событие1"

PUSH 0[HINST]0DWORD PTR [EBP+08H]20 ; DY300 ; DX10 ; Y10 ; XSTYLBTNOFFSET CPBUT ; имя окнаOFFSET CLSBUTN ; имя класса0 CreateWindowExA@48

MOV HWNDBTN,EAX ; запомнить дескриптор кнопки

; создать окно-кнопку "Событие2"

PUSH 0

PUSH [HINST]0DWORD PTR [EBP+08H]20 ; DY300 ; DX85 ; Y10 ; XSTYLBTNOFFSET CPBUT1 ; имя окнаOFFSET CLSBUTN ; имя класса0 CreateWindowExA@48

MOV HWNDBTN1,EAX ; запомнить дескриптор кнопки

; создать окно редактирования1

PUSH 0

PUSH [HINST]

PUSH 0DWORD PTR [EBP+08H]20 ; DY300 ; DX40 ; Y10 ; XSTYLEDTOFFSET CPEDT ; имя окнаOFFSET CLSEDIT ; имя класса0 CreateWindowExA@48

MOV HWNDEDT,EAX

; создать окно редактирования 2

PUSH 0[HINST]0DWORD PTR [EBP+08H]20 ; DY300 ; DX60 ; Y10 ; XSTYLEDTOFFSET CPEDT ; имя окнаOFFSET CLSEDIT ; имя класса0 CreateWindowExA@48

MOV HWNDEDT1,EAX

;--------- поместить строку в окно редактирования

PUSH OFFSET TEXT0WM_SETTEXT HWNDEDT

CALL SendMessageA@16

;--------- установить фокус на окне редактирования

PUSH HWNDEDTSetFocus@4

;------------------------------------------------------------EAX, 0FINISH:DWORD PTR [EBP+14H]DWORD PTR [EBP+10H]DWORD PTR [EBP+0CH]DWORD PTR [EBP+08H] DefWindowProcA@16 ; вызывается оконной процедурой по умолчанию,

;чтобы обеспечить обработку по умолчанию любого сообщения окна,

;которые приложение не обрабатывает

JMP FINISH

WMDESTROY:0PostQuitMessage@4 ; сообщение WM_QUITEAX, 0:EDIESIEBXEBP16ENDP

_TEXT ENDSSTART


5.2 Результат работы программы



6. Вывод


В ходе выполнения курсовой работы самостоятельно были изучены основы программирования на 32-битном ассемблере. Изучены макросредства. Составлена программа на языке ассемблера для 32 разрядных микропроцессоров семейства Intel, демонстрирующая применение макросредств в ассемблере.


1.Содержание 1. Содержание . Введение . Описание использованного набора макросредств. . Использованные API-функции и системные константы. .1

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ