Witam!
Próbuje napisać prosty program w FASMie do liczenia pierwiastków trójmianu kwadratowego ze wzorów Viete'a w WinAPI. Aby to osiągnąć korzystam z 3 pól tekstowych, jednak mam małe problemy z funkcją GetDlgItemText. Zgodnie z jej opisem na msdn muszę zrobić bufor na tekst do którego zapisywane będą znaki. No więc w przypadku mojego kodu wygląda to mniej więcej tak:
invoke GetDlgItemText,[hwnddlg],ID_MESSAGE1,tekscik1,2
;i dalej zadeklarowana tablica
tekscik1 db 0,0
Zgodnie z opisem funkcja powinna zwracać wartość odpowiadającą ilości wczytanych do tablicy znaków, jednak gdy zrobię coś w stylu
cmp eax,2
je .processed
Nie działa (okno się wyłącza). Nie mogę również odwołać się do 2 elementu tablicy tekscik1 poprzez choćby:
mov al,[tekscik1+1]
Głównym celem jaki muszę zrealizować jest pobranie dwóch elementów z tablicy, ich zamiana z wartości ascii na wartość dziesiętną i dalej wykonanie odpowiednich operacji arytmetycznych i odpowiednie zaprezentowanie wyniku.
Wrzucam cały kod:
format PE GUI 4.0
entry start
include 'win32a.inc'
ID_CAPTION = 101
ID_MESSAGE1 = 102
ID_MESSAGE2 = 103
ID_MESSAGE3 = 104
ID_ICONERROR = 201
ID_ICONINFORMATION = 202
ID_ICONQUESTION = 203
ID_ICONWARNING = 204
ID_TOPMOST = 301
section '.text' code readable executable
start:
invoke GetModuleHandle,0
invoke DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0
or eax,eax
jz exit
invoke MessageBox,HWND_DESKTOP,message,caption,[flags]
exit:
invoke ExitProcess,0
proc DialogProc hwnddlg,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je .wminitdialog
cmp [msg],WM_COMMAND
je .wmcommand
cmp [msg],WM_CLOSE
je .wmclose
xor eax,eax
jmp .finish
.wminitdialog:
jmp .processed
.wmcommand:
cmp [wparam],BN_CLICKED shl 16 + IDCANCEL
je .wmclose
cmp [wparam],BN_CLICKED shl 16 + IDOK
jne .processed
xor eax,eax
invoke GetDlgItemText,[hwnddlg],ID_MESSAGE1,tekscik1,2
cmp eax,2
je .processed
.wmclose:
invoke EndDialog,[hwnddlg],0
.processed:
mov eax,1
.finish:
pop edi esi ebx
ret
endp
section '.bss' readable writeable
flags dd ?
caption rb 40h
message rb 100h
tekscik1 db 0,0
tekscik2 db 0,0
tekscik3 db 0,0
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'
import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'
import user,\
DialogBoxParam,'DialogBoxParamA',\
CheckRadioButton,'CheckRadioButton',\
GetDlgItemText,'GetDlgItemTextA',\
IsDlgButtonChecked,'IsDlgButtonChecked',\
MessageBox,'MessageBoxA',\
EndDialog,'EndDialog'
section '.rsrc' resource data readable
directory RT_DIALOG,dialogs
resource dialogs,\
37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration
dialog demonstration,'Wzory Viete''a',70,70,190,78,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
dialogitem 'STATIC','&Dany jest wielomian ax^2+bx+c. Podaj',-1,30,10,134,134,WS_VISIBLE
dialogitem 'STATIC','&Wspolczynnik a: ',-1,10,30,70,8,WS_VISIBLE
dialogitem 'EDIT','',ID_MESSAGE1,70,30,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
dialogitem 'STATIC','&Wspolczynnik b: ',-1,10,45,70,8,WS_VISIBLE
dialogitem 'EDIT','',ID_MESSAGE2,70,45,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
dialogitem 'STATIC','&Wspolczynnik c: ',-1,10,60,70,8,WS_VISIBLE
dialogitem 'EDIT','',ID_MESSAGE3,70,60,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
dialogitem 'BUTTON','OK',IDOK,130,30,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','C&ancel',IDCANCEL,130,50,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog