بنام  خدا



آدرس جدید پست براساس شماره ترتیبی :


https://vahidmy.blog.ir/post/19



عنوان پست :



لذت اسمبلی :


از این پست به بعد می خواهم بصورت  پراکنده  و نامنظم  و فی البداهه  ، زبان اسمبلی  را بصورت عمومی و صرف نظر از نوع کامپایلر ،    تدریس کنم .

چون تنها دلیل من برای بازگشت به  دنیای وبلاگنویسی ، احیای زبان برنامه نویسی اسمبلی است و هیچ دلیل دیگری ندارم .


من زبان اسمبلی را بصورت فی البداهه و نامنظم و تصادفی  ، تدریس می کنم . پس خودتان را  آماده کنید .


شروع  تدریس زبان اسمبلی:



زبان اسمبلی نسخه ی قابل فهم زبان ماشین است . زبان ماشین زبان واقعی و حقیقی کامپیوتر است .

زبان اسمبلی زبان پردازنده است .  مهمترین و رایج ترین پردازنده در دنیا پردازنده ی اینتل است .

پس به سایر پردازنده ها  کاری ندارم .  چون برخی هایشان برای همیشه منسوخ شدند و به تاریخ پیوستند و بقیه نیز در  آینده  ، منسوخ خواهند شد .  چون دوران  سلطنت پردازنده ی اینتل  هیچوقت به پایان نمی رسد .  اینتل  بیش از 91 درصد دستگاههای دیجیتالی دنیا را تصرف کرده است  و پادشاه تمامی پردازندهای دنیاست .

 

بنابراین  بجز  اینتل ،  سایر  پردازنده ها  را  بکلی  فراموش کنید ( نسل آینده ی گوشیهای هوشمند و تبلتها و سایر دستگاههای دیجیتالی قابل حمل و جیبی ، از پردازنده ی اینتل استفاده می کند و پردازنده ی آرم نیز به تاریخ خواهد پیوست ) .


پردازنده ی اینتل  دارای تعدادی رجیستر ( ثبت کننده )  می باشد که  بصورت فیزیکی  در درون اش  جای دارند .


این رجیسترها  به  این صورت هستند :


eax


ebx


ecx


edx



ebp


esp


eip



یکسری  رجیستر هم  در  پردازنده ی اینتل داریم  که   بعنوان رجیستر پرچم  نامیده می شوند و کارشان اینست که   حالت  0 و 1 زبان ماشین را  در عمل  به ما  نشان می دهند و اینها مبنای کار  زبان اسمبلی هستند .


0  یعنی  خاموش


1  یعنی روشن



رجیسترهای پرچم عبارتند از :


af


cf


zf


of



بعدا در یک پست تخصصی بطور کامل  تمامی رجیسترهای زبان اسمبلی را  تشریح  می کنم و کارکرد تخصصی همه را  اموزش می دهم .


علی الحساب فقط چند تا از  رجیسترها را در این پست   معرفی کردم .



رجیستر  eax  مهمترین و پرکاربردترین  رجیستر  در پردازنده ی اینتل می باشد . 



مثلا  می خواهیم  وضعیت یک متغیر را  بعنوان وضعیت  "غلط "  به اسمبلر  معرفی کنیم :

( یعنی بگوییم فلان چیز ، غلط و اشتباه است )

دستوری که برای انجام اینکار  می نویسیم  بدین شکل است :


mov  eax ,   False        ;   eax =  False   .   False


در زبان اسمبلی    ، عباراتی که در سمت راست   کاراکتر  ;  قرار می گیرند بعنوان  کامنت ( توضیح . تفسیر)  محسوب شده و  کامپایلر زبان اسمبلی این عبارات را نادیده گرفته و از کنارشان  بی تفاوت  رد می شود و به سراغ دستورات  بعدی  می رود . 

هر خط از دستورات زبان اسمبلی باید با همین  کاراکتر  از هم جدا شوند .


معمولا  کدهای زبان اسمبلی بصورت  یک ستون از دستورات (یعنی بصورت عمودی ) نوشته می شود  :


مثال:

xor   eax  , eax       ;  eax  =  0

xor   ebx  ,  ebx       ;  ebx  =0

xor   ecx , ecx         ; ecx =0

xor  edx  ,  edx        ;  edx = 0


نکته: قطعه  کد بالا  عملا به شما نشان می دهد که  هر برنامه ی اسمبلی  بصورت یک ستون عمودی نوشته می شود . همانطور که  در بالا گفتم  هر عبارتی که   در سمت راست  کاراکتر ;  نوشته شود  کامنت است و  کامپایل نمی شود . مثل عبارت  eax=0  .  عملا  در زبان اسمبلی   از   کاراکتر تساوی  ( یعنی  = )    استفاده نمی کنیم  چون این کاراکترهای ریاضی توسط  زبان اسمبلی قابل درک نیست .  .  بجایش از دستور  mov  یا   xor   استفاده می کنیم .


نکته:  قطعه کد بالا  تمامی  رجیسترهای عمومی و همه منظوره ی پردازنده ی اینتل را کاملا  خالی  و تمیز می کند  . اگر این کد را  قبل از کد اصلی  برنامه هایتان  بنویسید  ، سرعت کامپایل برنامه  و همچنین سرعت اجرای برنامه ،   دستکم  4 مرتبه   بیشتر می شود زیرا قبل از اجرای کد اصلی ، عملا  تمامی رجیسترهای پردازنده ی اینتل از قبل  خالی شده اند و عملا خطای سرریز  رخ نمی دهد و برنامه نیز با سرعتی بسیار بالا   اجرا می شود .


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


