PDA

View Full Version : مبتدی: چگونگی دریافت اطلاعات از صفحه کلید در محیط گرافیکی



maryam abs
جمعه 14 مرداد 1390, 16:31 عصر
سلام
راستش من تازه اسمبلی رو شروع کردم و اطلاعاتم بسیار کمه
میخوام یه برنامه ای بنویسم که اطلاعات تعدادی دانشجو مثلا نام دانشجو رو در محیط گرافیکی بگیره و در یک فایل ذخیره کنه-میخوام بدونم چه جوری میشه 2 محیط گرافیکی متن از صفحه کلید گرفت ؟؟
مثلtext box در #cکه متنو واردش میکنی یعنی مکان نما برای دریافت فعال باشه
اصلا همچین چیزی امکان داره؟؟؟؟؟؟؟؟؟؟
خواهش می کنم اگه چیزی میدونید راهنماییم کنید
ممنون میشم

IamOverlord
یک شنبه 16 مرداد 1390, 10:55 صبح
سلام دوست عزیز،
برای این کار باید از یه کامپایلر 32 بیتی مثل FASM استفاده کنی، البته برای برنامه نویس ویندوز MASM مرسوم تره.
این هم یه نمونه ی ساده از FASM برای یه برنامه ی تحت ویندوز که 2 تا TextBox داره و چند تا چیز دیگه و ورودی می گیره و بر اساس اون ورودی یه کاری می کنه (یه MessageBox نشون می ده):



; DialogBox example

format PE GUI 4.0
entry start

include 'win32a.inc'

ID_CAPTION = 101
ID_MESSAGE = 102
ID_ICONERROR = 201
ID_ICONINFORMATION = 202
ID_ICONQUESTION = 203
ID_ICONWARNING = 204
ID_TOPMOST = 301

section '.data' data readable writeable

flags dd ?
caption rb 40h
message rb 100h

section '.code' 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:
invoke CheckRadioButton,[hwnddlg],ID_ICONERROR,ID_ICONWARNING,ID_ICONINFORMATION
jmp processed
wmcommand:
cmp [wparam],BN_CLICKED shl 16 + IDCANCEL
je wmclose
cmp [wparam],BN_CLICKED shl 16 + IDOK
jne processed
invoke GetDlgItemText,[hwnddlg],ID_CAPTION,caption,40h
invoke GetDlgItemText,[hwnddlg],ID_MESSAGE,message,100h
mov [flags],MB_OK
invoke IsDlgButtonChecked,[hwnddlg],ID_ICONERROR
cmp eax,BST_CHECKED
jne iconerror_ok
or [flags],MB_ICONERROR
iconerror_ok:
invoke IsDlgButtonChecked,[hwnddlg],ID_ICONINFORMATION
cmp eax,BST_CHECKED
jne iconinformation_ok
or [flags],MB_ICONINFORMATION
iconinformation_ok:
invoke IsDlgButtonChecked,[hwnddlg],ID_ICONQUESTION
cmp eax,BST_CHECKED
jne iconquestion_ok
or [flags],MB_ICONQUESTION
iconquestion_ok:
invoke IsDlgButtonChecked,[hwnddlg],ID_ICONWARNING
cmp eax,BST_CHECKED
jne iconwarning_ok
or [flags],MB_ICONWARNING
iconwarning_ok:
invoke IsDlgButtonChecked,[hwnddlg],ID_TOPMOST
cmp eax,BST_CHECKED
jne topmost_ok
or [flags],MB_TOPMOST
topmost_ok:
invoke EndDialog,[hwnddlg],1
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 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,'Create message box',70,70,190,175,WS_CAPTION+WS_POPUP+WS_SYSMENU+ DS_MODALFRAME
dialogitem 'STATIC','&Caption:',-1,10,10,70,8,WS_VISIBLE
dialogitem 'EDIT','',ID_CAPTION,10,20,170,13,WS_VISIBLE+WS_BO RDER+WS_TABSTOP
dialogitem 'STATIC','&Message:',-1,10,40,70,8,WS_VISIBLE
dialogitem 'EDIT','',ID_MESSAGE,10,50,170,13,WS_VISIBLE+WS_BO RDER+WS_TABSTOP+ES_AUTOHSCROLL
dialogitem 'BUTTON','&Icon',-1,10,70,80,70,WS_VISIBLE+BS_GROUPBOX
dialogitem 'BUTTON','&Error',ID_ICONERROR,20,82,60,13,WS_VISIBLE+BS_AUTO RADIOBUTTON+WS_TABSTOP+WS_GROUP
dialogitem 'BUTTON','I&nformation',ID_ICONINFORMATION,20,95,60,13,WS_VISI BLE+BS_AUTORADIOBUTTON
dialogitem 'BUTTON','&Question',ID_ICONQUESTION,20,108,60,13,WS_VISIBLE+ BS_AUTORADIOBUTTON
dialogitem 'BUTTON','&Warning',ID_ICONWARNING,20,121,60,13,WS_VISIBLE+BS _AUTORADIOBUTTON
dialogitem 'BUTTON','&Style',-1,100,70,80,70,WS_VISIBLE+BS_GROUPBOX
dialogitem 'BUTTON','&Top most',ID_TOPMOST,110,82,60,13,WS_VISIBLE+WS_TABSTO P+BS_AUTOCHECKBOX
dialogitem 'BUTTON','OK',IDOK,85,150,45,15,WS_VISIBLE+WS_TABS TOP+BS_DEFPUSHBUTTON
dialogitem 'BUTTON','C&ancel',IDCANCEL,135,150,45,15,WS_VISIBLE+WS_TABSTO P+BS_PUSHBUTTON
enddialog

