بنام خدا
آدرس جدید پست براساس شماره ترتیبی :
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/robots.txt
https://vahidmy.blog.ir/sitemap.xml
بروزرسانی:
براثر حملات سایبری به وبلاگ وحیدمی ؛ تمام کامنت های کاربرها و پاسخ های من به کاربرها ؛ حذف شدند .
لعنت خدا و نفرین ملائکه بر هکرها و اتکرها و مجرمان سایبری .
تاریخ بروزرسانی
یکشنبه مورخ 29 مرداد 1402 خورشیدی
نکته :
آدرسهای آخرین پست وبلاگ وحیدمی را در زیر مشاهده می فرمایید .
در پناه خداوند متعال عظیم الشان باشید
ِ
الهم عجل لولیک الفرج .
امضای همیشگی اینجانب در جهت تایید صحت و درستی مطالب وبلاگهایم :
وحید محمدی . وبلاگ وحیدمی
https://vahidmy.blog.ir/archive
https://vahidmy.blog.ir/post/764