به نام خدا


زبان ماشین یعنی بیت



در اکثر مستندات آموزش زبان اسمبلی یا زبان ماشین متوجه می شویم که نویسنده می خواهد این طرز فکر غلط را  در ذهن مخاطب القا کند که کوچکترین واحد داده در کامپیوتر ،  بایت (byte) است . 


هر بایت معادل با هشت بیت (bit) می باشد .  بیت یعنی ارقام باینری یعنی همان 0 و 1 معروف 


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


بیت ها یعنی 0 و 1 به تنهایی هیچ مفهومی ندارند و در کنار یکدیگر مفهوم و معنا دارند 


بیت به تنهایی قابل محاسبه نیست و کوچکترین واحد اندازه گیری در کامپیوتر ، بایت است 



پروفسور رنه تورنویس خالق روسسم نیز مدعی است که  کوچکترین واحد اندازه گیری در کامپیوتر ، بایت است . ایشان معتقد است که ما فقط زمانی با بیت ها سروکار داریم که بخواهیم روی آنها ماسک بگذاریم . مثلا با دستور xor  یا  or  یا  and


و اما نظر شخصی این بنده ی حقیر :


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


خب اگر به تاریخچه ی کامپیوترها نگاهی بیندازید متوجه می شوید که در دهه های 1930 و  1940 میلادی ، اکثر کامپیوترها بصورت  چهار بیتی یا حتی دو بیتی بودند . 


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


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


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


کار بصورت گروهی و تیمی بود و یک تیم از انسانهای بسیار ریزبین و دقیق و با حوصله  سعی می کردند  بیت به بیت ، برنامه ها را ارزیابی و آزمایش نمایند . 


این دقت بیت به بیت باعث شده بود که کیفیت برنامه های دهه های 1930 تا 1950 میلادی بسیار بالا باشد و کامپیوترها نیز با دقت و ظرافت خاصی ساخته شوند و روز به روز بهتر و سریعتر و قویتر شوند . 


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


کامپیوترها در هر بایت بجای دو بیت ، هشت بیت یا بیشتر داشتند .  زبانهای سطح بالا کار را خراب کردند و توسعه دهندگان سیستم عاملهای دهه های 1960 و  1970 میلادی که خیال می کردند حالا شاخ غول را شکسته بودند و مدام از سیستم عامل کذایی خودشان که اصلا کاربرپسند نبود و بسیار دشوار و پیچیده بود تبلیغ می کردند و حتی این سیستم عامل را از اسمبلی به زبانهای سطح بالای ناقص الخلقه بازنویسی کردند ، ضمن مسخره کردن زبان اسمبلی و تبلیغ بیجا از زبان ابداعی خودشان ، عملا کاری کردند که دقت برنامه نویسان کاهش یافت و کار گروهی کم کم به کار از راه دور و از طریق ایمیل تبدیل شد و این باعث شد که افراد دیگه نتوانند در یک سازمان یا شرکت یا مکان واحد در کنار هم  مشکلات کدها را ببینند و صرفا با ایمیل با هم ارتباط برقرار می کردند و لذا کدهای بسیار بی کیفیت ساختند و صدها سیستم عامل معیوب و ناقص و پر از باگ و غیرقابل تحمل و غیرکاربردی  را ساختند  .


مخلص کلام :


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


ثانیا وقتیکه می خواهیم با زبان ماشین یا اسمبلی کدنویسی کنیم بجای بایت ، باید به بیت فکر کنیم . یعنی دقیقا به سبک دهه های 1940 و 1950  رفتار کرده و برنامه ها را فارغ از مدل کامپیوتر یا سیستم عامل ،  بصورت بیت به بیت بررسی کنیم . 


زبان ماشین یعنی باینری و باینری یعنی زوج ارقام 0 و 1 یعنی دو بیت 0 و 1 را بصورت جداگانه و تک به تک بخوانیم و در نظر بگیریم  . 


اینکه ما عادت کرده ایم از بایت یا حتی واحدهای بزرگتر مثل word  استفاده کنیم یک روش کاملا غلط است که موجب بروز اشتباه و باگ می شود . 


زبان ماشین هرگز بر مبنای هگزادسیمال یا دسیمال یا  اوکتال نبوده بلکه بر مبنای باینری بوده و هنوز هم بر مبنای باینری است یعنی همان بیت . 


بیت یعنی باینری دیجیت یعنی رقم دوتایی . 


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



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


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



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


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


این ثابت می کند که بیت ها یعنی ارقام 0 و 1 زبان  ماشین به تنهایی دارای مفهوم و معنا هستند  . 


لذا  برای افزایش دقت باید سعی کنیم در نرم افزارهایی مثل  c32asm یا  winhex  یا در هر هگز ادیتور دیگری  که در دست داریم  تا جای ممکن با بیت های 0 و 1  سرو کله بزنیم و آنها را آزمایش کنیم . 


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


حتی از دیباگ کردن توابع ویندوز نیز نباید ترسید . باید ریسک پذیر باشید . 


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


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


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


اگر بجای تایپ سریع کاراکترها و بایتها که می تواند باعث بروز مشکل شود ، سعی کنیم آرام آرام تایپ کنیم و تک تک بیت های 0 و 1 را بررسی نماییم شاید بتوانیم جلوی بسیاری از خطاها و باگها و مشکلات امنیتی سیستم را از همان ابتدای کار بگیریم . 


اینطوری می توانیم به خودمان و سایر مردم ثابت کنیم که برنامه نویسی با زبان ماشین یعنی برنامه نویسی بدون باگ . 



برای کار با تک تک بیتها ابزارهای خاصی نیز وجود دارد که می توانید از آنها استفاده نمایید .