واضح آرشیو وب فارسی:سایت ریسک: سوال m_asadpoor 10 تير 1389, 19:28سلام دوستان من یک قطعه کد اسمبلی دانلود کردم ولی نمی تونم کامل بفهمم که این کد چی کار می کنه .کسی هست که بتونه به من کمک کنه؟ .386 .model flat,stdcall option casemap:none WinMain proto :DWORD,:DWORD,:DWORD,:DWORD include masm32includewindows.inc include masm32includeuser32.inc include masm32includekernel32.inc include masm32includegdi32.inc includelib masm32libuser32.lib includelib masm32libkernel32.lib includelib masm32libgdi32.lib .data ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 char WPARAM 20h .data? hInstance HINSTANCE ? CommandLine LPSTR ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLAS*** LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLAS*** mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbCl***tra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClas***, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NUL L, hInst,NULL mov hwnd,eax INVOKE ShowWindow, hwnd,SW_SHOWNORMAL INVOKE UpdateWindow, hwnd .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_CHAR push wParam pop char invoke InvalidateRect, hWnd,NULL,TRUE .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke TextOut,hdc,0,0,ADDR char,1 invoke EndPaint,hWnd, ADDR ps .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start the_king 10 تير 1389, 22:06سلام دوستان من یک قطعه کد اسمبلی دانلود کردم ولی نمی تونم کامل بفهمم که این کد چی کار می کنه .کسی هست که بتونه به من کمک کنه؟ یک مثال ساده از ابتدایی ترین ساختار یک برنامه ای است که بتونه در ویندوز اجرا بشه، یعنی نشون داده که یک کدی که بتونه یک برنامه تحت ویندوز شامل یک پنجره رو نشون بده، حداقل باید شامل چه محتویاتی باشه. مشخصات مدل حافظه، قرارگیری پارامتر های توابع در پشته و حساسیت نسبت به بزرگی و کوچکی حروف (مثل C / ++C) .386 .model flat,stdcall option casemap:none قبل از اینکه تعاریفی مثل HINSTANCE که برای اسمبلی ناآشنا هستند معرفی شوند، تابع فراخوان برنامه های تحت ویندوز (WinMain) که مشابه main در برنامه های ++C است، با تعریف آشنای DWORD تعریف میشه WinMain proto :DWORD,:DWORD,:DWORD,:DWORD کامپایل کردن و اتصال یکسری تعاریف و توابع API اساسی ویندوز برای اسمبلی include masm32includewindows.inc include masm32includeuser32.inc include masm32includekernel32.inc include masm32includegdi32.inc includelib masm32libuser32.lib includelib masm32libkernel32.lib includelib masm32libgdi32.lib مشخص کردن اسم برای کلاس پنجره اصلی برنامه و نام خود برنامه و یک کاراکتر فاصله با کد ASCII برابر 20h .data ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 char WPARAM 20h کد شناسایی برنامه در حال اجرا و پارامتر های سطر فرمان آن در hInstance و CommandLine قرار خواهند گرفت .data? hInstance HINSTANCE ? CommandLine LPSTR ? مقدمات آنکه یک برنامه تحت ویندوز بتواند اجرا شود، شامل دریافت کد شناسایی برنامه و سطر فرمان آن و اجرا کردن تابع اصلی برنامه (WinMain) و زمانی که اجرایش تمام شد، اجرا کردن ExitProcess برای خاتمه برنامه. .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax ابتدایی ترین کارهایی که در نهایت منجر به نمایش یک پنجره ساده می شوند در اینجا هستند. ریزه کاری های زیادی مثل مشخص کردن ویژگی های پنجره، رنگ زمینه، آیکون برنامه، ظاهر مکان نمای ماوس (Cursor) معرفی تابعی که رخداد ها (Events) پنجره نمایش داده شده را مدیریت کند و ... WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLAS*** LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLAS*** mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbCl***tra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClas***, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NUL L, hInst,NULL mov hwnd,eax INVOKE ShowWindow, hwnd,SW_SHOWNORMAL INVOKE UpdateWindow, hwnd .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp اصل موضوع این است که حداقل رخداد های اساسی پنجره مثل ایجاد شدن، نابود شدن، نمایش (ترسیم) مدیریت شوند. از قلم افتادن هر کدام از این موارد منجر به عدم پاسخگویی صحیح پنجره می شود. تابع WndProc این مدیریت را انجام می دهد. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_CHAR push wParam pop char invoke InvalidateRect, hWnd,NULL,TRUE .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke TextOut,hdc,0,0,ADDR char,1 invoke EndPaint,hWnd, ADDR ps .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start گویا ساده ترین کاری که در نمایش پنجره انجام شده، نمایش یک کاراکتر فاصله است که طبیعتا تاثیر ظاهری خاصی ندارد. توابعی مثل InvalidateRect و BeginPaint و TextOut و ... جزو توابع متعارف API ویندوز هستند که تقریبا هیچ برنامه ای را نخواهید یافت که آنها را بکار نبرده باشد. m_asadpoor 11 تير 1389, 18:58واقعاً متشکرم.کمک بزرگی کردید.موفق و پایدار باشید سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 598]