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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2010, 23:05   #1
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
Радость FASM. Цикл. Долго ломаю голову. Подскажите.

Доброго всем времени суток. Подскажите если не сложно. Вот код программы на ассемблере фасм, выводится окошко с полем ввода edit и четырьмя кнопками: "вывести"(отображает введенное нами число), "+1"(увеличивает введенное число на единицу), "-1"( вычитает из нашего числа единицу) и кнопка "закрыть". Все работает, все здорово, только хотелось бы, чтобы при нажатии на "+1" или "-1" сложение и вычитание единички было зациклено, а не однократно как в данном варианте. Сам долго ломал голову, пока не получилось. Если код корявый, не ругайтесь.

Вот код:

Код:
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
_classb db 'BUTTON',0
_button_tit db 'Вывести',0
_texta db ' + 1 ',0
_textb db ' - 1 ',0
_textc db 'Закрыть',0
_format db 'Вы ввели цифру : %d',0
_format2 db 'Вы прибавили 1 : %d',0
_format3 db 'Вы отняли 1 : %d',0
_error db 'Ошибка',0
_error_num db 'Введите число до 3 знаков',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 64
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
je error


invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,\
             128,128,270,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 uses ebx esi edi,hwnd,wmsg,wparam,lparam
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:
invoke CreateWindowEx,WS_EX_CLIENTEDGE,_edit,0,\
WS_VISIBLE+WS_CHILDWINDOW+ES_NUMBER+ES_AUTOHSCROLL+ES_NOHIDESEL,\
10,10,30,20,[hwnd],IDC_EDIT,[wc.hInstance],NULL
mov [hEdit],eax
;фокус ввода
invoke SetFocus,eax
;ограничимся 3 знаками
invoke SendMessage,[hEdit],EM_SETLIMITTEXT,3,0
invoke CreateWindowEx,0,_classb,_button_tit,WS_VISIBLE+WS_CHILDWINDOW+BS_PUSHBUTTON,\
175,45,80,20,[hwnd],IDC_BUTTON,[wc.hInstance],NULL
invoke CreateWindowEx,0,_classb,_texta,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,\
175,75,80,20,[hwnd],1001,[wc.hInstance],0
invoke CreateWindowEx,0,_classb,_textb,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,\
          175,105,80,20,[hwnd],1002,[wc.hInstance],0
invoke CreateWindowEx,0,_classb,_textc,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,\
          175,135,80,20,[hwnd],1003,[wc.hInstance],0
jmp .finish
.wmcommand:
cmp [wparam],1001
je .but1
cmp [wparam],1002
je .but2
cmp [wparam],1003
je .but3
.but3:
jz .wmdestroy
;нажата кнопка?
cmp [wparam],IDC_BUTTON
jne .finish
;получим в EAX число из редактора
invoke GetDlgItemInt,[hwnd],IDC_EDIT,flag,1
cmp [flag],1
je .numok3
;нет числа
.no_num:
stdcall PrintString,[hwnd],_error_num
;фокус редактору
invoke SetFocus,[hEdit]
jmp .finish
.numok3:
;сохраним в переменной
mov [iVar],eax
;преобразуем в строку вида '1234 + 1 = 1235' !!!
invoke wsprintf,_buf,_format,[iVar],eax
.err:
stdcall PrintString,[hwnd],_buf
invoke SetFocus,[hEdit]
jmp .finish

.but1:
invoke GetDlgItemInt,[hwnd],IDC_EDIT,flag,1
cmp [flag],1
je .numok1
jnz .no_num
.numok1:
inc eax
mov [iVar],eax
invoke wsprintf,_buf,_format2,[iVar],eax
jmp .err

.but2:
invoke GetDlgItemInt,[hwnd],IDC_EDIT,flag,1
cmp [flag],1
je .numok2
;нет числа
jnz .no_num
.numok2:
dec eax
mov [iVar],eax
invoke wsprintf,_buf,_format3,[iVar],eax
jmp .err

.wmdestroy:
invoke PostQuitMessage,0
.finish:
xor eax,eax
.ret:
ret
endp
proc PrintString uses esi,hwnd,string
local hDC:DWORD,Rct:RECT
;контекст окна
invoke GetDC,[hwnd]
mov [hDC], eax
;координаты участка, где будем писать 10,10,30,20
mov [Rct.top],10
mov [Rct.bottom],25
mov [Rct.left],55
mov [Rct.right],240
;сначала очистим фоном !!!
invoke GetSysColorBrush,COLOR_BTNFACE
lea esi,[Rct]
invoke FillRect,[hDC],esi,eax
;текст без изменения фона
invoke SetBkMode,[hDC],TRANSPARENT
;цвет текста
invoke SetTextColor,[hDC],00000000h   ; black
;выведем в прямоугольнике Rct, esi*dr Rct
invoke DrawText,[hDC],[string],-1,esi,DT_SINGLELINE or DT_VCENTER or DT_LEFT
invoke ReleaseDC,[hwnd],[hDC]
ret
endp
.wmdestroy:
invoke PostQuitMessage,0
mov eax,0
.finish:
pop edi esi ebx
ret
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
gdi32,'GDI32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\gdi32.inc'

