Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2009, 13:35   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию Примеры кода с пояснениями

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

Базовое приложение на FASM под Win32:
Код:
format PE GUI 4.0
entry MyEntry
;;## Файл Win32ax.inc отличается от Win32a тем что
;;## содержит кроме всего проче, макросы для высокоувроневых
;;## конструкций по типу if-else ,while итд. 
include 'C:\INCLUDE\Win32ax.inc'

;;## Минимальный exe-файл может состоять из 2 секций - секции кода 
;;## расположенной ниже и секции импорта расположенной сразу после 
;;## секции кода.
section '.code' code readable executable
MyEntry:
  ;;## Если код заканчивается не этой функцией то 
  ;;## закрытие приложение считается некорректным
  ;;## и программа вылетает с ошибкой, вместо мирного выхода. 
  
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Тут мог быть ваш код:) ;;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
	invoke ExitProcess,0 
section '.idata' import data readable writeable
  ;;## Импорт функций состоит из двух частей. 
  ;;## Импорт DLL-файлов и собественно сам импорт
  ;;## функций из них. FASM не нуждается в LIB файлах
  ;;## с функциями - он прекрасно вытаскивает их и из 
  ;;## обычных DLL. По этой же причине в комплекте
  ;;## нет линкера - он встроен в сам транслятор.
  
  library kernel32, 'KERNEL32.DLL',\
	  user32,   'USER32.DLL',\  
	  ntdll,    'NTDLL.DLL'
	;;## Слеш сигнализирует компилятору что это все еще одна строка.
	
	;;## В данном случае все таблицы импорта берутся из include файлов
	;;## но не для всех системных DLL есть include-файлы со списками импорта.
	;;## Имя импорт-ресурса(псевдоним DLL выше). И имя функции + псевдоним в ваше коде.
	;;## Можно хоть кулаком по клавиатуре назвать функцию в коде - главное правильно
	;;## написать имя импортируемой функции в DLL.
	import ntdll,\
	   stringprint,'sprintf',\
	   itoa,'_itoa',\
	   atoi,'atoi'
  ;;## Примечание - импортируются только те функции которые хоть раз использованы в коде
  ;;## не страшитесь длинных списков импорта - больше от этого ваши программы не станут.
  ;;## хотя хорошей шпаргалкой служит именно ручной импорт только нужных функции.
  ;;## Так вы можете сразу посмотреть что импортировали и чем придется оперировать.
  include 'C:\INCLUDE\APIA\Kernel32.inc'
  include 'C:\INCLUDE\APIA\User32.inc'

Базовое оконное приложение на FASM:

Код:
format PE GUI 4.0
entry MyEntry

include 'C:\INCLUDE\Win32ax.inc'

section '.data' data readable writeable
;;## В секции данных представлены 2 строки и 2 класса нужных для создания окна.
;;## szClsName обязательная строка - это имя класса окна, который мы зарегиструем. 
;;## поиск среди классов окон ведется именно по этому ключевому параметру.
szClsName db "TestWndClass",0
szWindowName db "Tutorial #1",0
;;## WNDCLASS это структура класса окна, в ней содержится самая разная информация.
;;## от иконки и курсора, до адреса процедуры обработки сообщений. 
wCls WNDCLASS
;;## Структура MSG это структура которая принимает сообщения и из нее же 
;;## берут нужные данные пре-обработчики этих сообщений. 
wMsg MSG
section '.code' code readable executable
MyEntry:
  ;;## Заполняем структуру WNDCLASS нужными данными.
  ;;## CS_VREDRAW и CS_HREDRAW это стили которые отвечают за
  ;;## перерисовку окна при измении высоты и ширины сответственно.
 	mov [wCls.style],CS_VREDRAW+CS_HREDRAW
 	;;## Указываем процедуру обработки окна. В данном случае в поле lpfnWndProc
 	;;## помещается адрес нашей процедуры обработки сообщений - WndProc.
	mov [wCls.lpfnWndProc],WndProc
	;;## Помещаем в структуру адрес на строку с именем нашего класса 
	mov [wCls.lpszClassName],szClsName
	;;## Указываем цвет фона окна. В данном случае это белый.
	mov [wCls.hbrBackground],COLOR_WINDOW+1
	;;## После занесения всех нужных данных можно регистрировать класс.
	invoke RegisterClass,wCls
	;;## Создаем само окно. Второй параметр это как раз адрес на строку
	;;## именем класса нашего окна. По этому параметру будет найден наш класс.
	;;##
	invoke CreateWindowEx,0,szClsName,szWindowName,\
	;;## WS_VISIBLE стиль - указывает на то что окно будет сразу видно. 
	;;## Если его не указать, окно можно будет показать функцией ShowWindow
	;;## вызвав ее единожды. Скрыть окно тоже можно - той же функцией но с другим
	;;## параметров - SW_HIDE а не SW_SHOW.
	;;## WS_SYSMENU указывает на то что бы к окну были добавлены кнопки, свернуть
	;;## максимизировать и закрыть.
	       WS_VISIBLE or WS_SYSMENU,\
	;;## Кордината Х кордината Y 
	;;## длина и ширина. А так же некоторые другие пока не нужные нам параметры.
	;;## о которых будет рассказано в следующем примере.
	       200,200,200,200,0,0,0,0
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 26.06.2009, 13:38   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Продолжение второго примера:
Код:
;;## После создания окна можно запускать цикл приема сообщений. 
	;;## Пока поступают сообщений, программа "живет" Если сообщений нет
	;;## программа закрывается.
	.message_loop:
	;;## Получаем следующее сообщение. Если есть переходим к обработки, если нет - выходим
		invoke GetMessage,wMsg,0,0,0
		cmp eax,0
		je .exit
		;;## Пред-Обработка сообщений и передача их функции обрабтчику.
		invoke TranslateMessage,wMsg
		invoke DispatchMessage,wMsg
		jmp .message_loop
	.exit:
	invoke ExitProcess,0
	
	
proc WndProc hWnd,uMsg,wParam,lParam
  ;;## Изменять эти регистры, регистры "нежелательно" потому перед
  ;;## обработкой они сохраняются, а после восстанавливаются.
	push edi esi ebx
	;;## для удобства поместим сообщение в EAX
	mov eax,[uMsg]
	;;## Ряд сравнений сообщения с обрабатываемыми.
	cmp eax,WM_CLOSE
	je  wmClose
	cmp eax,WM_CREATE
	je  wmCreate
	;;## если совпадений не найдено, передаем сообщений стандартной процедуре обработки
	;;## окна. Это кстати она рисует само окно, перерисовывает его когда нужно итд. 
	invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]	
	jmp pEnd
	
	wmCreate:
	;;## Обработчик сообщений WM_CREATE
		jmp pEnd
	wmClose:
	;;## Обработчик сообщения WM_CLOSE
	;;## Функция PostQuitMessage закрывает окно, вернее посылает стандартной процедуре
	;;## сообщение закрытия.
		invoke PostQuitMessage,0
	pEnd:
	;;## Как и говорилось выше регистры восстанавливаются после обработки.
	pop ebx esi edi
	ret
endp
section '.idata' import data readable writeable

  library kernel32, 'KERNEL32.DLL',\
	  user32,   'USER32.DLL'
  include 'C:\INCLUDE\APIA\Kernel32.inc'
  include 'C:\INCLUDE\APIA\User32.inc'
Тоже самое но уже с макросами - для наглядности:
Код:
format PE GUI 4.0
entry MyEntry

include 'C:\INCLUDE\Win32ax.inc'

section '.data' data readable writeable
szClsName db "TestWndClass",0
szWindowName db "Tutorial #1",0
wCls WNDCLASS
wMsg MSG
section '.code' code readable executable
MyEntry:
	mov [wCls.style],CS_VREDRAW+CS_HREDRAW
	mov [wCls.lpfnWndProc],WndProc
	mov [wCls.lpszClassName],szClsName
	mov [wCls.hbrBackground],COLOR_WINDOW+1
	invoke RegisterClass,wCls
	invoke CreateWindowEx,0,szClsName,szWindowName,WS_VISIBLE or WS_SYSMENU,\
	       200,200,200,200,0,0,0,0
	.while eax<>0
		invoke GetMessage,wMsg,0,0,0
		push eax
			invoke TranslateMessage,wMsg
			invoke DispatchMessage,wMsg
		pop  eax
	.endw
	invoke ExitProcess,0
