Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Высокоуровневый интерфейс языка масм
Макаренко Алексей
ЛАБОРАТОРНАЯ РАБОТА №3 ВЫСОКОУРОВНЕВЫЙ ИНТЕРФЕЙС ЯЗЫКА МАСМ
3.1 Цель работы
Изучить основы макроязыка интерфейса макроассемблера, источники справочной информации и примеров. Экспериментально проверить, как на уровне мнемонических машинных команд компилятор представляет высокоуровневый оператор вложенной проверки условия.
3.2 Выполнение работы Открыл файл \MACRO32\macros\macros.asm и нашел в нем макрос argcount. argcount MACRO args:VARARG LOCAL cnt cnt = 0 FOR item, <args> cnt = cnt + 1 ENDM EXITM %cnt ;; return as a number ENDM Скопировал из папки \MASM32\examples\exampl01\generic\ файлы generic.asm и generic.exe в свою рабочую папку. Запустил generic.exe и увидел окно, в котором есть меню. 00401129 FF350C304000 push dword ptr [40300Ch] 0040112F E884010000 call fn_004012B8 .if wParam == 1000 invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
3.3 Контрольные вопросы ;######################################################################### ; ; GENERIC.ASM является дорожной картой вокруг стандартной 32-битной ; Приложение Windows скелет написанный на MASM32. ; ; #########################################################################
; Assembler конкретные инструкции для 32-битной ASM код
.386 ; Минимальный процессор необходимых для 32-битных .model flat, stdcall ; Плоская модель памяти и вызова STDCALL option casemap :none ; установить код чувствителен к регистру
; #########################################################################
; --------------------------------------------- ; Основной файл включить в приравнивает и сооружений ; --------------------------------------------- включать \ masm32 \ Include \ windows.inc
; ------------------------------------------------------------- ; В MASM32, каждый из которых включает файл, созданный утилитой L2INC.EXE ; имеет соответствующий файл библиотеки. Если вам нужны функции из ; конкретной библиотеки, вы используете и включаемый файл и библиотеки ; файл для этой библиотеки. ; -------------------------------------------------------------
include \masm32\include\user32.inc include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib
; #########################################################################
; ------------------------------------------------------------------------ ; Макросы метод разложения текста на время сборки. Это позволяет ; Программист опрятный и удобный способ использования общих блоков кода с ; способность использовать различные параметры в каждом блоке. ; ------------------------------------------------------------------------
; 1. szText ; Макрос для вставки текста в разделе кода для удобного и ; более интуитивно кодирования функций, которые используют байт данных в виде текста.
szText MACRO Name, Text:VARARG LOCAL lbl jmp lbl Name db Text,0 lbl: ENDM
; 2. m2m ; Существует не мнемоническое скопировать из одной ячейки памяти в другую, ; этот макрос сохраняет повторяющиеся кодирования этого процесса и легче ; read in complex code.
m2m MACRO M1, M2 push M2 pop M1 ENDM
; 3. return ; Каждая процедура должна быть "в отставке", чтобы вернуться инструкция ; Указатель EIP на следующей инструкции после вызова, ; разветвленный к нему. Этот макрос помещает возвращаемое значение в EAX и ; делает "РЭТ" Инструкция по одной линии. Он в основном используется ; четкого кодирования в сложных условных ветвлений в больших ; кодов, таких как процедуры WndProc.
return MACRO arg mov eax, arg ret ENDM
; #########################################################################
; ---------------------------------------------------------------------- ; Прототипы используются в сочетании с MASM "ссылаться" Синтаксис ; проверка количества и размера параметров, передаваемых в процедуру. это ; повышает надежность кода, написанного где ошибки в ; Параметры поймали и отображаются на время сборки. ; ----------------------------------------------------------------------
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD TopXY PROTO :DWORD,:DWORD
; #########################################################################
; ------------------------------------------------------------------------ ; Это инициализация раздела данных означает, что данные, объявленные здесь имеет ; начальное значение. Вы также можете использовать UNINIALISED раздел, если вам нужно ; Данные этого типа [. данных? ]. Обратите внимание, что они разные и находятся в ; различных секций. ; ------------------------------------------------------------------------
.data szDisplayName db "Generic",0 CommandLine dd 0 hWnd dd 0 hInstance dd 0
; #########################################################################
; ------------------------------------------------------------------------ ; Это начало с екции кода, где находится исполняемый код начинается. это ; раздел заканчивая ExitProcess () вызов функции API является единственным ; GLOBAL части кода и предоставляет доступ к функции WinMain ; с необходимыми параметрами, например ручки и командной строки ; адрес. ; ------------------------------------------------------------------------
.code
; ----------------------------------------------------------------------- ; Ярлык "старт:" это адрес начала секции кода и ; она имеет соответствующий "конец начала" в конце файла. Все процедуры в ; Этот модуль должен быть написан между этими двумя.; -----------------------------------------------------------------------
start: invoke GetModuleHandle, NULL ; предоставляет хэндл mov hInstance, eax
invoke GetCommandLine ; предоставляет адрес командной строки mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax ; очистку и возвращение в операционной системе
; #########################################################################
WinMain proc hInst :DWORD, hPrevInst :DWORD, CmdLine :DWORD, CmdShow :DWORD
;==================== ; Положить местных жителей на стек ;====================
LOCAL wc :WNDCLASSEX LOCAL msg :MSG
LOCAL Wwd :DWORD LOCAL Wht :DWORD LOCAL Wtx :DWORD LOCAL Wty :DWORD
szText szClassName,"Generic_Class"
;================================================== ; Заполните WNDCLASSEX структуры с необходимыми переменными ;==================================================
mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW \ or CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, offset WndProc ; Адрес WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInst ; например ручкой mov wc.hbrBackground, COLOR_BTNFACE+1 ; система цвет mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset szClassName ; имя класса окна invoke LoadIcon,hInst,500 ; Значок ID; ресурса значок mov wc.hIcon, eax invoke LoadCursor,NULL,IDC_ARROW ; система курсор mov wc.hCursor, eax mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc ; зарегистрировать класс окна
;================================ ; Центр окна на следующий размер ;================================
mov Wwd, 500 mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN ; получить ширину экрана в пикселях invoke TopXY,Wwd,eax mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN ; получить высоту экрана в пикселях invoke TopXY,Wht,eax mov Wty, eax
; ================================== ; Создание главного окна программы ; ================================== invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPEDWINDOW, Wtx,Wty,Wwd,Wht, NULL,NULL, hInst,NULL
mov hWnd,eax ; скопируйте возвращаемого значения в DWORD ручкой
invoke LoadMenu,hInst,600 ; загрузить ресурс меню invoke SetMenu,hWnd,eax ; установите его в главное окно
invoke ShowWindow,hWnd,SW_SHOWNORMAL ; отображения окна invoke UpdateWindow,hWnd ; обновления экрана
;=================================== ; Loop, пока PostQuitMessage передается ;===================================
StartLoop: invoke GetMessage,ADDR msg,NULL,0,0 ; получить каждое сообщение cmp eax, 0 ; выйти, если GetMessage () je ExitLoop ; возвращает ноль invoke TranslateMessage, ADDR msg ; перевести его invoke DispatchMessage, ADDR msg ; отправить его в сообщении процесс jmp StartLoop ExitLoop:
return msg.wParam
WinMain endp
; #########################################################################
WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD
; ------------------------------------------------------------------------- ; Сообщение направляются операционной системы приложения с помощью ; WndProc проц. Каждое сообщение может иметь дополнительные значения, связанные с ним ; В двух параметров, WPARAM и LPARAM.Спектр дополнительных данных, которые ; могут быть переданы применения определяется сообщении. ; -------------------------------------------------------------------------
.if uMsg == WM_COMMAND ;---------------------------------------------------------------------- ; Сообщение WM_COMMAND отправляется по меню, кнопки и кнопки панели инструментов. ; Обработка WPARAM параметра это способ получения ; Идентификатор элемента управления, так что код для каждой операции может быть ; обработаны. Обратите внимание, что идентификатор находится в LOWORD из WPARAM ; переданные с сообщением WM_COMMAND. Там могут быть некоторые случаи, когда ; Приложение должно отделить высокие и низкие слова WPARAM. ; ---------------------------------------------------------------------
;======== menu commands ========
.if wParam == 1000 invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL .elseif wParam == 1900 szText TheMsg,"Assembler, Pure & Simple" invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK .endif
;====== end menu commands ======
.elseif uMsg == WM_CREATE ; -------------------------------------------------------------------- ; Это сообщение посылается в WndProc в функции CreateWindowEx ; звоните и обрабатывается до его возвращения. Это используется в качестве позиции ; для запуска других элементов, таких как элементы управления. ВАЖНО, ручка для ; CreateWindowEx вызов в WinMain еще не существует, поэтому HANDLE ; передается в WndProc [hWin] должны быть использованы здесь для любого контроля ; или дочерних окон. ; --------------------------------------------------------------------
.elseif uMsg == WM_CLOSE ; ------------------------------------------------------------------- ; Это место, где различные требования выполняются перед ; выход из приложения к операционной системе, такие как удаление ; ресурсов и тестирование, если файлы были сохранены. У вас есть возможность ; возвращения нулю, если вы не хотите, чтобы закрыть приложение которое ; выход из процедуры WndProc без прохождения этого сообщения ; Обработка по умолчанию окно сделано операционной системы. ; ------------------------------------------------------------------- szText TheText,"Please Confirm Exit" invoke MessageBox,hWin,ADDR TheText,ADDR szDisplayName,MB_YESNO .if eax == IDNO return 0 .endif
.elseif uMsg == WM_DESTROY ; ---------------------------------------------------------------- ; Это сообщение должно быть обработано в чисто выйти из приложения. ; Вызов PostQuitMessage () делает GetMessage () ; функции в WinMain () основного ноль цикл, который выходит ; Приложение правильно. Если это сообщение не обрабатывается должным образом ; окно исчезает, но код остается в памяти. ; ---------------------------------------------------------------- invoke PostQuitMessage,NULL return 0 .endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam ; -------------------------------------------------------------------- ; Обработка по умолчанию окна осуществляется операционной системой для любого ; сообщения, не обработанные заявки в WndProc ; процедуры. Если приложение требует, кроме обработки по умолчанию ; он выполняет код, когда сообщение в ловушку и возвращает ноль ; Для выхода из процедуры WndProc до обработки окна по умолчанию ; происходит с призывом DefWindowProc (). ; --------------------------------------------------------------------
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
; ---------------------------------------------------- ; Эта процедура вычисляет верхнюю X и Y координаты ; для вызова CreateWindowEx в процедуре WinMain ; ----------------------------------------------------
shr sDim, 1 ; разделить экран на 2 размерности shr wDim, 1 ; разделить окно измерений на 2 mov eax, wDim ; Копия окна измерения в EAX sub sDim, eax ; под размер выиграть половину от половины размеров для экрана return sDim
TopXY endp
; ########################################################################
end start
|
||
|
Последнее изменение этой страницы: 2024-06-27; просмотров: 49; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.198 (0.01 с.) |