Последний раз редактировалось rpy3uH; 01.02.2010 в 08:18.
Lamo вне форума Ответить с цитированием
Старый 31.01.2010, 00:43   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Лично я такую штуку по таймеру делал. Решение конечно отличается изяществом как корова на льду, но тем не менее работало.

В архивчике исходник, все нужные инки и exe. Правда всё на масме, но я думаю для вас это будет непринципиально. Просто мне не хочется сейчас под фасм всё переписывать. Ах да, ну и с комментариями не густо. Ибо для себя делал и как обычно торопился дюже.
Вложения
Тип файла: rar DualButton.rar (7.0 Кб, 17 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 31.01.2010, 11:55   #3
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
По умолчанию

Спасибо большое! Что-то похожее наклевывается, надо теперь разобраться как все работает. А таймером называются две кнопочки со стрелками вверх и вниз? Или они иначе называются?
Lamo вне форума Ответить с цитированием
Старый 31.01.2010, 22:43   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Не не не. Кнопки со стрелочками - это просто кнопки со стрелочками.
А под таймером я имел в виду таймер, который можно установить функцией:

Код:
	invoke	SetTimer,[hwnd],IDC_TIMER1,10,NULL
	mov	[hwndTimer1], eax
Затем ловите сообщение WM_TIMER (в нём wparam будет равен идентификатору таймера) и по этому сообщению проверяете статус кнопки.
Если кнопка нажата, то выполняете то что хотели (например инкремент/декремент).
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 01.02.2010, 00:53   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Крутилка готовая в винде есть, класс msctls_updown32
Код:
format PE GUI 4.0
entry start

include 'win32axp.inc'

  ID_EDIT  = 101
  ID_SPIN  = 102
  UDM_SETRANGE32 = 046Fh

section '.code' code readable executable

  start:
        invoke  InitCommonControls
        invoke  GetModuleHandle, 0
        invoke  DialogBoxParam, eax, 1, HWND_DESKTOP, DialogProc, 0
        invoke  ExitProcess,0

proc DialogProc hwnddlg,msg,wparam,lparam
local hSpin dd ?
        push    ebx esi edi
        cmp     [msg],WM_INITDIALOG
        je      .wminitdialog
        cmp     [msg],WM_CLOSE
        je      .wmclose
        xor     eax,eax
        jmp     .finish
  .wminitdialog:
        invoke  GetDlgItem, [hwnddlg], ID_SPIN
        invoke  SendMessage, eax, UDM_SETRANGE32, -100, 100
        jmp     .processed
  .wmclose:
        invoke  EndDialog,[hwnddlg],0
  .processed:
        mov     eax,1
  .finish:
        pop     edi esi ebx
        ret
endp

section '.idata' import data readable writeable

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

  include '/api/kernel32.inc'
  include '/api/user32.inc'
  include '/api/comctl32.inc'

section '.rsrc' resource data readable

  directory RT_DIALOG,dialogs

  resource dialogs,\
           1,LANG_RUSSIAN+SUBLANG_DEFAULT,TestDialog

  dialog TestDialog,'Test',70,70,70,50,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
     dialogitem 'edit', '', ID_EDIT, 15, 15, 38, 13, WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_RIGHT+WS_GROUP
     dialogitem 'msctls_updown32', '', ID_SPIN, 0, 0, 0, 0, WS_VISIBLE+UDS_SETBUDDYINT+UDS_ALIGNRIGHT+UDS_AUTOBUDDY
  enddialog
Вложения
Тип файла: rar msctls_updown32.rar (1.4 Кб, 21 просмотров)
пыщь
JTG вне форума Ответить с цитированием
Старый 01.02.2010, 21:54   #6
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
По умолчанию

Искреннее, большое спасибо Ulex и JTG! Теперь можно учить дальше))).

JTG, сейчас компилировал ваш исходник, почему-то выскакивает ошибка:
error: invalid macro arguments. И ссылка на кернел32.инк. Выделяет
первую строчку:
struct OSVERSIONINFO
dwOSVersionInfoSize dd ?
dwMajorVersion dd ?
dwMinorVersion dd ?
dwBuildNumber dd ?
dwPlatformId dd ?
szCSDVersion TCHAR 128 dup (?)
ends
Сам пользуюсь фасм 1.68. Как это исправить?

Последний раз редактировалось Stilet; 12.02.2010 в 13:17.
Lamo вне форума Ответить с цитированием
Старый 02.02.2010, 02:01   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Не знаю, обновился до 1.68 - всё работает
пыщь
JTG вне форума Ответить с цитированием
Старый 12.02.2010, 13:10   #8
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
По умолчанию

Прошу прощения, переставил фасм, все заработало. Код рабочий.
Lamo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите темы для сайтов, ничего в голову не лезет Gorychev Свободное общение 2 02.04.2008 12:32
Задача с матрицей. Ломаю голову уже неделю Damokl Помощь студентам 6 19.12.2007 03:20
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34
Подскажите как сделать цикл... Apollo_13 Общие вопросы Delphi 4 26.06.2007 22:01