proc WndProc hWnd,uMsg,wParam,lParam
	push edi esi ebx
	mov eax,[uMsg]
	.if eax=WM_CLOSE
		invoke PostQuitMessage,0
	.elseif eax=WM_CREATE
	.else	
		invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
	.endif
	pop ebx esi edi
	ret
endp
section '.idata' import data readable writeable

  library kernel32, 'KERNEL32.DLL',\
	  user32,   'USER32.DLL'
  include 'C:\INCLUDE\APIA\Kernel32.inc'
  include 'C:\INCLUDE\APIA\User32.inc'
Это шаблоны приложений. Но начинающим будет интересно увидеть и простые конструкции кода. Потому представлю и простейшие конструкции:
if(eax==10) ebx=1;
Код:
cmp eax,10
jne NO
mov ebx,1
NO:
;;##Суть конструкции проста. Если eax!=10 мы перепрыгнем к метке ;;##которая идет после команд которые должны выполнится если eax==10.
for(int i=100;i>0;i--)
{
szBuff[ i ]=0;
}

Код:
mov ecx,100
cycle:
mov byte[szBuff+ecx],0
loop cycle
;;## В ECX содержится счетчик который будет декрементироватся при ;;##каждой итерации цикла. Т.е. в данном случае 
;;##мы заполняем массив с конца.
;;##
PS: Хотел в одно сообщение но форум резонно возразил что 8000+ символов для одного сообщения это слишком много, надеюсь этот материал хоть кому то поможет.
PSS: Прошу закрепить тему.
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось Ivan_32; 26.06.2009 в 14:32.
Ivan_32 вне форума Ответить с цитированием
Старый 10.07.2009, 20:07   #3
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Продолжу тему ....
Вот пример создания простого окна сообщения(MessageBox) на MASM'е:
Код:
.386

.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption  db "Первая прога под Win_32",0
MsgBoxText     db "Hello world!!!",0

.code
start:

invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
invoke ExitProcess, NULL
end start
Вся программа заключается всего в одной строчке кода:
Код:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
1)invoke MessageBox-говорит компилятору что мы вызываем API-ф-ию MessageBox
2)NULL-это стиль нашего окошка( можно написать и 0, ничего не изменится)
3)addr MsgBoxText, addr MsgBoxCaption-это текст окна/заголовка
4)MB_OK-окно только с кнопкой Ok
5)invoke ExitProcess, NULL- это API-ф-ия выхода, после того когда мы нажмем на Ok

Теперь запишем наше окошко уже не с помощью API, а на языке Ассемблера:
Код:
.386

.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption  db "Первая прога под Win_32",0
MsgBoxText     db "Hello world!!!",0

.code
start:

  push   0                                     
  push   offset MsgBoxCaption     ; смещение строки заголовка
  push  offset MsgBoxText           ; смещение строки текста 
  push   0                                     ; стиль окна
  call   MessageBox         

  push   0                      ; нулевой(пустой) параметр для                 
  call   ExitProcess         ; ф-ии выхода из программы

end start
В следующий раз попробуем создать разными путями окошко под Винду
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 10.07.2009 в 22:03.
MalCer вне форума Ответить с цитированием
Старый 12.07.2009, 12:36   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Хочу, заметить один факт.
При передаче параметров в MessageBox
Код:
  push   0                                     
  push   offset MsgBoxCaption     ; смещение строки заголовка
  push   offset MsgBoxText           ; смещение строки текста 
  push   0
