تبليغاتX
بیهوده نامه
كمي ... و هزارتا چیز دیگر

كوچك كه بوديم چه دل هاي بزرگي داشتيم اكنون كه بزرگيم چه دلتنگيم كاش همان كودكي بوديم كه حرفهايش را از نگاهش مي توان خواند اما اكنون اگر فرياد هم بزنيم كسي نمي فهمد و دل خوش كرده ايم كه سكوت كرده ايم سكوت پر بهتر از فرياد تو خاليست!

هرروزتان نوروز، نوروزتان پیروز! شاد باشید! 

تا بعد!! 

نوشته شده توسط مسعود تهرانی در ساعت 9:8 | لینک  | 

ببخشید مدتیه سرم بدجوری شلوغه!! بزودی خدمت میرسم!!

تا بعد!!

نوشته شده توسط مسعود تهرانی در ساعت 10:48 | لینک  | 

حالا میخواهیم در برنامه ای که مینویسیم، یک Message Box نمایش دهیم. Prototype تابع آن بصورت زیر است:

MessageBox PROTO hwnd:DWORD, lpText:DWORD, lpCaption:DWORD, uType:DWORD

hwnd شماره ای است که به Window تخصیص داده میشود (مشابه File Handle). مقدار این پارامتر برای ما مهم نیست، فقط بخاطر میسپاریم که این شماره برای ما مشخص کننده پنجره ای است که قرار است نمایش داده شود. هرگاه بخواهیم عملیاتی را بر روی پنجره انجام دهیم باید Handle آن را ذکر کنیم.

lpText اشاره گری است به رشته ای که میخواهیم در پنجره نمایش دهیم. در واقع آدرس رشته باید در این پارامتر قرار گیرد.

lpCaption همانطوری که از اسمش پیدا است، Caption پنجره را مشخص میکند.

uType آیکون و تعداد و نوع کلیدهای روی پنجره را ذکر میکند.

حالا برنامه قبلی خود را بصورت زیر تغییر میدهیم:

386.

Model flat, stdcall.

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

data.

 MsgBoxCaption DB "First Program", 0

MsgBoxText DB "Win32 Assembly Test", 0

code.

:start

invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK

invoke ExitProcess, NULL

end start

برنامه فوق را اسمبل و لینک کرده و سپس اجرا کنید. پنجره ای  براساس تعریف بالا نمایش داده میشود.

یکبار دیگر برنامه را با هم مرور میکنیم. در قسمت Data رشته ها بصورت zString تعریف میشوند، یعنی رشته ای که انتهای آن صفر قرار دارد (رشته ها در ANSI حتماْ باید به این شکل تعریف شوند).

مقادیر ثابت NULL و MB_OK مقادیری هستند که در فایل windows.inc از قبل تعریف شده اند و میتوانیم از آنها استفاده کنیم. اپراتور addr آدرس اپراندش را به یک تابع میفرستد. میتوانید بجای آن از offset نیز استفاده کنید، اگرچه بین این دو تفاوتهایی وجود دارد:

addr نمیتواند آدرس مقادیری که بعداْ تعریف میشوند را برگرداند ولی offset میتواند این کار را انجام دهد.  به مثال زیر توجه کنید:

invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK

........

MsgBoxCaption DB "First Program", 0

MsgBoxText DB "Win32 Assembly Test", 0

در این وضعیت اسمبلر خطا برمیگرداند، چرا که متغیر بعد از استفاده از addr تعریف شده است. ولی در همین مثال میتوان بدون هیچ مشکلی از offset استفاده کرد.

تفاوت دیگر در این است که offset برای متغیرهای محلی تعریف نشده است، در حالی که addr  براحتی با آنها کار میکند (متغیرهای محلی فضاهایی رزرو شده در Stack هستند که آدرس آنها فقط در زمان اجرا مشخص میشود و  از آنجایی که Offset در زمان اسمبل کردن ترجمه میشود، طبیعی است که نمیتوان از آن برای متغیرهای محلی استفاده نمود).

تا بعد!!

نوشته شده توسط مسعود تهرانی در ساعت 15:25 | لینک  |