اسمبلی ، اوپن سورس واقعی است .
aaa
Usage: AAA Modifies flags: AF CF (OF,PF,SF,ZF undefined)
Changes contents of AL to valid unpacked decimal. The high order nibble is zeroed.
دستور AAA پرچمهای AF و CF را اصلاح می کند . ( یعنی مقادیر انها را تغییر می دهد . این پرچمها فقط دو رقم باینری یعنی 0 و 1 را می فهمند ) .
(پرچمهای OF ، PF ، SF ، ZF ، در این مورد ، تعریف نشده اند . )
دستور aaa محتویات رجیستر AL را برای اعتبارسازی اعداد دسیمال غیرفشرده ، تغییر می دهد . نیبل ( نیم بایت ) باارزش تر ( یعنی رجیستر AH ) ، برابر با صفر می شود .
ASCII Adjustments
AAA ; 37h [8086]
دستور AAA مستقیما به کد 37 (زبان ماشین در مبنای هگزادسیمال ) ترجمه می شود . در اینجا کد 37 کد زبان ماشین در مبنای هگزادسیمال است که در پردازنده ی 8086 و بالاتر ( پنتیوم و .... ) ذاتا از قبل وجود دارد .
( کد 37 را می توانید با کمک یک هگز ادیتور ، در آدرس مربوطه در شکم فایل اجرایی نرم افزار ، پیدا و مشاهده نمایید . باید به کدهای هگزادسیمال ستون وسط هگز ادیتور نگاه کنید . ) .
می باشد باید بعد از یک دستور ADD تک بایتی بکار رود در جاییکه مقصد ، رجیستر AL می باشد : بوسیله ی بازرسی مقدار نیبل ( نیم بایت ) پایینی رجیستر AL و همچنین پرچم نقلی کمکی AF ، این دستور ( یعنی aaa ) تعیین می کند که آیا دستور جمع (Add) باعث بروز خطای سرریز بافر شده است یا نه ، و اگر چنین خطایی رخ داده باشد آنرا و البته رجیستر CF ( پرچم نقلی ) را تنظیم ( تصحیح ) می نماید .
شما می توانید رشته های طولانی BCD را با انجام زوج دستورهای ADD/AAA روی ارقام پایین با یکدیگر جمع کنید، و سپس با انجام زوج دستورهای ADC/AAA روی هر رقم بعدی نیز این رشته های طولانی BCD را با هم جمع کنید .
BCD یعنی عدد دسیمال که بصورت باینری کدگذاری شده باشد .
توضیح : ببینید خطای سرریز بافر یک خطای رایج در پردازنده ها می باشد که براثر انجام عملیاتهای جمع و تفریق و ضرب و تقسیم فراوان و پی در پی ، ممکن است رخ دهد .
ما امروزه نیز برخی اوقات خطای سرریز را شاهد هستیم .
اینجا دستوراتی همچون AAA و AAD و AAS و AAM به ترتیب ، باعث جلوگیری از بروز خطای سرریز بافر ، بعد از عملیاتهای جمع ، تقسیم ، تفریق و ضرب می شود .
همینجا لازمست بگویم که مدتها پیش در سایت " برنامه نویس " یک ترول پرمدعای لینوکسی که قصد داشت زبان اسمبلی را به کاربران ویندوز یاد بدهد ( غافل از اینکه کاربران ویندوز همگی یک پا کرکر هستند و کمابیش با یکی از کاربردهای اسمبلی آگاه می باشند و با نرم افزارهایی همچون emu8086 و OllyDBG و Masm32 کار کرده اند ) عملا با دانش ناقص اش چیزهایی نوشت که موجب خشم من شد و من در همان انجمن برنامه نویسان به او پاسخ دادم تا جرات نکند بیش از این کاربران ویندوز را تحقیر نموده و بی سوادی خودش را پشت ترمینال لینوکس مخفی کند و جرات نکند علیه زبان اسمبلی دروغگویی نماید .
این ترول لینوکسی که خیال می کرد خدای کامپیوتر است و بدجوری توهم زده بود دو ادعای ابلهانه و البته دو دروغ بزرگ را به زبان آورد :
1- زبان اسمبلی عملگر ضرب ندارد !!!
او مدعی بود که در زبان اسمبلی نمی توان عملوندها را در یکدیگر ضرب کرد و پیشنهاد کرد که عملوندها را پنج مرتبه باهم جمع کنید !!!
2- زبان اسمبلی دستور حلقه و تکرار ندارد !!!!
این ترول پرمدعای بیسواد لینوکسی نمی دانست که دستوراتی همچون LOOP و LOOPE و LOOPZ و LOOPNE و LOOPNZ به عنوان دستورات حلقه و تکرار ، دقیقا برای پاسخ دادن به او و امثال او ، در زبان اسمبلی از دهه های گذشته تا به امروز بکار رفته است .
همچنین او اصلا نمی دانست که دستوراتی همچون MUL و IMUL نیز دستورات ضرب در زبان اسمبلی می باشند و نیازی نیست مثل عقب مانده ها ، بجای ضرب ، از جمع استفاده کنیم !!
البته این دو دستور نیز زیرشاخه هایی برای خودشان دارند و برای تمامی انواع ضرب کفایت می کنند .
مگر می شود زبان اسمبلی که کاملترین زبان برنامه نویسی جهان است عملگر ضرب نداشته باشد ؟؟؟ واقعا خنده دار است .
خدایا با کیا شدیم 85 میلیون نفر ؟؟؟
خدا: با یک مشت ترول بیسواد مغرور پرمدعای لینوکسی که بجز حملات سایبری هیچ کار دیگری بلد نیستند ! بله شما با اینها شده اید 85 میلیون نفر !
+
برای سایر عملهای اصلی همچون تقسیم نیز دستورات Div و IDIV را داریم .
نکته : زبان اسمبلی به کوچکی و بزرگی حروف دستورات ، حساس نیست . اینکه اسمبلر Masm32 در ابتدای کار طوری وانمود می کند که زبان اسمبلی به کوچکی و بزرگی حروف دستورات حساس است به خاطر اینست که این اسمبلر شیطانی و کثیف محصول شرکت مایکروسافت است و با زبان شیطانی و کثیف سی نوشته شده است و چون زبان های سی و سی پلاس پلاس به کوچکی و بزرگی حروف دستورات حساس هستند محصولاتشان نیز به همین شکل ، عقب مانده و کودن می باشند .
اگر از Masm32 و سایر نرم افزارهایی که توسط این دو زبان کثیف یعنی سی و سی پلاس پلاس ساخته شده اند چشمپوشی کنیم سایر کامپایلرهای زبان اسمبلی هرگز به کوچکی وبزرگی حروف دستورات حساس نیستند .
اصولا حساس بودن یک زبان به کوچکی و بزرگی حروف دستورات از نشانه های عقب ماندگی و حماقت آن زبان می باشد .
علاوه بر اسمبلی ، زبان ماشین نیز به کوچکی و بزرگی حروف کدهایش اصلا حساس نیست .
وقتیکه می گویم بجز ماشین و اسمبلی ، سایر زبانهای برنامه نویسی ، جعلی و ساختگی و کودن و عقب مانده هستند یکی از دلایلم همین است .
واقعا خیلی خنده دار است که سیستم به کوچکی و بزرگی حروف یک عبارت یا کلمه حساس باشد و بین حروف کوچک و بزرگ فرق قائل شود . این اصلا هوشمندی نیست بلکه حماقت است .
دقیقا مثل ترمینال لینوکس که او نیز به کوچکی و بزرگی حروف دستورات خط فرمان ، حساس است و بین انها فرق قائل می شود !!!!
در حالیکه سیستم عامل داس و خط فرمان ویندوز هوشمند هستند و می دانند که کوچکی یا بزرگی حروف یک کلمه هیچ تغییری در معنا و مفهوم ان کلمه ایجاد نمی کند لذا هم سیستم عامل داس و هم خط فرمان ویندوز به کوچکی و بزرگی حروف دستورات ، حساس نیستند و می توانید دستورات را هم با حروف کوچک و هم با حروف بزرگ بنویسید و اجرا کنید .
بجز یک مشت ترول هیجانی عقب مانده ی بیسواد عقده ای پرمدعا چه کسی حاضر است با ترمینال کودن لینوکس سروکله بزند ؟؟؟؟؟
در پاسخ به این ترول لینوکس باید عرض کنم که :
برای عملگرهای عجیب و غریب و ناخوانا و مبهم و غیرقابل تایپ زبانهای سی و سی پلاس پلاس نیز ، دستورات پرش شرطی زیر مجموعه ی jcc زبان اسمبلی را از سالها قبل در اختیار داریم که قابل فهم و ساده و قابل تایپ می باشند یعنی بسادگی می توان انها را خواند و نوشت و تایپ کرد . مثل :
je
jne
ja
jna
jg
jng
jz
jnz
jb
jnb
و ....
که این دستورات پرش شرطی زبان اسمبلی ، بعدها توسط دنیس ریچی به اون عملگرهای خفن زبان سی تبدیل شدند !!!
سوال :
مگر می شود که مادر، ( زبان اسمبلی ) ؛ ناقص تر از فرزندان ، ( زبانهای سطح بالا ) باشد ؟؟؟
این تصور کاملا ساده لوحانه است و اینگونه اظهار نظرات غیرکارشناسی نیز کاملا سخیف و جلف و جنگولک بازی است و ناشی از بیسوادی و خام بودن صاحب نظر می باشد .
وقتیکه مادر یعنی زبان اسمبلی، تمام دستورالعملها و عملگرها را به فرزندان خودش یعنی زبانهای سطح بالا ارث داده است پس مسلما طبیعی است که او این دستورات را بصورت ژنتیکی در خودش دارد که اگر نداشت زبانهای سطح بالا از او به ارث نمی بردند .
همه می گویند زبان سی عملگرهایی دارد که هیچ زبانی ندارد و مستقیما می تواند با سخت افزار رابطه برقرار کند !!!!
دوست عزیز ! زبان سی نسخه ی قابل حمل زبان اسمبلی است و البته تمام خواص اسمبلی را هم ندارد بلکه محدود است و دست شما را می بندد و البته هرگز نمی تواند با سخت افزار ارتباط مستقیم برقرار کند و باید از زبان اسمبلی درخواست کند تا او اینکار را برایش انجام دهد چون زبان سی یک زبان سطح بالاست و هیچ ارتباط مستقیم با سخت افزار و کرنل سیستم عامل ندارد . اون عملگرها نیز سالها پیش بطور ذاتی در زبان اسمبلی بوده است . یعنی همین دستورات پرش شرطی . پس زبان سی چیزی به دنیا اضافه نکرده است بلکه چیزهای خوب را از این دنیا حذف کرد و عملا یک زبان ناقص الخلقه و کودن است .
چرا خیال می کنید که اگر زبان برنامه نویسی سی اختراع نمی شد دنیای فناوری اطلاعات و اینترنت و سیستم عاملها اختراع نمی شدند ؟؟؟
مگه سیستم عامل CTSS در اوایل دهه ی 60 میلادی ( حدود سال 1961 میلادی ) بطور کامل ( 100 درصد ) با زبان اسمبلی ساخته نشد ؟؟؟
مگه برخی از قسمتهای حساس سیستم عامل مولتیکس (Multics) در اواسط دهه ی 60 میلادی ( سالهای 1962 تا 1967 میلادی ) بطور کامل با زبان اسمبلی ساخته نشد ؟؟؟
مگه سیستم عامل یونیکس (UNIX) از سال 1968 تا سال 1972 میلادی ، کاملا ( 100 درصد ) با زبان اسمبلی نوشته و ساخته نمی شد ؟؟؟
من از مخاطبین محترم درخواست می کنم که به ویکی پدیا انگلیسی و یا به سایت رسمی سیستم عامل مولتیکس و سایر منابع معتبر خارجی مراجعه کنید تا متوجه شوید که نخستین سیستم عاملهای جهان ، ابتدا در دهه ی 50 میلادی بطور کامل ( 100 درصد ) با زبان ماشین یعنی 0 و 1 و سپس از اوایل دهه ی 60 میلادی تا اوایل دهه ی 70 میلادی بطور کامل ( 100 درصد ) با زبان اسمبلی نوشته شده بودند .
به این آدرسها مراجعه نمایید تا با تاریخچه ی نخستین سیستم عامل ها و زبان برنامه نویسی مورد استفاده آشنا شوید :
توجه داشته باشید از اوایل دهه ی 50 میلادی که آلن تورینگ ، زبان برنامه نویسی اسمبلی را بصورت دستی ، ساخت تا سال 1958 میلادی که اولین کامپایلر رسمی جهان برای زبان فورترن ساخته شد ، برنامه نویسان اسمبلی ، این زبان را بصورت دستی بکار می بردند . ( خود زبان فورترن توسط برنامه نویسان زبان اسمبلی و با کمک زبان اسمبلی ساخته شد . ) .
بنابراین اگر در این ادرسها عنوان شده که نخستین نسخه ی زبان اسمبلی توسط زبان فورترن ساخته شده ، منظورش اسمبلی اتوماتیک و مدرن است نه اسمبلی اصیل و دستی که آلن تورینگ ساخته است .
اسمبلی اتوماتیک و مدرن یعنی اسمبلی مدرن و اتوماتیک و هوشمند و دارای کامپایلر و لینکر یعنی چیزی مثل همین masm یا nasm یا fasm یا RosAsm یا GoAsm یا Gas یا ... که امروزه نیز توسط هزاران نفر از سرتاسر دنیا ، بکار می روند .
اینها اسمبلرهای مدرن و اتوماتیک هستند که امروزه نیز بکار می روند و برخی از اینها خوب و برخی نیز بد می باشند . اسمبلرهای خوب را با رنگ آبی و اسمبلرهای بد را با رنگ قرمز مشخص کردم . اگر اسمبلر متوسط پیدا کنم آنرا با رنگ سبز معرفی می کنم .
(نکته :
در این وبلاگ ( وبلاگ وحیدمی ) ، من چیزهای خوب را با رنگ آبی و چیزهای بد را با رنگ قرمز و چیزهای متوسط و متعادل را با رنگ سبز ، تعیین می کنم . من خودم شخصیتی متعادل و متوسط ( نه خوب و نه بد ) دارم . بنابراین خودم را با رنگ سبز به شما معرفی می کنم !!
اگر در مورد چیزی اطلاع نداشته باشم او را با رنگ مشکی ، مشخص می کنم
آبی = خوب
قرمز = بد
سبز = متوسط
مشکی = بی اطلاعی از ماهیت چیزها و انسانها و پدیده ها و ....
مشکی = بی طرف . بدون نظر . نظر خنثی
)
اسمبلر خوب یعنی هر اسمبلری که توسط خودش یعنی زبان اسمبلی ساخته شده باشد و خودکامپایل و خودمیزبان و خالص باشد و به زبانهای سطح بالا محتاج نباشد مثل Fasm و RosAsm .
اسمبلر بد یعنی هر اسمبلری که توسط زبانهای سطح بالا ساخته شده باشد و به زبانهای سطح بالا ، وابسته و محتاج باشد مثل سایر اسمبلرها ......
ولی در مجموع ، من تمام کامپایلرهای زبان اسمبلی که بعد از زبان فورترن اختراع شدند را اسمبلر متوسط می دانم و با رنگ سبز مشخص کردم که بگویم این اسمبلرها نه کاملا خوب هستند و نه کاملا بد و حالت متوسط دارند !
زبان فورترن از نظر من زبان بدی نیست و البته زبان خوبی هم نیست !!
از نظر من فورترن یک زبان متوسط و نجیب است که باعث شد زبان اسمبلی بتواند از کامپایلر بهره مند شود و عملا برنامه نویسی با اسمبلی را اسانتر و راحتتر کرد .
از این جهت زبان فورترن از نظر من یک زبان متوسط و نیمه خوب است زیرا فورترن عملا هیچ مشکلی با اسمبلی نداشت بلکه اسمبلی دستی آلن تورینگ را به اسمبلی مدرن امروزی تبدیل کرد و البته هرگز زبان اسمبلی را خانه نشین و منزوی و حبس خانگی نکرد .
لذا از نظر من زبان فورترن یک زبان بی آزار و خوب است و با اسمبلی مشکلی ندارد .
لذا من نیز با زبان فورترن مشکلی ندارم . دست اش درد نکند که اسمبلی دستی دهه ی 50 میلادی را به اسمبلی مدرن سال 2021 میلادی تبدیل کرد !!
مجددا تکرار می کنم : منظور من از زبان اسمبلی ، اسمبلی دستی و ساده و خالص و تمیز می باشد که در اواخر دهه ی 40 و اوایل دهه ی 50 میلادی توسط آلن تورینگ به صورت دستی و با کمک زبان ماشین ( 0 و 1 ) ، ساخته شد و به دیگران پیشنهاد شد و کم کم بکار گرفته شد .
بله من نیز قبول دارم که تا قبل از زبان فورترن ، تمامی زبانها از جمله اسمبلی ، کاملا دستی بودند زیرا هنوز هیچگونه کامپایلر اختراع نشده بود ولی این هرگز به معنای این نیست که سابقه ی زبان اسمبلی را به بعد از اختراع زبان فورترن محدود نماییم . خیر . سابقه ی زبان اسمبلی به اواخر دهه ی 40 و اوایل دهه ی 50 میلادی برمی گردد و در ان زمان ، اسمبلی یک زبان برنامه نویسی کاملا دستی بود .
ضمن اینکه خود زبان فورترن توسط گروهی از برنامه نویسان زبان اسمبلی ، در شرکت آی بی ام ، ساخته شد . بنابراین نخستین کامپایلر تاریخ که زبان فورترن می باشد در اصل توسط زبان اسمبلی ساخته شده است . این نکته ی ظریف و جالب ماجراست که باید مد نظر قرار بدهید !
امان از دست این زبان سی که حتی نخستین کامپایلرها و لینکرهای اسمبلی مدرن را با کمک او نوشته اند ( البته بعد از سال 1972 میلادی و نه قبل اش . حواستان را جمع کنید که فریب نخورید . زبان برنامه نویسی سی ، در سال 1972 میلادی اختراع شد . پس این کامپایلرها و لینکرها مسلما به بعد از این تاریخ مربوط می شوند . اگر غیر از این ، چیزی نوشته شده باشد کذب محض است و نباید باور کنید . ساده لوح نباشید ) .
ولی خوشبختانه دو اسمبلر مدرن استاندارد اصیل خالص امروزی یعنی Fasm و RosAsm ، این فاجعه و رسوایی یعنی ، ساخت کامپایلرهای زبان اسمبلی توسط زبان سی ، را جبران کردند .
لازم است همینجا از جناب پروفسور رنه تورنویس خالق RosAsm و پروفسور توماس گریژار خالق Fasm تشکر کنم که آبروی زبان اسمبلی را خریدند و این زبان پاک و خالص و تمیز را از شر زبانهای منحوس سی و سی پلاس پلاس نجات دادند .
به لطف زحمات این دو بزرگوار ؛ زبان اسمبلی برای همیشه از شر زبانهای سطح بالا خلاص شد و سالهاست که توسط خودش ( اسمبلی ) ساخته می شود و عملا ما را به عصر طلایی کامپیوتر یعنی دهه های 30 تا 50 میلادی برمی گرداند .
بگذریم ...
یک نگاه به تاریخچه ی سیستم عاملها بیاندازید :
https://en.wikipedia.org/wiki/Compatible_Time-Sharing_System
http://www.cozx.com/dpitts/ibm7090.html
https://www.multicians.org/thvv/7094.html
مولتیکس ، پدربزرگ تمام سیستم عاملهای مدرن امروزی اعم از داس ، فری داس ، ری اکت او اس ، ویندوز ، مکینتاش و مک او اس ، گنو لینوکس ، یونیکس ، مینیکس ، بی اس دی یونیکس ، نت بی اس دی ، فری بی اس دی ، اوپن بی اس دی ، اندروید ، آی او اس و .... می باشد و هر سیستم عامل مدرن امروزی ، بخشهایی از مولتیکس را به ارث برده است . یعنی تمام سیستم عاملهای مدرن و پیشرفته ی امروزی صرف نظر از نوع معماری و سیستم فایل و فلسفه و لایسنس و .... همگی فرزندان و نوادگان سیستم عامل مولتیکس می باشند !!
البته خود مولتیکس نیز هنوز زنده است و قدیمی ترین سیستم عامل زنده ی جهان ( از سال 1964 میلادی تا سال 2021 میلادی ) محسوب می شود !!
سایت رسمی سیستم عامل مولتیکس (جد تمام سیستم عاملهای مدرن امروزی ):
اما از انجاییکه مولتیکس از زبان اسمبلی بهره ی اندکی برده بود و بسیار سنگین بود و سالها جلوتر از زمان خودش بود ، توسط دنیس ریچی ، ساده و کوچک شد و دنیس ریچی با کمک زبان اسمبلی توانست مولتیکس متورم و بزرگ و سنگین را به یونیکس ساده و بدوی و سریع تبدیل نماید .
به هرحال اگر زبان اسمبلی نبود مولتیکس همان دهه ی 60 میلادی به تاریخ می پیوست و ما امروزه هزاران سیستم عامل ریز و درشت نداشتیم .
بنابراین تمام سیستم عاملها مدیون زبان اسمبلی هستند و این اسمبلی بود که مولتیکس متورم و سنگین و مدرن را به صدها سیستم عامل متوسط و سریع و کوچک و هوشمند تبدیل کرد .
همین الان نیز سیستم عاملهای MenuetOS و KolibriOS و DexOS و TetrOS بطور کامل ( 100 درصد ) با زبان اسمبلی نوشته و تولید می شوند و هنوز هم زنده هستند و شما می توانید فرایند توسعه ی فعال این سیستم عاملها را با چشم خود در سایتهای رسمی شان یا در گیتهاب مشاهده نمایید .
شما از همین وبلاگ وحیدمی یا از گیتهاب می توانید سورس کد ویندوز 2000 پروفشنال را دانلود کنید .
https://github.com/wyrover/windows2000
اگر دقت کنید بخشهایی از سورس کد ویندوز 2000 بطور کامل با زبان اسمبلی ساخته شده بودند .
کی گفته با اسمبلی نمی توان سیستم عامل ساخت ؟؟؟
مگه این چهار سیستم عامل جدید که بطور صد درصدی با زبان اسمبلی ساخته شده اند و نامشان را در بالا بردم ، گرافیکی نیستند و رابط کاربر گرافیکی ندارند ؟؟؟
اگر این سیستم عاملها گرافیکی و مدرن هستند پس چرا با زبان اسمبلی ساخته شده اند ؟؟؟
لابد طراحان این سیستم عاملهای گرافیکی مذکور ، به فاکتورهای مهم طراحی سیستم عامل یعنی سرعت و قدرت و انعطاف پذیری و امنیت و آزادی و هوشمندی و پایداری که فقط توسط زبان اسمبلی قابل پیاده سازی می باشند پی برده بودند که عمدا از زبانهای سطح بالا خودداری کرده و این سیستم عاملهای سریع و کوچک و قدرتمند و ایمن را بطور کامل با زبان اسمبلی ساخته اند . اینها که مازوخیست و خودآزار نیستند که خودشان را اذیت کنند . لابد یک چیزی می دانند که منحصرا از زبان اسمبلی استفاده می کنند .
کی گفته برای ساخت سیستم عامل لزوما باید از زبانهای سطح بالا استفاده کرد ؟؟؟
مگه این گفته ی اشتباه ، وحی منزل است که همه تسلیم اش شده اید ؟؟؟
اگر نمی دانستید بدانید که سیستم عامل یونیکس از حدود سال 1973 میلادی به بعد با زبان سی بازنویسی شد انهم فقط بخاطر ساخته شدن صدها پردازنده ی اضافی و زائد .
نکته ی بسیار مهم :
دنیس ریچی با استفاده از زبان برنامه نویسی قدرتمند اسمبلی ، در سال 1972 میلادی زبان برنامه نویسی سی را اختراع کرد .
بنابراین تا قبل از سال 1972 میلادی ، زبان اسمبلی تنها زبان برنامه نویسی همه منظوره بود .
درواقع هر کامپایلر زبان اسمبلی که توسط زبان سی ساخته شده است به بعد از سال 1972 مربوط می شود و ما اصولا در دهه ی 60 میلادی زبان برنامه نویسی سی را نداشتیم که بخواهیم با ان کامپایلر بسازیم !!
این یک نکته ی انحرافی است که در برخی سایتهای خارجی باید به ان توجه کرد : تمام کامپایلرهایی که مدعی هستند زبان اسمبلی را به دنیا معرفی کرده اند و اینکار را در دهه ی 60 انجام داده اند همگی بجز فورترن و فورث ، دروغگو هستند . زیرا بجز فورترن و فورث ، عملا کامپایلر دیگری در کار نبود که بتواند زبان قدرتمند اسمبلی را به یک زبان اتوماتیک و مدرن تبدیل نماید .
اولین برنامه هایی که با زبان سی نوشته شده اند همگی به دهه ی 70 به بعد مربوط می شوند و هیچکدام به دهه های ماقبل ( قبل از سال 1972 مربوط نمی شوند ) .
این را گفتم که حواستان جمع باشد که با نوشته های دروغین مواجه نشوید یا اگر مواجه شدید گول نخورید . حتی قدیمی ترین کامپایلرها منحصرا با زبانهای اسمبلی و فورترن و فورث ساخته شده اند و اینها هرگز به زبان سی مربوط نمی شوند زیرا زبان سی اصلا در دهه ی 60 میلادی اختراع نشده بود که بخواهد کامپایلر بسازد .
تاکید می کنم که زبان برنامه نویسی سی در سال 1972 میلادی اختراع شد و بنابراین هیچ نقشی در ساخت کامپایلرهای اولیه دهه ی 60 میلادی ( فورترن ، کوبول ، لیسپ ، اسمبلی مدرن ، الگول ، بیسیک ، پاسکال ، فورث ، و ..... ) ندارد . زیرا تمام کامپایلرهای اولیه ، از سال 1958 میلادی شروع به ساخت زبان برنامه نویسی و نرم افزار کردند و در ان زمان ، یعنی دهه ی 60 میلادی ، زبان برنامه نویسی سی هنوز اختراع نشده بود که بخواهد چیزی را اختراع کند .
بنابراین برخلاف تبلیغات دروغین سایتها ، زبان برنامه نویسی سی هرگز پدر فناوری اطلاعات و برنامه نویسی و اینترنت و ... محسوب نمی شود. این فقط یک تبلیغ و شعار است . گول نخورید .
در سایتهای خارجی که در این پست آدرس شان را اوردم ، اگر جایی نوشته شده باشد که نخستین کامپایلر یا لینکر زبان اسمبلی توسط زبان سی و در دهه ی 60 میلادی ساخته شده است بدانید که مطلب کاملا کذب و دروغ است و توسط ترولهای طرفدار زبان برنامه نویسی سی نوشته شده است .
هر نوع کامپایلر یا لینکر زبان اسمبلی که توسط زبان سی ساخته شده باشد مسلما به بعد از سال 1972 میلادی برمی گردد و هرگز به قبل از این تاریخ ( دهه 60 میلادی و قبل از آن ) برنمی گردد . زیرا قبل از این تاریخ ( سال 1972 میلادی ) اصولا زبان برنامه نویسی سی هنوز اختراع نشده بود که بتواند چیزی را بسازد و اختراع کند . حواستان را خوب جمع کنید تا فریب نخورید . در سایتهای خارجی نیز همانند سایتهای ایرانی ، با دروغ های فراوان مواجه می شوید .
اگر ما فقط یک پردازنده ی قدرتمند کامل جهانی را در دهه ی 60 میلادی داشتیم هرگز زبان سی اختراع نمی شد چون همان اسمبلی بود که باعث شد مولتیکس به ان سنگینی به یونیکس سریع و سبک و کارامد تبدیل شود . مگر غیر از اینست ؟؟؟
خود دنیس ریچی آمد و مولتیکس را از اول تا اخر با زبان اسمبلی بازنویسی کرد و نامش را یونیکس گذاشت و همین باعث شد که یونیکس که بطور کامل با زبان اسمبلی ساخته شده بود خیلی زود روی تمام کامپیوترهای دهه ی 60 و اوایل دهه ی 70 میلادی پورت شود و کارایی خودش را که مدیون اسمبلی بود به همگان نشان دهد .
بعد که به واسطه ساخت و تولید بی رویه ی انواع پردازنده های احمقانه و متضاد و ناسازگار ، زبان اسمبلی فرصت نفس کشیدن و رفع خستگی و استراحت نداشت نتوانست جوابگو باشد و اینجا بود که جناب دنیس ریچی دست در آستین اش کرد و یک چیز نورانی بنام زبان برنامه نویسی سی را به دنیا معرفی کرد و یونیکس را در سال 1973 از اول تا به اخر با زبان سی بازنویسی کرد و شد انچه که نمی بایست می شد .
وقتیکه یونیکس موفقیت اش را مدیون زبان اسمبلی است پس اینترنت و سایر فناوریها نیز می توانستند بطور کامل با زبان اسمبلی ساخته شوند اما ساخته نشدند چون هزاران پردازنده ی اضافی و احمقانه و سلیقه ای با معماریهای سلیقه ای و مختلف و متضاد در سرتاسر دنیا پخش و پلا بودند لذا مجبور شدند اینترنت و سایر پروتکل هایش را با زبان سی بسازند تا روی تمام این پردازنده های احمقانه و جورواجور اجرا شود . چاره ای نبود .
هرکس که با ننه اش قهر می کرد می رفت یک پردازنده ی جدید با معماری خفن می ساخت و احساس نبوغ می کرد و کار را بر برنامه نویسان اسمبلی ، دشوار می کرد .
می بینید که این زبانهای سطح بالا و البته شبه سیستم عامل گنولینوکس و البته تضاد در معماری پردازنده های مختلف ، چه بلایی برسر دنیای فناوری اطلاعات و البته بر سر نوجوانان و جوانان این مرز و بوم آورده است ؟؟؟؟
عملا لینوکس به بهانه ی قابلیت حمل ، شما را بصورت نامحسوس و غیرمستقیم از زبان اسمبلی دور می کند . لینوکس هرگز مستقیما علیه زبان اسمبلی حرف نمی زند اما طوری رفتار می کند که خودتان به این نتیجه برسید که بهتر است با اسمبلی خداحافظی کنید تا از قابلیت حمل بهره مند شوید !!!
حالا این قابلیت حمل روی میلیاردها کامپیوتر که امروزه ( و بعد از منسوخ شئن آن پردازنده های غیراستاندارد ) ، همگی فقط پردازنده ی اینتل و معماری و زبان اسمبلی یکسان دارند دقیقا به چه دردی می خورد که من نمی دانم ؟؟؟؟؟
سالهاست که بسیاری از پردازنده های احمقانه ی دهه های 60 تا 90 میلادی نابود شده اند و فقط یک نام از انها باقی مانده است مثل پردازنده های موتورولا ، میپس ، آلفا دک
و ....
مگه روی یک کامپیوتر امروزی ( اعم از دسکتاپ یا سرور یا مین فریم یا ایستگاه کاری ) ، چند نوع پردازنده نصب شده است که از قابلیت حمل حرف می زنید ؟؟؟ خنده دار است .
بگذریم .....
هم زبانهای سطح بالا و هم لینوکس و هم مایکروسافت و هم اپل و هم تولید کنندگان پردازنده های جورواجور و متضاد ، و هم شرکتهای تولید کننده ی نرم افزار و درایور و آنتی ویروس ، همگی دشمن بصیرت و دانایی و قدرت و استقلال و آزادی هستند . همه ی اینها دشمن زبان اسمبلی می باشند .
اوپن سورس یعنی همین زبان اسمبلی یا حتی زبان ماشین .
بگذریم . پرحرفی دیگه بسه . وقت عمل است .
+
+
خب ! این هم یک نمونه برنامه که خود جناب پروفسور رنه تورنویس در زیر دستور AAA نوشته است :
main:
xor eax eax
mov al 00011_0011
add al 7
aaa ; eax =4
ret
برچسب main را من خودم نوشتم و البته دستور ret را نیز خودم اضافه کردم تا برنامه بصورت طبیعی از حافظه خارج شود . چون قرار است این برنامه را بطور واقعی و مستقیم ، در اسمبلر RosAsm نوشته و کامپایل و اجرا نماییم .
دستور ret مخفف return و به معنای بازگشت و مراجعه به محیط سیستم عامل می باشد و باعث می شود که برنامه بطور کامل بسته شود و شما مجددا به محیط سیستم عامل برگردید ( وارد شوید ) .
دستور ret را در پایان تمام روتینها باید بنویسید تا برنامه از حافظه خارج شود و در یک حلقه ی بی نهایت گیر نکند .
در اسمبلر RosAsm نوشتن برچسب main در ابتدای سورس برنامه ، الزامی است .
دستور xor eax,eax محتوای رجیستر eax را کاملا خالی کرده و با صفر برابر می کند یعنی انرا کاملا تمیز می کند تا بتوانیم متغیرهای جدید را به او معرفی نماییم و خطایی رخ ندهد .
من توصیه می کنم در ابتدای سورس تمام نرم افزارهایی که با زبان اسمبلی می نویسید حتما دستور xor eax , eax را بنویسید تا رجیستر eax کاملا خانه تکانی کند و تمیز شود و خطاهای مختلف از جمله سرریز بافر رخ ندهد و سیستم هنگ نکند .
دستور mov al 00011_0011 عدد باینری 0110011 را به درون رجیستر Al کپی می کند .
لازمست بگویم که در اسمبلر RosAsm برای نمایش کدهای هگز از عدد 0 و برای نمایش کدهای باینری از عدد 00 استفاده می شود که ظاهرا راهی ساده و اسان است اما مثلا اینجا خواننده ی مطلب را به اشتباه می اندازد . خصوصا وقتی که بحث از نیم بایت ( نیبل ) باشد . زیرا ممکن است حس کنیم که یکی دو عدد 00 کم یا زیاد نوشته شده است .
دستور add al 7 عدد باینری قبلی را با عدد 7 که بر مبنای دسیمال است جمع می کند .
خب حالا می رسیم به مهمترین دستور این پست : دستور aaa
دستور aaa همانطور که در بالا گفتم ، با ایجاد تعادل در خروجی عملیات جمع ، مانع از بروز خطای سرریز می شود .
همانطور که گفته شد دستور aaa باید بعد از عملیات جمع نوشته شود انهم نه هر عملیات جمع . بلکه فقط ان دسته از عملیات جمع که نتیجه ی عملیات جمع بین دو متغیر ، در رجیستر AL رخ دهد . اینجاست که برای جلوگیری از بروز خطای سرریز در رجیستر AL از دستور aaa استفاده می کنیم .
اما اگر عملیات جمع در مواردی مثل AX یا EAX یا RAX یا سایر موارد غیر 8 بیتی باشد ، نیازی به استفاده از دستور aaa نیست .
نکته : من آزمایش کردم و دیدم اگر بجای AL که یک رجیستر 8 بیتی می باشد از eax که یک رجیستر 32 بیتی است استفاده کنم و از دیباگر RosAsm استفاده نمایم هیچ اتفاق خاصی رخ نمی دهد و فهمیدم که دستور aaa فقط روی بخش 8 بیتی رجیستر eax کار می کند و کاری به بخشهای 32 بیتی این رجیستر ، ندارد . یعنی روی بخشهای 16 بیتی و 32 بیتی هیچ تاثیری ندارد . فقط روی بخشهای 8 بیتی رجیستر eax یعنی رجیسترهای AL و AH تاثیر مستقیم دارد .
لذا می توانم بگویم که استفاده از دستور AAA در همه جا ، الزامی نیست و فقط در موارد خاصی بکار می رود .
درواقع لازم نیست نگران باشید زیرا این دستور فقط روی عملیاتهای جمع رجیستر AL تاثیر می گذارد ودر سایر موارد هیچ کاربردی ندارد و نیازی به استفاده از این دستور نیست .
بنابراین دستور AAA فقط در موارد خاص و ویژه بکار می رود و کاربرد عمومی و همگانی ندارد . یعنی به ندرت استفاده می شود .
+
نکته : در اسمبلر RosAsm استفاده از علامت ویرگول بین عملوندهای مبدا و مقصد ، کاملا اختیاری است . اگر استفاده بکنید هیچ ایرادی ندارد . اگر هم استفاده نکنید باز هم هیچ ایرادی ندارد .
ولی اگر عادت کرده اید که بین عملوندهای مبدا و مقصد ، از علامت ویرگول استفاده نمایید ایرادی ندارد . بهرحال احتیاط شرط عقل است .
در اسمبلر RosAsm همانند سایر اسمبلرها ، برای نوشتن کامنت و توضیح ، باید از علامت نقطه ویرگول ( سیمی کالن ) استفاده نمایید یعنی این علامت ;
چند نکته :
1- من دستورات زبان اسمبلی اینتل را براساس مستندات و منابع آموزشی و ابزارهای اسمبلر RosAsm ، رمزگشایی کرده و آموزش می دهم . لذا شما باید حتما نسخه ی اصلی و اوریجینال اسمبلر RosAsm را از پست قبلی ( دستورات زبان اسمبلی اینتل ) و یا از وبلاگهای اسمبلر یا اسپاسم دانلود و سپس extract نمایید و طبق دستورات مربوطه ، این اسمبلر را پیکربندی نمایید تا بتواند مسیر فایلهای اصلی اش را پیدا نماید و به درستی اجرا شود .
2- من مراحل پیکربندی اسمبلر RosAsm را در وبلاگهای روسسم ، اسپاسم و اسمبلر و البته در وبلاگ وحیدمی ، تشریح کرده ام ولی بازهم محض یادآوری ، مراحل را برایتان بازگو می کنم تا فراموش نکنید و به مشکل برخورد ننمایید .
3- نسخه های جدید اسمبلر RosAsm که از گیتهاب قابل دانلود می باشند با نسخه ی قدیمی و اوریجینال ، سازگار نیستند و پنجره ی debugger را نمایش نمی دهند . لذا من اکیدا توصیه می کنم که شما همین نسخه ی قدیمی و اصیل را بکار بگیرید تا پنجره ی Debugger نمایش داده شود و با کمک این دیباگر بتوانید با دقت مراحل اجرای دستورات زبان اسمبلی را با چشم غیرمسلح و بوضوح ببینید و به اسرار ویندوز خصوصا کرنل ویندوز تا حدودی مسلط شوید .
نکته :
برای تسلط کامل و مستقیم بر تمام اسرار سیستم عامل ویندوز یا هر سیستم عامل دیگری ، باید از زبان ماشین ( هگز ادیتور ) استفاده نمایید .
دیباگر اسمبلر RosAsm ابزاری بسیار مفید برای رمزگشایی زبان اسمبلی و کرنل سیستم عامل ویندوز می باشد . این دیباگر با زبان بی زبانی به شما می فهماند که هر دستور زبان اسمبلی چه کارهایی را در کرنل ویندوز انجام می دهد .
در این مورد شما باید علاوه به نگاه به محتویات رجیستر eax و سایر رجیسترهای عمومی که در تب General دیده می شوند یک نگاه به نوار عنوان بالای پنجره ی دیباگر نیز بیاندازید تا هنگامیکه دارید کلید F7 را فشار می دهید دقیقا متوجه ی بروز یکسری رخدادهای جالب در کرنل ویندوز یعنی فایل ntdll.dll ، شوید !
کرنل = هسته . بخش مرکزی سیستم عامل . مغز متفکر هر سیستم عامل
کرنل ویندوز = فایل ntdll.dll
4- تا اطلاع ثانوی از اجرای مستقیم برنامه های آموزشی در محیط RosAsm خودداری نمایید زیرا همان مراحل دیباگ ، خودش یک فایل exe تولید می کند که من به زودی این فایلهای exe که عملا کار خاصی انجام نمی دهند را همینجا آپلود خواهم کرد .
این فایلها همگی فقط یک فایل نمایشی یا دمو می باشند و جنبه ی کارآموزی دارند .
لذا فعلا کلید F6 را مستقیما فشار ندهید بلکه ابتدا ، نشانگر ماوس را به سمت چپ ویراستار برنامه و درواقع به سمت چپ اولین دستور زبان اسمبلی ، ببرید و کلیک کنید تا یک دایره ی قرمز در حاشیه ی ویراستار برنامه تشکیل شود . بعد از آنکه دایره ی قرمز را در سمت چپ دستور اسمبلی دیدید ، انوقت می توانید کلید F6 را فشار دهید تا پنجره ی debugger باز شود .
سپس کلید F7 را به آرامی فشار دهید و به تغییراتی که در محتویات رجیسترهای پردازنده رخ می دهد با دقت نگاه کنید تا دقیقا متوجه شوید که هر دستور زبان اسمبلی دقیقا چه عملی را انجام می دهد .
اینقدر کلید F7 را فشار دهید تا به دستور ret برسید . روی همین دستور Ret اینقدر کلید F7 را فشار دهید تا پنجره ی دیباگر بسته شود و از برنامه خارج شوید .
نکته : هرگز روی ضربدر پنجره ی دیباگر کلیلک نکنید . اگر نرم افزارتان خودش یک پنجره داشت منحصرا روی ضربدر نوار عنوان همان نرم افزارتان کلیک کنید تا از برنامه خارج شوید . اگر هم نرم افزارتان هیچ دکمه یا منوی خروج نداشت کافیست کلید F4 را که به سیستم عامل ویندوز تعلق دارد فشار دهید تا هم از برنامه و هم از اسمبلر RosAsm خارج شوید و بطور کامل به محیط ویندوز برگردید .
نکته ی ظریف : اگر در برنامه ی بالا یا هر برنامه ی ساده ی کلاسیک دیگه ، کلید F4 را فشار دهید بجای خروج از برنامه ، عملا یک breakpoint ایجاد می کنید و پنجره ی دیباگر نمایش داده می شود و همان دایره ی قرمز بالایی تشکیل می شود !!!
اگر هنگام خروج از اسمبلر RosAsm از شما سوالی مبنی بر ذخیره و کامپایل پرسید به او پاسخ نه بدهید زیرا اگر پاسخ مثبت بدهید پیام خطا صادر می کند !
عملا پس از حتی یکبار فشردن کلید F6 حتی در حالت دیباگ ، نرم افزار کامپایل و تولید اجرا شده است و نیازی به کامپایل مجدد ندارد . پس به این پیام پاسخ ندهید .
اسمبلر RosAsm اگر نرم افزاری را اجرا کند از همان ابتدا در حین اجرا ، او را کامپایل و تولید کرده و فایل exe را نیز ساخته است لذا نیازی به کامپایل مجدد نیست .
درواقع فشردن کلید F6 موجب انجام همزمان چهارعمل اصلی می شود :
1- کامپایل نرم افزار (Compile)
2- بیلد کردن (Build) و تولید فایل exe
3- اجرا کردن نرم افزار (Run)
4- نمایش دادن پنجره ی دیباگر (Debug)
این خاصیت را من تا به حال در هیچکدام از زبانهای سطح بالا و سطح پایین ندیده ام . این یکی از مزایای جالب RosAsm نسبت به سایر زبانها می باشد .
یعنی فقط با یک بار فشردن یک کلید ( کلید F6 ) در اسمبلر RosAsm شما در کسری از ثانیه ، چهار عمل اصلی و مفید را یکجا انجام می دهید !
حالا شما این اسمبلر قدرتمند یعنی RosAsm را با زبانهای پرمدعا مثل سی پلاس پلاس مقایسه کنید که همان کامپایل را نیز با هزار عشوه و ناز انجام می دهند و خیلی وقتها اصلا هیچ غلطی نمی کنند . من بارها شاهد گیرهای احمقانه ی زبان ویژوال سی پلاس پلاس بوده ام و این رفتارهای احمقانه ی این زبان کودن واقعا مرا عصبانی می کرد .
زبانهای سطح بالا واقعا عقب افتاده و کودن هستند زیرا توسط یک مشت عقب مانده ی ذهنی ( امثال دنیس ریچی و ... ) ، طراحی و ساخته شدند .
تنها دانشمند علوم کامپیوتری که لقب نابغه واقعا برازنده ی او می باشد ، آلن تورینگ است که در اوایل دهه ی 50 میلادی ، زبان برنامه نویسی اسمبلی را اختراع و به دیگران معرفی کرد . آلن تورینگ اولین کسی بود که زبان ماشین را به زبانی خواناتر و قابل فهم تر ( اسمبلی) ترجمه کرد و فراگیر نمود یعنی اگر آلن تورینگ ، زبان اسمبلی را اختراع نمی کرد ما الان چیزی به نام کامپیوتر نداشتیم و کامپیوترها همگی بعد از جنگ جهانی دوم به تاریخ می پیوستند . زیرا بجز دانشمندان دهه های 30 و 40 میلادی هیچکس دیگری نمی توانست زبان ماشین یعنی 0 و 1 را بفهمد .
کمااینکه الان نیز در سال 2021 میلادی ، 99 درصد برنامه نویسان دنیا ، زبان ماشین را درک نمی کنند و از این زبان فراری هستند !!!
آن کسی که تمام دنیای فناوری اطلاعات مدیون او هستند آلن تورینگ است نه دنیس ریچی . دنیس ریچی هیچ کار خاصی انجام نداد فقط عوامفریبی کرد و زبان اسمبلی را خانه نشین و منزوی کرد و باعث ایجاد انحصار و استبداد نرم افزاری و کپی رایت احمقانه شد . دنیس ریچی کاری کرد که هیچکس نتواند اسمبلی و ماشین را درک کند . او باعث شد هیچکس اسمبلی را سورس نداند و به دنبال سورس زبان سطح بالا باشد !!!
عامل تمام بدبختیها و مشکلات و باگها و حفره های امنیتی سیستم عاملها و حملات سایبری و مشکلات فنی سیستم عاملها و زبانهای برنامه نویسی ، همین عدم فهم باینری می باشد که دنیس ریچی باعث و بانی این فاجعه می باشد .
اگر دنیس ریچی زبان ابلهانه ی سی را اختراع نکرده بود و یونیکس را تا ابد با زبان اسمبلی توسعه می داد و به درخواستهای سازندگان پردازنده های مختلف بی اعتنایی می کرد و منحصرا برای یک معماری ، و با زبان اسمبلی ، سیستم عامل یونیکس را توسعه می داد ، الان دنیای فناوری اطلاعات و سیستم عاملها دنیایی به مراتب ساده تر و قابل فهم تر و ایمن تر و امن تر و کاربردی تر و زیبا تر بود .
هرچی بدبختی و پیچیدگی و دنگ و فنگ در دنیای کامپیوتر و فناوری اطلاعات می بینیم از طرف زبانهای سطح بالا خصوصا زبانهای سی و سی پلاس پلاس می باشد .
با احیای زبان اسمبلی ، می توان تمام سیستم عاملها و فناوریها را بازنویسی و بازسازی و ساده و قابل فهم کرد و انها را کوچک و تمیز و فشرده و ایمن نمود و مستقیما با پردازنده ی کامپیوتر صحبت کرد و از تمام مشکلات کنونی خلاص شد .
+
+
به بحث اصلی برمی گردم :
داشتم در مورد اجرای چهار عمل اصلی در اسمبلر RoAsm با فشردن تنها یک کلید صحبت می کردم و البته داشتم از خواص جالب دیباگر این اسمبلر بحث می کردم . این خواص جالب را فقط در نسخه ی اصلی و قدیمی این اسمبلر می بینید .
مجددا تاکید می کنم که نسخه ی اصلی و اوریجینال اسمبلر RosAsm را دانلود کنید تا بتوانید تمام این اتفاقات خوب را با چشمان تان ببینید .
لینک دانلود نسخه ی اصلی و اوریجینال اسمبلر RosAsm :
https://bayanbox.ir/download/6764996297506378449/OriginalRosAsm.zip
وبلاگ وحیدمی بعنوان احیاگر زبان اسمبلی در ایران، قصد دارد تا پرده از بسیاری حقایق بردارد و شما را با مکرها و حیله های زبانهای سطح بالا آشنا نماید . البته نه با مقاله نویسی بلکه با کدنویسی . از پست بعد ، صرفا کدنویسی کرده و کدهای زبان اسمبلی را تشریح و رمزگشایی می نمایم . برای احیای زبان اسمبلی ، کدنویسی کفایت می کند . لذا از پست بعد ، دیگه هیچ مقاله ای نمی نویسم .
+
وحید محمدی - وبلاگ وحیدمی