Параметры передаются с право налево. Т.е. (если функция выглядит так MessageBox (HWND Handle, LPCSTR lpText, LPCSTR lpCaption, UINT uType) сначала передается стиль кнопок, потом текст заголовка, потом текст и только потом хендл.
Код:
  push   0  ; Стиль кнопок (в данном случае MB_OK) (uType)
  push   offset MsgBoxCaption     ; смещение строки заголовка (lpCaption)
  push  offset MsgBoxText           ; смещение строки текста (lpText)
  push   0 ; Handle окна (Handle) 
И так во всех функциях на асме.
Удачи в изучении.
P.S. Где-то есть хороший справочник по асму. Как найду выложу
psycho-coder вне форума Ответить с цитированием
Старый 12.07.2009, 19:43   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
И так во всех функциях на асме.
нет, только у тех которые вызываются по соглашению stdcall
rpy3uH вне форума Ответить с цитированием
Старый 12.07.2009, 20:56   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
нет, только у тех которые вызываются по соглашению stdcall
Да, забыл
psycho-coder вне форума Ответить с цитированием
Старый 19.07.2009, 13:59   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Создание окна
Код:
.386
.model flat,stdcall ; определяем, что у нас сплошная("плоская") модель памяти,
;а stdcall говорит, что нужно уровнять стэк, после того как ф-ия будет прервана
option casemap:none; включае эту ф-ию, чтобы различать в каких регистрах написана ф-ия
;############################################
; подключили библиотеки
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
;#############################################
; Объявили главную процедуру, которая будет состоять из 4 параметров
     WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
; Инициализируем сегметнт данных
.data
ClassName db "SimpleWinClass",0              ; Имя нашего класса окна
NameWindow db "Мое первое окно на ассемблере!!!",0 ; Имя окна
.data? ; неинициализируемые данные
        hInstance HINSTANCE ?  ; хендл программы
        CommandLine LPSTR ?    ; обработка командной строки
; начало секции, где будет располагаться код
.code
  start:
   invoke GetModuleHandle, NULL ; берем хэндл нашей программы
   mov hInstance,eax ; сохраним значение eax в переменную хэндл

   invoke GetCommandLine  ; вызвать командную строку  
   mov CommandLine,eax    ; обрабатываем командную строку
; вызываем основную функцию(4 параметра)
   invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT; вызываем нашу 
; основную функцию
   invoke ExitProcess, eax ; выйти из программы
   
; Начнем основные действия с описания процедуры

WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
        LOCAL wc:WNDCLASSEX   ; создаем 3 локальные переменные в стэке
        LOCAL msg:MSG
        LOCAL hwnd:HWND     
; далее слует так: вызывается до точки член, а после его параметр 
        mov wc.cbSize, SIZEOF WNDCLASSEX   ; размер структуры
        mov wc.style, CS_HREDRAW or CS_VREDRAW ; стиль окна(у нас их 2)
        mov wc.lpfnWndProc, offset WndProc ; получим адрес процедуры окна, создаваемых из класса. 
        mov wc.cbClsExtra, NULL ; кол-во резервиремых байт
        mov wc.cbWndExtra, NULL 
        
        push hInstance   ; в стэк наш хэндл
        pop wc.hInstance ; извлекем из стэка переменную хэндл
        mov wc.hbrBackground, COLOR_WINDOW+1 ; цвет окна(белый)
        mov wc.lpszMenuName, NULL ; хэндл меню для окон, созданных из класса по умолчанию
        mov wc.lpszClassName, offset ClassName ; получаем имя класса окна
        invoke LoadIcon, NULL, IDI_APPLICATION ; вызываем API-функцию создания обычной(стандартной)
; иконки Windows
        mov wc.hIcon, eax ; хэндл иконки
        mov wc.hIconSm, eax ; хэндл для маленькой иконки
        invoke LoadCursor, NULL, IDC_ARROW ; вызываем API-функцию для создания курсора
        mov wc.hCursor, eax ; хэндл курсора
        invoke RegisterClassEx, addr wc ; регистрируем класс окна
        INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR NameWindow,\ ; вызываем API-функцию для создания окна(ф-ия имеет 12 параметров)
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInst,NULL           
       mov hwnd, eax  ; значение eax в нашу переменную(хэндл), т.к. eax будет использоваться в дальнейшем
       invoke ShowWindow, hwnd,SW_SHOWNORMAL ; вызываем API-функцию , которая устанавливает состояние показа определяемого окна
       invoke UpdateWindow, hwnd  ; вызываем API-функцию , которая модифицирует клиентскую область
       .WHILE TRUE ; используем цикл сообщений(чтобы обработать эти самые сообщения, иначе у нас не будет контакта с окном)
              invoke GetMessage, ADDR msg, NULL, 0, 0 ; вызываем API-ф-ию,которая последовательно проверяется, есть ли сообщения от Windows.
              .BREAK .IF (!eax)
              invoke TranslateMessage, ADDR msg ; API-ф-ия, которая обрабатывает ввод с клавиатуры и генерирует новое сообщение 
              invoke DispatchMessage, ADDR msg ; API-ф-ия, которая пересылает сообщение процедуре соответствующего окна
       .ENDW ; конец цикла
       mov eax, msg.wParam ; код выхода сохраняется в члене MSG структуры wParam
       ret ; выйдем из процедуры WinMain
WinMain endp ; конец процедуры

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ; процедура окна
     .if uMsg==WM_DESTROY ; посылаем сообщение функции, которая нужна чтобы уничтожить(закрыть) окно
           invoke PostQuitMessage, NULL ; это API функция , обрабатывающая сообщения, которыми ваша программа не нуждается
     .else ; иначе...
           invoke DefWindowProc, hWnd, uMsg, wParam, lParam ; вызываем DefWindowProc, которая 
;обеспечивает обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает
        ret ; пометим адрес возврата
      .endif ; конец условия
       xor eax, eax ; устанавливаем eax в 0
      ret ; адрес возврата из WndProc
WndProc endp ; окончателььно выходим из процедуры
end start; конец всей программы
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 20.07.2009, 17:19   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Раз пошли такие дела, то я тоже поддержу
В этой программке для масма создается окно, на котором находится поле edit, со стилем ES_PASSWORD(вместо букв на экране будут появлятся звездочки) и кнопка, нажав на которую можно увидеть, какой текст ввели. Кроме того в ней класс окна уже заполнен, а не заполняется по ходу программы.
Код:
.686				; Распознавать при компиляции команды процессора 686

.MODEL FLAT, STDCALL	; Модель памяти плоская
					; STDCALL - метод вызова через стек

OPTION CASEMAP:none	; Эта строка указывает компилятору что надо различать
					; заглавные и прописные буквы. ;)

