Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Пример программы - окно с полем ввода и кнопкой

Вопрос:
Окно - в окне поле ввода и кнопка. В поле ввода вводим число (вариант - стринг). Нажимаем кнопку. Данные из окна ввода попадают в регистр (вариант - получаем адрес памяти где хранятся наши данные) Помогите с примером! Желательно на FASM.

Ответ:
format PE GUI 4.0
entry start

include 'win32a.inc'

IDC_EDIT = 100
IDC_BUTTON = 101

section '.data' data readable writeable

  _class       db 'GetNumberClass',0
  _title       db 'Ввод числа',0
  _edit        db 'edit',0
  _button      db 'button',0
  _button_tit  db 'Нажми меня',0
  _error       db 'Ошибка создания окна',0
  _error_num   db 'Сначала введите число до 8 знаков',0

  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class

section '.data?' data readable writeable

  msg           MSG
  hEdit         dd    ?
  flag          dd    ?
  iVar          dd    ?
  buf           rd    16

section '.code' code readable executable

  start:
        invoke  GetModuleHandle,0
        mov     [wc.hInstance],eax
        invoke  LoadIcon,0,IDI_APPLICATION
        mov     [wc.hIcon],eax
        invoke  LoadCursor,0,IDC_ARROW
        mov     [wc.hCursor],eax
        invoke  RegisterClass,wc
        test    eax,eax
        jz      error

        invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
        test    eax,eax
        jz      error

  msg_loop:
        invoke  GetMessage,msg,NULL,0,0
        cmp     eax,1
        jb      end_loop
        jne     msg_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop

  error:
        invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

  end_loop:
        invoke  ExitProcess,[msg.wParam]

proc WindowProc hwnd,wmsg,wparam,lparam
        push    ebx esi edi
        cmp     [wmsg],WM_CREATE
        je      .wmcreate
        cmp     [wmsg],WM_COMMAND
        je      .wmcommand
        cmp     [wmsg],WM_DESTROY
        je      .wmdestroy
  .defwndproc:
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
        jmp     .ret
  .wmcreate:
;создадим редактор (стиль ES_NUMBER - ждем число)
        invoke  CreateWindowEx,WS_EX_CLIENTEDGE,_edit,0,WS_VISIBLE+WS_CHILDWINDOW+ES_NUMBER+ES_AUTOHSCROLL+ES_NOHIDESEL,10,10,100,20,[hwnd],IDC_EDIT,[wc.hInstance],NULL
        mov     [hEdit],eax
;дадим ему фокус ввода
        invoke  SetFocus,eax
;ограничимсячислом с 8 знаками
        invoke  SendMessage,[hEdit],EM_SETLIMITTEXT,8,0
;создадим кнопку
        invoke  CreateWindowEx,0,_button,_button_tit,WS_VISIBLE+WS_CHILDWINDOW+BS_DEFPUSHBUTTON,10,40,100,20,[hwnd],IDC_BUTTON,[wc.hInstance],NULL
        jmp     .finish
  .wmcommand:
        mov     eax,[wparam]
;нажата кнопка?
        cmp     ax,IDC_BUTTON
        jne     .finish
;получим в EAX число из редактора (flag - флаг корректности, последний параметр 1-знаковое число)
        invoke  GetDlgItemInt,[hwnd],IDC_EDIT,flag,1
        cmp     [flag],1
        je      .numok
;нет числа
        invoke  MessageBox,[hwnd],_error_num,_title,MB_ICONINFORMATION+MB_OK
;дадим фокус редактору
        invoke  SetFocus,[hEdit]
        jmp     .finish
  .numok:
;сохраним в переменной
        mov     [iVar],eax
;получим еще раз, но сейчас как строку
        invoke  GetDlgItemText,[hwnd],IDC_EDIT,buf,16
;выведем
        invoke  MessageBox,[hwnd],buf,_title,MB_OK
;и завершимся
  .wmdestroy:
        invoke  PostQuitMessage,0
  .finish:
        xor     eax,eax
  .ret:
        pop     edi esi ebx
        ret
endp

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL'

  include 'api\kernel32.inc'
  include 'api\user32.inc'


   Вперёд
   Содержание