ورود

View Full Version : مشکل در این برنامه Assembly



__Genius__
دوشنبه 19 فروردین 1387, 01:37 صبح
سلام ،
من این برنامه رو نوشتم که یک پنجره ساده رو ایجاد میکنه .
کد نباید مشکلی داشته باشه ، ولی عجیبه ، موقع Assemble کردن مشکل میگیره .




.386P
.MODEL FLAT,STDCALL

WM_DESTROY EQU 2
WM_CREATE EQU 1
WM_LBUTTONDOWN EQU 201h
WM_RBUTTONDOWN EQU 204h
CS_VREDRAW EQU 1h
CS_HREDRAW EQU 2h
CS_GLOBALCLASS EQU 4000h
WS_OVERLAPPEDWINDOW EQU 000CF0000H
Style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
IDI_APPLICATION EQU 32512
IDC_CROSS EQU 32515
SW_SHOWNORMAL EQU 1

EXTERN GetModulehandleA@4:NEAR
EXTERN LoadIconA@8:NEAR
EXTERN LoadCursorA@8:NEAR
EXTERN RegisterClassA@4:NEAR
EXTERN CreateWindowExA@48:NEAR
EXTERN ShowWindow@8:NEAR
EXTERN UpdateWindow@4:NEAR
EXTERN GetMessageA@16:NEAR
EXTERN TranslateMessageA@4:NEAR
EXTERN DispatchMessageA@4:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN MessageBoxA@16:NEAR
EXTERN DefWindowProcA@16:NEAR
EXTERN PostQuitMessage@4:NEAR

includelib C:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib

MSGSTRUCT STRUC
MSHWND DD ?
MSMESSAGE DD ?
MSWPARAM DD ?
MSLPARAM DD ?
MSTIME DD ?
MSPT DD ?
MSGSTRUCT ENDS

WNDCLASS STRUC
CLSSTYLE DD ?
CLWNDPROC DD ?
CLSCEXTRA DD ?
CLSHINSTANCE DD ?
CLSHICON DD ?
CLSHCURSOR DD ?
CLBKGROUND DD ?
CLMENUNAME DD ?
CLNAME DD ?
WNDCLASS ENDS

_DATA SEGMENT
NEWHWND DD 0
MSG MSGSTRUCT <?>
WC WNDCLASS <?>
HINST DD 0
TITLENAME DB 'Simple Example of a 32-bit application',0
CLASSNAME DB 'Class32',0
CAP DB 'Message',0
MES1 DB 'You have clicked the left mouse button',0
MES2 DB 'Exit, bye !',0
_DATA ENDS

_TEXT SEGMENT
START:
push 0
Call GetModuleHandleA@4
mov [HINST],EAX

REG_CLASS:
MOV [WC.CLWNDPROC],OFFSET WNDPROC
MOV [WC.CLSCEXTRA],0
MOV [W.CLWNDEXTRA],0
MOV EAX,[HINST]
MOV [WC.CLSHINSTANCE],EAX

PUSH IDI_APPLICATION
PUSH 0
CALL LoadIconA@8
MOV [WC.CLSHICON],EAX

PUSH IDC_CROSS
PUSH 0
CALL LoadCursorA@8
MOV [WC.CLSHCURSOR],EAX
MOV [WC.CLBKGROUND],17
MOV [WC.CLMENUNAME],0
MOV [WC.CLNAME],OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA@4
PUSH 0
PUSH [HINST]
PUSH 0
PUSH 0
PUSH 500
PUSH 500
PUSH 100
PUSH 100
PUSH WS_OVERLAPPEDWINDOW
PUSH OFFSET TITLENAME
PUSH OFFSET CLASSNAME
PUSH 0
CALL CreateWindowExA@48
CMP EAX,0
JZ _ERR
PUSH SW_SHOWNORMAL
PUSH [NEWHWND]
CALL ShowWindow@8
PUSH [NEWHWND]
CALL UpdateWindow@4
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA@16
CMP EAX,0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessageA@4
PUSH OFFSET MSG
CALL DispatchMessageA@4
JMP MSG_LOOP
END_LOOP:
PUSH [MSG.MSWPARAM]
CALL ExitProcess@4
_ERR:
JMP END_LOOP
WNDPROC PROC
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH]
JE WMDESTROY
CMP DWORD PTR [EBP+0CH]
JE WMCREATE
CMP DWORD PTR [EBP+0CH]
JE LBUTTON
CMP DWORD PTR [EBP+0CH]
JE RBUTTON
JMP DEFWNDPROC
RBUTTON:
JMP WMDESTROY
LBUTTON:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES1
PUSH DWORD PTR [EBP+08h]
CALL MessageBoxA@16
MOV EAX,0
JMP FINISH
WMCREATE:
MOV EAX,0
JMP FINISH

DEFWNDPROC :
PUSH DWORD PTR [EBP+14h]
PUSH DWORD PTR [EBP+10h]
PUSH DWORD PTR [EBP+0Ch]
PUSH DWORD PTR [EBP+08h]
CALL DefWindowProcA@16
JMP FINISH

WMDESTROY:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES2
PUSH DWORD PTR [EBP+08h]
CALL MessageBoxA@16
PUSH 0
CALL PostQuitMessage@4
MOV EAX,0

FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16

WNDPROC ENDP
_TEXT ENDS
END START



اگه یه کمکی بکنین و ما رو دریابین خیلی خوب میشه

__Genius__
دوشنبه 19 فروردین 1387, 02:09 صبح
بر و بچ درستش کردم :بامزه::لبخندساده:
ایناها :



