سوال

m_asadpoor

New Member
سلام دوستان من یک قطعه کد اسمبلی دانلود کردم ولی نمی تونم کامل بفهمم که این کد چی کار می کنه .کسی هست که بتونه به من کمک کنه؟
کد:
     [B][FONT=&quot].386[/FONT][/B]
  [B][FONT=&quot].model flat,stdcall[/FONT][/B]
  [B][FONT=&quot]option casemap:none[/FONT][/B]
  
  [B][FONT=&quot]WinMain proto :DWORD,:DWORD,:DWORD,:DWORD[/FONT][/B]
  
  [B][FONT=&quot]include \masm32\include\windows.inc[/FONT][/B]
  [B][FONT=&quot]include \masm32\include\user32.inc[/FONT][/B]
  [B][FONT=&quot]include \masm32\include\kernel32.inc[/FONT][/B]
  [B][FONT=&quot]include \masm32\include\gdi32.inc[/FONT][/B]
  [B][FONT=&quot]includelib \masm32\lib\user32.lib[/FONT][/B]
  [B][FONT=&quot]includelib \masm32\lib\kernel32.lib[/FONT][/B]
  [B][FONT=&quot]includelib \masm32\lib\gdi32.lib[/FONT][/B]
  
  [B][FONT=&quot].data[/FONT][/B]
  [B][FONT=&quot]ClassName db "SimpleWinClass",0[/FONT][/B]
  [B][FONT=&quot]AppName  db "Our First Window",0[/FONT][/B]
  [B][FONT=&quot]char WPARAM 20h[/FONT][/B]
  
  [B][FONT=&quot].data?[/FONT][/B]
  [B][FONT=&quot]hInstance HINSTANCE ?[/FONT][/B]
  [B][FONT=&quot]CommandLine LPSTR ?[/FONT][/B]
  
  [B][FONT=&quot].code[/FONT][/B]
  [B][FONT=&quot]start:[/FONT][/B]
  [B][FONT=&quot]            invoke GetModuleHandle, NULL[/FONT][/B]
  [B][FONT=&quot]            mov    hInstance,eax[/FONT][/B]
  [B][FONT=&quot]            invoke GetCommandLine[/FONT][/B]
  [B][FONT=&quot]            mov CommandLine,eax[/FONT][/B]
  [B][FONT=&quot]            invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT[/FONT][/B]
  [B][FONT=&quot]            invoke ExitProcess,eax[/FONT][/B]
  [B][FONT=&quot]WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD[/FONT][/B]
  [B][FONT=&quot]            LOCAL wc:WNDCLAS***[/FONT][/B]
  [B][FONT=&quot]            LOCAL msg:MSG[/FONT][/B]
  [B][FONT=&quot]            LOCAL hwnd:HWND[/FONT][/B]
  [B][FONT=&quot]            mov   wc.cbSize,SIZEOF WNDCLAS***[/FONT][/B]
  [B][FONT=&quot]            mov   wc.style, CS_HREDRAW or CS_VREDRAW[/FONT][/B]
  [B][FONT=&quot]            mov   wc.lpfnWndProc, OFFSET WndProc[/FONT][/B]
  [B][FONT=&quot]            mov   wc.cbCl***tra,NULL[/FONT][/B]
  [B][FONT=&quot]            mov   wc.cbWndExtra,NULL[/FONT][/B]
  [B][FONT=&quot]            push  hInst[/FONT][/B]
  [B][FONT=&quot]            pop   wc.hInstance[/FONT][/B]
  [B][FONT=&quot]            mov   wc.hbrBackground,COLOR_WINDOW+1[/FONT][/B]
  [B][FONT=&quot]            mov   wc.lpszMenuName,NULL[/FONT][/B]
  [B][FONT=&quot]            mov   wc.lpszClassName,OFFSET ClassName[/FONT][/B]
  [B][FONT=&quot]            invoke LoadIcon,NULL,IDI_APPLICATION[/FONT][/B]
  [B][FONT=&quot]            mov   wc.hIcon,eax[/FONT][/B]
  [B][FONT=&quot]            mov   wc.hIconSm,eax[/FONT][/B]
  [B][FONT=&quot]            invoke LoadCursor,NULL,IDC_ARROW[/FONT][/B]
  [B][FONT=&quot]            mov   wc.hCursor,eax[/FONT][/B]
  [B][FONT=&quot]            invoke RegisterClas***, addr wc[/FONT][/B]
  [B][FONT=&quot]            INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\[/FONT][/B]
  [B][FONT=&quot]           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\[/FONT][/B]
  [B][FONT=&quot]           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\[/FONT][/B]
  [B][FONT=&quot]           hInst,NULL[/FONT][/B]
  [B][FONT=&quot]            mov   hwnd,eax[/FONT][/B]
  [B][FONT=&quot]            INVOKE ShowWindow, hwnd,SW_SHOWNORMAL[/FONT][/B]
  [B][FONT=&quot]            INVOKE UpdateWindow, hwnd[/FONT][/B]
  [B][FONT=&quot]            .WHILE TRUE[/FONT][/B]
  [B][FONT=&quot]                INVOKE GetMessage, ADDR msg,NULL,0,0[/FONT][/B]
  [B][FONT=&quot]                .BREAK .IF (!eax)[/FONT][/B]
  [B][FONT=&quot]                INVOKE TranslateMessage, ADDR msg[/FONT][/B]
  [B][FONT=&quot]                INVOKE DispatchMessage, ADDR msg[/FONT][/B]
  [B][FONT=&quot]            .ENDW[/FONT][/B]
  [B][FONT=&quot]            mov     eax,msg.wParam[/FONT][/B]
  [B][FONT=&quot]            ret[/FONT][/B]
  [B][FONT=&quot]WinMain endp[/FONT][/B]
  [B][FONT=&quot]WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM[/FONT][/B]
  [B][FONT=&quot]            LOCAL hdc:HDC[/FONT][/B]
  [B][FONT=&quot]            LOCAL ps:PAINTSTRUCT[/FONT][/B]
  
  [B][FONT=&quot]            .IF uMsg==WM_DESTROY[/FONT][/B]
  [B][FONT=&quot]                        invoke PostQuitMessage,NULL[/FONT][/B]
  [B][FONT=&quot]            .ELSEIF uMsg==WM_CHAR[/FONT][/B]
  [B][FONT=&quot]                        push wParam[/FONT][/B]
  [B][FONT=&quot]                        pop  char[/FONT][/B]
  [B][FONT=&quot]                        invoke InvalidateRect, hWnd,NULL,TRUE[/FONT][/B]
  [B][FONT=&quot]            .ELSEIF uMsg==WM_PAINT[/FONT][/B]
  [B][FONT=&quot]                        invoke BeginPaint,hWnd, ADDR ps[/FONT][/B]
  [B][FONT=&quot]                        mov    hdc,eax[/FONT][/B]
  [B][FONT=&quot]                        invoke TextOut,hdc,0,0,ADDR char,1[/FONT][/B]
  [B][FONT=&quot]                        invoke EndPaint,hWnd, ADDR ps[/FONT][/B]
  [B][FONT=&quot]            .ELSE[/FONT][/B]
  [B][FONT=&quot]                        invoke DefWindowProc,hWnd,uMsg,wParam,lParam[/FONT][/B]
  [B][FONT=&quot]                        ret[/FONT][/B]
  [B][FONT=&quot]            .ENDIF[/FONT][/B]
  [B][FONT=&quot]            xor    eax,eax[/FONT][/B]
  [B][FONT=&quot]            ret[/FONT][/B]
  [B][FONT=&quot]WndProc endp[/FONT][/B]
  [B][FONT=&quot]end start[/FONT][/B]
 

the_king

مدیرکل انجمن
سلام دوستان من یک قطعه کد اسمبلی دانلود کردم ولی نمی تونم کامل بفهمم که این کد چی کار می کنه .کسی هست که بتونه به من کمک کنه؟
یک مثال ساده از ابتدایی ترین ساختار یک برنامه ای است که بتونه در ویندوز اجرا بشه، یعنی نشون داده که یک کدی
که بتونه یک برنامه تحت ویندوز شامل یک پنجره رو نشون بده، حداقل باید شامل چه محتویاتی باشه.

مشخصات مدل حافظه، قرارگیری پارامتر های توابع در پشته و حساسیت نسبت به بزرگی و کوچکی حروف (مثل C / ++C)
کد:
     .386
  .model flat,stdcall
  option casemap:none

قبل از اینکه تعاریفی مثل HINSTANCE که برای اسمبلی ناآشنا هستند معرفی شوند، تابع فراخوان برنامه های
تحت ویندوز (WinMain) که مشابه main در برنامه های ++C است، با تعریف آشنای DWORD تعریف میشه
کد:
  WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

کامپایل کردن و اتصال یکسری تعاریف و توابع API اساسی ویندوز برای اسمبلی
کد:
  include \masm32\include\windows.inc
  include \masm32\include\user32.inc
  include \masm32\include\kernel32.inc
  include \masm32\include\gdi32.inc
  includelib \masm32\lib\user32.lib
  includelib \masm32\lib\kernel32.lib
  includelib \masm32\lib\gdi32.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,NULL,\
             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 ویندوز هستند که تقریبا هیچ
برنامه ای را نخواهید یافت که آنها را بکار نبرده باشد.
 

جدیدترین ارسال ها

بالا