;=====================================================================================================
; Включаем прототипы функций которые мы используем в нашей программе.
;=====================================================================================================
    INCLUDE		\masm32\include\windows.inc			; Структуры, константы ...    
    INCLUDE		\masm32\include\kernel32.inc   		; Системные функции приложения ...
    INCLUDE		\masm32\include\user32.inc			; Интерфейс ...
    INCLUDE		\masm32\macros\macros.asm			; Макросы ...
                 
    INCLUDELIB	\masm32\lib\kernel32.lib
    INCLUDELIB	\masm32\lib\user32.lib

.DATA ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

	szClassName 	db 	"MyClass", 0		; Имя класса нашего окна
	szAppName 	db 	"Програмулька", 0		; Заголовок нашего окна ( то что будет в заголовке и на панели задач )

;WNDCLASSEX ------------------------------------------------
    cbSize            	dd	12*4					; Размер структуры
    style             	dd	CS_HREDRAW or CS_VREDRAW 	; Стиль нашего окна
    lpfnWndProc       	dd	OFFSET WndProc			; Аддрес процедуры обработки событий
    cbClsExtra        	dd	0					; Эта хрень нам не нужна
    cbWndExtra        	dd	0					; и эта тоже
    hInstance         	dd	400000h 				; Аддрес нашей проги в памяти
    hIcon             	dd	0 					; Иконка окна по умолчанию ( большая )
    hCursor           	dd	65553					; Курсор окна по умолчанию ( здесь я указал ID обычной стрелки )
    hbrBackground    	dd	BLACK_PEN				; Фон нашего окна черный
    lpszMenuName      	dd	0					; Меню у нас отсутствует
    lpszClassName     	dd	OFFSET szClassName	 	; Указатель на имя нашего класса
    hIconSm           	dd	0 					; Иконка окна по умолчанию ( маленькая - отображается в заголовке )
    
.DATA? ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

	msg		MSG	<>		; Структура сообщения
	hwnd		HWND 	?  		; ID нашего окна
	hEdit		HWND	?		; ID edit'a
	buffer		db 512 DUP(?)		; сюда будет считываться строка
.CONST ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; эти константы используюстя, для идентификации элементов в нашей программме
	IDD_EDIT	EQU 200
	IDD_BUT		EQU	210
;-----------------------------------------------------------------------------------------------------------
.CODE
;===================================================================================================
; Производим глобальные настройки нашего окна.
;===================================================================================================
Start:  							; Точка входа в нашу программу
	Invoke	LoadCursor, NULL, IDC_ARROW
	mov		hCursor, eax
	
	invoke 	RegisterClassEx, addr cbSize          		; Регистрируем класс нашего окна
; создаем наше окошко
	invoke 	CreateWindowEx, NULL , ADDR szClassName ,ADDR szAppName,\; имя класса и имя окошка
 WS_SYSMENU ,CW_USEDEFAULT,CW_USEDEFAULT,200,200,\
; стиль окошка(здесь будет только кнопка-крестик), положение и размеры окна
    	NULL , NULL , hInstance , NULL       
	mov	 hwnd, eax    					

	invoke	ShowWindow, hwnd, SW_NORMAL		; Показываем окно на экране
	invoke	UpdateWindow, hwnd	 			; Обновляем его

msg_loop:
	invoke 	PeekMessage, ADDR msg, 0, 0, 0, PM_NOREMOVE
	test	eax, eax
	jne		message							; Пока у окна нет сообщений... 

	jmp		msg_loop 

message:    
	invoke  	GetMessage, ADDR msg, NULL, 0, 0	; получаем новое сообщение
	test		eax, eax				
	je        	end_loop

	invoke  	TranslateMessage, ADDR msg     												
	invoke  	DispatchMessage, ADDR msg      
	jmp     	msg_loop

end_loop:
	mov 	eax, msg.wParam              			; Если цикл обработки сообщений прерван, то код выхода из программы
    								; передается в поле wParam сообщения MSG. 
	invoke 	ExitProcess, eax
	ret
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 20.07.2009 в 17:24.
Goodwin98 вне форума Ответить с цитированием
Старый 20.07.2009, 17:23   #9
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Продолжение
Код:
;===================================================================================================
 WndProc proc hWnd:HWND , uMsg:UINT, wParam:WPARAM, lParam:LPARAM                                          
;=========================================================
    cmp     uMsg, WM_CREATE	 			; Это сообщение посылается окну, когда оно создается
    je      wmCreate
            
    cmp     uMsg, WM_DESTROY	   		; Это сообщение посылается окну, когда оно должно быть уничтожено.
    je      wmDestroy
    
    cmp		uMsg, WM_COMMAND			; Это сообщеие посылается окну, когда над ним происходят какие-то действия
	jne		@f
	mov		eax,wParam		; код события, в этом случае будет в wParam
	shr		eax,16
	cmp		eax,BN_CLICKED
	jne		@f
	cmp		wParam,IDD_BUT			; была нажата наша кнопка
	je		bnClicked
@@:	    
    			                 
    invoke  DefWindowProc, hWnd, uMsg, wParam, lParam  	; Если Мы НЕ ХОТИМ обрабатывать полученное сообщение, то
    ret                                                  			; нам надо вызвать DefWindowProc  с параметрами, которые Мы получили.
    								; Эта функция API обрабатывает не интересующие Нас события.  
;------------------------------------------------------------------------------------------------------------------------
  wmDestroy:
;------------    
    
    invoke  	PostQuitMessage, NULL     
    xor       	eax,eax                            
    ret                                         
