Высокоуровневый интерфейс языка масм 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Высокоуровневый интерфейс языка масм

 

                                                                                                                    Макаренко Алексей
                                                                                                                    КИ-111

 

ЛАБОРАТОРНАЯ РАБОТА №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 с.)