maryam abs
دوشنبه 17 مرداد 1390, 14:02 عصر
سلام ممنون به خاطر جوابی که دادین
ولی من یه جاهایی از این کد یعنی بیشترش رو نمیفهمم :ناراحت:
راه سادهتری وجود نداره برا کسی که تازه اسمبلی رو شروع کرده؟؟
یعنی یه مستطیل 2 محیط گرافیکی با یه مختصای که یه مکان نما داشته باشه که اطلاعات رو از صفحه کلید بگیره
با وقفه ها امکانش نیست این کارو انجام داد؟؟؟
بازم ممنوونم به خاطر جوابتون

IamOverlord
سه شنبه 18 مرداد 1390, 17:52 عصر
ببینید شما بالاخره باید مشخص کنید چه نوع برنامه ای می خواید بنویسید، مثلا Console Application باشه یا Win32 Application، اگه می خواید Textbox و یا Control های دیگه ای روی Form تون بذارید، باید Win32 App بنویسید، ولی اگه می خواید از وقفه استفاده کنید مسئله فرق می کنه و مثل برنامه های DOS در می یاد. اون کدی که من دادم Win32 App بود توی Flat ASseMbler.
ضمنا منظورتون از محیط گرافیکی محیط Windows هست یا یه حالت گرافیکی توی برنامه های Console؟

maryam abs
سه شنبه 18 مرداد 1390, 19:53 عصر
منظورم حالت گرافیکی توی برنامه های کنسول و مثل برنامه های dos واصلا نمیخوام شبیه windowsباشه
در ضمن کامپایلری که دارم masm هستش

Master.
جمعه 21 مرداد 1390, 11:56 صبح
شما میتونید برای رفتن به محیط گرافیکی در اسمبلی از وقفه 10h استفاده کنید .
MOV AH , 00H
MOV AL , 12H
INT 10H

اگه 12 رو به 3 تغییر بدید فکر کنم وارد مود متنی میشید .
برای دریافت اطلاعات از صفحه کلید هم خیلی راحت میتونید از توابع بایوس استفاده کنید .
من قبلا برای درس زبان ماشین یک سیستم عامل نوشتم بعضی از توابع رو اینجا براتون قرار میدم امیدوارم بکارتون بیاد.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PUTC ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PUTC PROC
PUSH AX
PUSH BX
MOV AH, 0EH
MOV BL, 07H
MOV BH, 00H
INT 10H
POP BX
POP AX
RET
PUTC ENDP
;========================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PUTS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;LEA SI, YOURTEXT
PUTS PROC
PUSH AX
_PUT: LODSB
CMP AL, 0
JZ _EXIT
CALL PUTC
JMP _PUT
_EXIT:
POP AX
RET
PUTS ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

برای دریافت از کاربر:
GETNUM:
Push SI
Push DX
Push AX


LEA SI, GETNUMMSG
CALL PUTS
MOV DX,8
LEA DI, NUM
RD: MOV AH,00
INT 16H
CALL PUTC
MOV BYTE PTR[DI],AL
INC DI
DEC DX
CMP AL,13
JE GetOut
CMP DX,0
JNZ RD
GetOut:

Pop AX
Pop DX
Pop SI
RET
بخش اسمبلی و زبان ماشین اینجا هم فعاله و نمونه های مختلف و خوبی داره : http://forum.ustmb.ir/