;------------------------------------------------------------------------------------------------------------------------
  wmCreate:                                       
;-----------
	dsText szEdit,"EDIT"
	dsText szButton,"BUTTON"
	dsText TextButton,"GO"
	
; создаем кнопку ( это такое же окно, только у него стиль называется BUTTON)
	invoke	CreateWindowEx,WS_EX_CLIENTEDGE,addr szButton,addr TextButton,\
		WS_CHILD or WS_VISIBLE,70,120,60,30,hWnd,IDD_BUT,hInstance,0

; создаем поле Edit
	invoke	CreateWindowEx,WS_EX_CLIENTEDGE,addr szEdit,NULL,ES_PASSWORD or WS_CHILD or WS_VISIBLE,\ 
; обратите внимание на ES_PASSWORD
		50,50,100,20,hWnd,200,hInstance,0														
	mov hEdit, eax
	invoke	SetFocus, eax 				; Устанавливаем на него фокус

	ret
;------------------------------------------------------------------------------------------------------------------------
  bnClicked:
;-----------
	invoke GetWindowText,hEdit,addr buffer,512				; получаем содержимое edit'a
	invoke MessageBox,0,addr buffer,addr szAppName,MB_OK	; и выводим его
	
	ret
	
WndProc endp
end Start
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 20.07.2009 в 17:30.
Goodwin98 вне форума Ответить с цитированием
Старый 21.07.2009, 20:54   #10
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Продолжаем....
Это тоже окно, только слегка модифицированное(используем события):
Код:
.386P
; плоская модель
.MODEL FLAT, stdcall 
; константы
; сообщение приходит при закрытии окна 
WM_DESTROY        equ 2 
; сообщение приходит при создании окна 
WM_CREATE         equ 1
; сообщение при щелчке левой кнопкой мыши в области окна 
WM_LBUTTONDOWN    equ 201h
; сообщение при щелчке правой кнопкой мыши в области окна 
WM_RBUTTONDOWN    equ 204h 
; свойства окна 
CS_VREDRAW        equ 1h 
CS_HREDRAW        equ 2h 
CS_GLOBALCLASS    equ 4000h 
WS_OVERLAPPEDWINDOW    equ 000CF0000H 
style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
; идентификатор стандартной иконки 
IDI_APPLICATION   equ 32512 
; идентификатор курсора 
IDC_CROSS         equ 32515
; режим показа окна - нормальный 
SW_SHOWNORMAL     equ 1
; прототипы внешних процедур 
EXTERN   MessageBoxA@16: NEAR
EXTERN   CreateWindowExA@48:NEAR 
EXTERN   DefWindowProcA@16:NEAR 
EXTERN   DispatchMessageA@4:NEAR 
EXTERN   ExitProcess@4:NEAR
EXTERN   GetMessageA@16:NEAR 
EXTERN   GetModuleHandleA@4:NEAR 
EXTERN   LoadCursorA@8:NEAR 
EXTERN   LoadIconA@8:NEAR 
EXTERN   PostQuitMessage@4:NEAR 
EXTERN   RegisterClassA@4:NEAR 
EXTERN   ShowWindow@8:NEAR 
EXTERN   TranslateMessage@4:NEAR 
EXTERN   UpdateWindow@4:NEAR 
; директивы компоновщику для подключения библиотек 
includelib c:\masm32\lib\user32.lib 
includelib c:\masm32\lib\kernel32.lib
;--------------------------------------------------
; структуры 
; структура сообщения
MSGSTRUCT STRUC
     MSHWND        DD   ? ; идентификатор окна,
                          ; получающего сообщение
     MSMESSAGE     DD   ? ; идентификатор сообщения
     MSWPARAM      DD   ? ; доп. информация о сообщении
     MSLPARAM      DD   ? ; доп. информация о сообщении
     MSTIME        DD   ? ; время посылки сообщения
     MSPT          DD   ? ; положение курсора, во время посылки
                          ; сообщения
