میخواستم وارد اسمبلی بشم اما یادم اومد که یک سری مقدمات رو نگفتم
--------------------------------------
ببینید دوستان یه برنامه اسمبلی در واقع از سه تا بخش تشکیل میشه ( سه تا سگمنت ) که اون قسمت ها قسمت Data , Bss , Text هستن
قسمت Data برای نگهداری متغیر هایی هست که مقدار دهی اولیه میشن مثلا میگیم hello: db "Hello" اینجا ما الان متغیر Hello رو از نوع رشته ای و کاراکتر اسکی با مقدار اولیه Hello تعریف کردیم این کار رو در قسمت Data میکنیم.
ولی حالا میایم یه متغیر تعریف میکنیم ولی مقدار بهش نمیدیم اینو میزاریم توی قسمت BSS
و کد هامون رو هم ( همون ساختار چهارتیکه ای ) در قسمت Text مینویسیم .
ولی حالا ما اون متغیر ها رو در حافظه ذخیره کردیم دیگه ولی حافظه فقط متغیر ها رو ذخیره میکنه دیگه حالا مثلا اگر عدد 4 رو خواستیم استفاده کنیم مثلا به عنوان یک سیستم کال ( سیستم کال ها رو توضیح میدم ) باید ذخیره کنیم تو متغیر بعد از تو اون استفاده کنیم ؟ چه کاریه ؟
برای این کار سی پی یو خودش یه حافظه هایی رو داره به نام رجیستر که به فارسی میشه ثبّات . ( خیلی ها به اشتباه میگن ثُبات اون غلطه ثبّات درست هست ثبت کننده )
بعد حالا رسیدیم به مبحث شیرین رجیستر .
خیلی جا ها راجع به رجیستر ها توضیح دادن ولی حالا ما اینجا توضیح ها رو کوتاه میکنیم ببینید چند گروه رجیستر داریم :
رجیستر های عمومی :
EAX,EBX,ECX,EDX ( این ها مال Intel x86 هست ممکنه در بقیه سی پی یو ها یه جور دیگه باشه مثلا شونزده بیتی باشه این E اول اونها به معنی 32 بیتی بودنشون هست )
ثبّات های پشته : ESP,EBP ( راجع به پشته بعدا توضیح میدیم فعلا لازم نیست )
ثبّات های شاخص : ESI,EDI
ثبّات اشاره گر دستورالعمل : EIP
خوب حالا وقتی که بخوایم یه کاری انجام بدیم یا از یه تابعی استفاده کنیم مثلا فقط Close کنیم برنامه رو از چیز هایی استفاده میکنیم به نام سیستم کال ( میتونید لیست کاملی از سیستم کال ها رو در مسیر
کد PHP:
/usr/include/asm/unistd.h
و یا در آدرس :
کد PHP:
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
مشاهده کنید )
خوب برای اینکه یک عمل انجام بشه باید سیستم کالش در eax و آرگومان هاش ( اون چیزایی که اضافی بهش میدیم که روشون کار انجام بده )به ترتیب آرگومان اول در ebx دوم در ecx و سوم در edx قرار میگیرند.
خوب برای این قسمت دیگه کافیه
موفق و پیروز باشید