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
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/
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.