MSGSTRUCT ENDS
;---------
WNDCLASS STRUC
     CLSSTYLE      DD   ? ; стиль окна
     CLWNDPROC     DD   ? ; указатель на процедуру окна
     CLSCSEXTRA    DD   ? ; информация о доп. байтах для
                          ; данной структуры
     CLWNDEXTRA    DD   ? ; информация о доп. байтах для окна
     CLSHINSTANCE  DD   ? ; дескриптор приложения
     CLSHICON      DD   ? ; идентификатор иконы окна
     CLSHCURSOR    DD   ? ; идентификатор курсора окна
     CLBKGROUND    DD   ? ; идентификатор кисти окна
     CLMENUNAME    DD   ? ; имя-идентификатор меню
     CLNAME        DD   ? ; специфицирует имя класса окон
WNDCLASS ENDS

; сегмент данных
_DATA SEGMENT  DWORD PUBLIC USE32 'DATA'
     NEWHWND   DD 0
     MSG       MSGSTRUCT <?>
     WC        WNDCLASS  <?>
     HINST     DD 0 ; здесь хранится дескриптор приложения
     TITLENAME DB 'Простой пример 32-битного приложения',0
     CLASSNAME DB 'CLASS32',0
     CAP       DB 'Сообщение',0
     MES1      DB 'Вы нажали левую кнопку мыши',0
     MES2      DB 'Выход из программы. Пока!',0
_DATA ENDS

; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; получить дескриптор приложения
     PUSH     0
     CALL     GetModuleHandleA@4
     MOV      [HINST], EAX
REG_CLASS:
; заполнить структуру окна стиль
     MOV [WC.CLSSTYLE], style 
; процедура обработки сообщений
     MOV [WC.CLWNDPROC], OFFSET WNDPROC
     MOV [WC.CLSCSEXTRA ], 0
     MOV [WC.CLWNDEXTRA], 0
     MOV EAX, [HINST]
     MOV [WC.CLSHINSTANCE], EAX
;--------- иконка окна
     PUSH IDI_APPLICATION
     PUSH 0
     CALL LoadIconA@8
     MOV  [WC.CLSHICON], EAX
;---------- курсор окна
     PUSH IDC_CROSS
     PUSH 0
     CALL LoadCursorA@8
     MOV  [WC.CLSHCURSOR], EAX
;---------
     MOV  [WC.CLBKGROUND], 17 ; цвет окна
     MOV DWORD PTR [WC.CLMENUNAME], 0
     MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
     PUSH OFFSET WC
     CALL RegisterClassA@4
; создать окно зарегистрированного класса
     PUSH 0
     PUSH [HINST]
     PUSH 0
     PUSH 0
     PUSH 400 ; DY — высота окна
     PUSH 400 ; DX - ширина окна
     PUSH 100 ; Y — координата левого верхнего угла
     PUSH 100 ; X — координата левого верхнего угла
     PUSH WS_OVERLAPPEDWINDOW
     PUSH OFFSET TITLENAME ; имя окна
     PUSH OFFSET CLASSNAME ; имя класса
     PUSH 0
     CALL CreateWindowExA@48
; проверка на ошибку
     CMP EAX, 0
     JZ  _ERR
     MOV [NEWHWND], EAX ; дескриптор окна
; --------------------------------------------------
     PUSH SW_SHOWNORMAL
     PUSH [NEWHWND]
     CALL ShowWindow@8; показать созданное окно
; --------------------------------------------------
     PUSH [NEWHWND]
     CALL UpdateWindow@4  ; команда перерисовать видимую 
                          ; часть окна, сообщение WM_PAINT
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Примеры/Уроки демосцен с исходниками Ivan_32 Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 30.05.2009 13:06
Помогите отладить программу, плз!!! прога с пояснениями Gobl1n Паскаль, Turbo Pascal, PascalABC.NET 2 16.12.2008 20:09
Примеры использования и выбор лучшей DB BOBAH13 БД в Delphi 4 03.05.2008 22:32
Примеры излечения trial компонентов. Alar Общие вопросы Delphi 4 04.02.2008 14:30
Примеры для Visual C++ MFC RMih Visual C++ 2 29.01.2008 12:25