.386P
.MODEL FLAT,STDCALL
WM_DESTROY EQU 2
WM_CREATE EQU 1
WM_LBUTTONDOWN EQU 201h
WM_RBUTTONDOWN EQU 204h
CS_VREDRAW EQU 1h
CS_HREDRAW EQU 2h
CS_GLOBALCLASS EQU 4000h
WS_OVERLAPPEDWINDOW EQU 000CF0000H
Style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
IDI_APPLICATION EQU 32512
IDC_CROSS EQU 32515
SW_SHOWNORMAL EQU 1

EXTERN GetModuleHandleA@4:NEAR
EXTERN LoadIconA@8:NEAR
EXTERN LoadCursorA@8:NEAR
EXTERN RegisterClassA@4:NEAR
EXTERN CreateWindowExA@48:NEAR
EXTERN ShowWindow@8:NEAR
EXTERN UpdateWindow@4:NEAR
EXTERN GetMessageA@16:NEAR
EXTERN TranslateMessage@4:NEAR
EXTERN DispatchMessageA@4:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN MessageBoxA@16:NEAR
EXTERN DefWindowProcA@16:NEAR
EXTERN PostQuitMessage@4:NEAR

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib

MSGSTRUCT STRUC
MSHWND DD ?
MSMESSAGE DD ?
MSWPARAM DD ?
MSLPARAM DD ?
MSTIME DD ?
MSPT DD ?
MSGSTRUCT ENDS

WNDCLASS STRUC
CLSSTYLE DD ?
CLWNDPROC DD ?
CLSCEXTRA DD ?
CLWNDEXTRA DD ?
CLSHINSTANCE DD ?
CLSHICON DD ?
CLSHCURSOR DD ?
CLBKGROUND DD ?
CLMENUNAME DD ?
CLNAME DD ?
WNDCLASS ENDS

_DATA SEGMENT
NEWHWND DD 0
MSG MSGSTRUCT <?>
WC WNDCLASS <?>
HINST DD 0
TITLENAME DB 'Simple Example of a 32-bit application',0
CLASSNAME DB 'Class32',0
CAP DB 'Message',0
MES1 DB 'You have clicked the left mouse button',0
MES2 DB 'Exit, bye !',0
_DATA ENDS

_TEXT SEGMENT
START:

PUSH 0
CALL GetModuleHandleA@4
MOV [HINST], EAX
REG_CLASS:
MOV [WC.CLSSTYLE], style


MOV [WC.CLWNDPROC], OFFSET WNDPROC
MOV [WC.CLSCEXTRA], 0
MOV [WC.CLWNDEXTRA], 0
MOV EAX, [HINST]
MOV [WC.CLSHINSTANCE], EAX
;----------Window icon
PUSH IDI_APPLICATION
PUSH 0
CALL LoadIconA@8
MOV [WC.CLSHICON], EAX
;----------Window cursor
PUSH IDC_CROSS
PUSH 0
CALL LoadCursorA@8
MOV [WC.CLSHCURSOR], EAX
;-----------
MOV [WC.CLBKGROUND], 17 ; Window color
MOV DWORD PTR [WC.CLMENUNAME], 0
MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA@4
; Create a window of the registered class
PUSH 0
PUSH [HINST]
PUSH 0
PUSH 0
PUSH 400
PUSH 400
PUSH 100
PUSH 100
PUSH WS_OVERLAPPEDWINDOW
PUSH OFFSET TITLENAME
PUSH OFFSET CLASSNAME
PUSH 0
CALL CreateWindowExA@48
; Check for errors
CMP EAX, 0
JZ _ERR
MOV [NEWHWND], EAX ; Window descriptor
;---------------------
PUSH SW_SHOWNORMAL
PUSH [NEWHWND]
CALL ShowWindow@8
PUSH [NEWHWND]
CALL UpdateWindow@4
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA@16
CMP EAX, 0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage@4
PUSH OFFSET MSG
CALL DispatchMessageA@4
JMP MSG_LOOP
END_LOOP:
PUSH [MSG.MSWPARAM]
CALL ExitProcess@4
_ERR:
JMP END_LOOP
WNDPROC PROC
PUSH EBP
MOV EBP, ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH], WM_DESTROY
JE WMDESTROY
CMP DWORD PTR [EBP+0CH], WM_CREATE
JE WMCREATE
CMP DWORD PTR [EBP+0CH], WM_LBUTTONDOWN ; Left button
JE LBUTTON

CMP DWORD PTR [EBP+0CH], WM_RBUTTONDOWN ; Right button
JE RBUTTON
JMP DEFWNDPROC
RBUTTON:
JMP WMDESTROY
LBUTTON:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES1
PUSH DWORD PTR [EBP+08h]
CALL MessageBoxA@16
MOV EAX,0
JMP FINISH
WMCREATE:
MOV EAX,0
JMP FINISH

DEFWNDPROC :
PUSH DWORD PTR [EBP+14h]
PUSH DWORD PTR [EBP+10h]
PUSH DWORD PTR [EBP+0Ch]
PUSH DWORD PTR [EBP+08h]
CALL DefWindowProcA@16
JMP FINISH

WMDESTROY:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES2
PUSH DWORD PTR [EBP+08h]
CALL MessageBoxA@16
PUSH 0
CALL PostQuitMessage@4
MOV EAX,0

FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16

WNDPROC ENDP
_TEXT ENDS
END START


شما هم دوست داشتین توی برنامه هاتون بکار ببرید و استفاده کنین .