نکته :  سعی کنید در ویندوز ، رجیستر ebx را دستکاری نکنید . پس دستور دوم  یعنی  xor ebx,ebx  را  استثنائا   نادیده گرفته و ننویسید .  چون   رجیستر  ebx  در ویندوز  بعنوان رجیستر بیس و پایه بکار می رود و ویرایش کردن اش  ممکن است موقتا ویندوز را ناپایدار کند .  البته در ویندوزهای جدید  خصوصا از ویندوز 8 به بعد  عملا این ناپایداری   ایجاد نمی شود  . چون ویندوز از نسخه ی 8 به بعد بشدت پایدار و مستحکم است و به این راحتی  ناپایدار نمی شود . ولی احتیاط شرط عقل است .


نکته:  شما می توانید همیشه برای همه ی کارها  منحصرا از رجیستر  eax  استفاده نمایید .


هم زحمت تان کمتر می شود و هم جلوی برخی خطاها را می گیرید . 



نکته :  برای خالی کردن  رجیسترها می توانید از دستوراتی شبیه به این نیز استفاده کنید :


mov eax , 0


یا

mov  eax , eax


این دو دستور  سرعت کمتری نسبت به  دستور  xor eax , eax   دارند اما درعوض تعداد سیکلهای کمتری در پردازنده ی اینتل ایجاد می کنند و عملا  پردازنده  در زمان کمتر ، کار بیشتری انجام می دهد و این به نفع  پردازنده است  .



نکته ی مهم:


اسمبلی زبانی است  که کاملا  به نفع پردازنده و بطور کلی به نفع  کامپیوتر است .  این از نظر برنامه نویسان زبانهای سطح بالا   یک امر غیرضروری است زیرا این افراد معتقدند که  با   وجود  پردازنده های سریع و قدرتمند امروزی  نیازی به بهینه سازی کد  اسمبلی نیست و اصلا لازم نیست نگران پردازنده باشیم و باید به فکر برنامه نویس باشیم !!!!


این حرف را اینطوری  پاسخ می دهم:


ببینید وقتیکه شما  به پردازنده ی کامپیوتر رحم کنید  عملا  پردازنده نیز به شما رحم می کند یعنی هیچوقت  سیستم  هنگ نمی کند  و این به نفع شماست .  پس زبان اسمبلی  بصورت مستقیم به نفع کامپیوتر و بصورت غیرمستقیم به نفع شماست .  

اگر دوست  ندارید کامپیوتر  دم به دم  هنگ کند  پس لطفا   نگویید سرعت و قدرت پردازنده کفایت می کند .  این حرف اشتباه است .


پردازنده  هرچقدر هم که قوی و سریع و مدرن باشد بازهم  به زبان اسمبلی نیاز دارد و این بهینه سازیها  لازم و ضروری هستند .


سرعت بالا و قدرت بالای پردازنده  اصلا بهانه ی خوبی برای فرار از زبان اسمبلی و پناه بردن به زبانهای سطح بالا نیست .  این فقط یک بهانه است . 


من قصد دارم لذت برنامه نویسی با زبان اسمبلی را به شما  بچشانم .  پس بدانید که  این لذت  بدست نمی آید مگر اینکه   ذهن تان را از دنیای زبانهای سطح بالا و به  اصطلاح مدرن  بیرون بکشید و مغزتان را فرمت کنید و با ذهنی خالی و اماده  به سراغ  اسمبلی بیایید .


تا زمانیکه  شما مدام به زبانهای سطح بالا و فناوریهای مدرن امروز و اینده فکر کنید  از زبان اسمبلی لذت نخواهید برد .  


ذهن تان را خالی کنید و  اماده شوید که فقط به اسمبلی فکر کنید . فقط اسمبلی . اینطوری  لذت اسمبلی را  حس خواهید کرد .  



لذت اسمبلی در سادگی و خلوص و تمیزی کدهاست . در سادگی و سرعت و قدرت و  هوشمندی و بی عیب بودن و  واضح بودن کدهای برنامه و یکسان بودن سورس و دیس اسمبلی   است .  در اینست که شما با چشم کاملا باز  برنامه می نویسید و هیچوقت  هیچ باگ در برنامه هایتان  ایجاد نمی شود . در اینست که  برنامه نویسی بدون باگ را تجربه کرده و لذت می برید .


لذت اسمبلی در  حرف زدن با سخت افزار است !!


آیا دوست ندارید کنترل پردازنده ی کامپیوترتان را شخصا به دست گیرید و به او دستور بدهید ؟؟؟؟؟


پس با اسمبلی آشتی کنید و از برنامه نویسی با اسمبلی لذت ببرید .




تا بعد .....

+



+




وحید محمدی - وبلاگ وحیدمی


https://vahidmy.blog.ir



https://vahidmy.blog.ir/robots.txt



https://vahidmy.blog.ir/sitemap.xml






بروزرسانی

براثر حملات سایبری به وبلاگ وحیدمی ؛ تمام کامنت های کاربرها و پاسخ های من به کاربرها  ؛ حذف شدند 


لعنت خدا و نفرین ملائکه بر هکرها و اتکرها و مجرمان سایبری . 


تاریخ بروزرسانی 


یکشنبه مورخ  29 مرداد 1402 خورشیدی 


نکته : 

آدرسهای  آخرین پست وبلاگ وحیدمی را در زیر مشاهده می فرمایید . 




در پناه خداوند متعال عظیم الشان باشید 

ِ

الهم  عجل  لولیک الفرج . 



امضای همیشگی اینجانب  در جهت تایید صحت و درستی مطالب وبلاگهایم   : 


وحید محمدی . وبلاگ  وحیدمی 


https://vahidmy.blog.ir





https://vahidmy.blog.ir/archive


https://vahidmy.blog.ir/post/764