وو

وحید آنلاین . آرشیو وبلاگ وحیدمی دات آی آر . شرکت بیان. vahidmy.blog.ir

وو

وحید آنلاین . آرشیو وبلاگ وحیدمی دات آی آر . شرکت بیان. vahidmy.blog.ir

ADD




Assembly is real open source.



add


دستورالعمل ADD ( عملگر جمع در زبان اسمبلی )


Usage: ADD dest,src 


روش بکارگیری :   از چپ به راست : دستور ADD ؛  عملوند مقصد (dest ) ، عملوند مبدا (src)


 Modifies flags: AF CF OF PF SF ZF

دستور ADD  پرچمهای AF و CF و OF و PF و SF و ZF را تغییر می دهد .



Adds 'src' to 'dest' replacing the original contents of 'dest'.

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


نکته : دستور add در زبان اسمبلی با عملگر +  در سایر زبانها مطابقت کامل دارد . درواقع کار این دستور اینست که خیلی ساده ، محتویات درون دو عملوند مبدا و مقصد را با یکدیگر جمع کرده و حاصل جمع  را به درون عملوند مقصد ، ارسال می کند .



Add Integers

 دستور add بعنوان عملگر جمع ، اعداد صحیح را با یکدیگر جمع می کند .






رمزگشایی :

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


1- r و reg  هردو به معنای register ( ثبات - ثبت کننده ) می باشد که منظور همان رجیسترهای درون پردازنده  است .

2- m مخفف memory می باشد . یعنی مکان حافظه یا یک آدرس از حافظه . منظور از حافظه در اینجا می تواند حافظه ی رم باشد زیرا تمام نرم افزارها به محض اجرا به درون حافظه ی رم بارگیری می شوند و پردازنده ، محتویات درون نرم افزار را ازطریق حافظه ی رم می خواند .

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


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


حافظه ی فرعی کامپیوتر شامل نوار مغناطیسی ( شبیه  حلقه های فیلم  دستگاه آپارات که توسط آپاراتچی نصب می شود ) که در دهه های 50 تا 70  میلادی در کامپیوترها بکار می رفته است ) ، کارت پانچ ( شبیه به دستگاه حضور و غیاب در برخی ادارات که باید کارت را سوراخ کرد . کارت پانچ در دهه های 30 تا 50 میلادی  بعنوان قدیمی ترین شکل حافظه ، برای برنامه نویسی با زبان ماشین ، بکار می رفته است . )  ، فلاپی دیسک . هارد دیسک . دیسک جامد . لوح نوری . فلش مموری و سایر انواع حافظه های جانبی می باشد .


نکته ی ظریف : در برنامه نویسی با تمام زبانهای سطح بالا و سطح پایین ( بجز زبان ماشین ) منظور از  حافظه ، همان حافظه ی رم می باشد .

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


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

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


هرچیزی که در سمت راست کاراکتر  ;  نوشته می شود اصطلاحا کامنت یا توضیح  نامیده می شود . به این کاراکتر ،  اصطلاحا سمی کالن ( semicolon = نصف کالن ) گفته می شود  . سمی ( semi ) یعنی نصف .

کالن (Colon) همان علامت دو نقطه یعنی : می باشد .


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


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

ویرگول  یعنی   ،   که در ویندوز از فشردن کلیدهای ترکیبی Shift+T  بدست می آید .


نقطه ویرگول یعنی  ؛   که از فشردن کلیدهای ترکیبی Shift+Y  بدست می آید .


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

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


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


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


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



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


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


بگذریم .....

 




کاراکتر / را می توان بعنوان  " یا "  قلمداد کرد .

مثلا در عبارات زیر منظور از r/m8  این است : رجیستر یا حافظه ی 8 بیتی .


ADD r/m8,reg8   ; 00 /r [8086]


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


دستور add اگر با رجیستر و حافظه ی 8 بیتی سروکار داشته باشد ، پس از کامپایل شدن به کد هگز 00 تبدیل می شود . 

/  یعنی   " یا " 

 این به پردازنده های بسیار قدیمی هشت بیتی اینتل مربوط می شود . مثل پردازنده ی   اینتل 4004   یا هر پردازنده و میکروکنترولر 8 بیتی خانواده ی اینتل .


ولی خب ، می توان انرا روی پردازنده های 16 بیتی و  32 بیتی و 64 بیتی نیز اجرا کرد .


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


در مجموع اگر کد مربوط به  پردازنده های 8 بیتی را نتوانستید روی پردازنده ی 32 بیتی یا 64 بیتی اجرا کنید کاملا طبیعی است .


مثلا در زبان اسمبلی پردازنده ی اینتل 8080  ، دستور nop به جای اینکه به کد هگزادسیمال 90h تبدیل شود به کد هگزادسیمال  00h  تبدیل می شود .


هرچند برای هر دستور زبان اسمبلی اینتل خانواده ی ایکس 86 ( پردازنده های مدرن امروزی ) نیز می توانیم چندین کد زبان ماشین تولید نماییم . اما باید به دنبال صحیح ترین کد باشیم . زیرا برخی از این کدهای هگز عملا مشکلاتی دارند و برنامه را دچار هنگ و کرش می نمایند .


اصولا امروزه در هیچ کامپیوتر نمی توانیم پردازنده ی اینتل 8 بیتی پیدا کنیم زیرا منسوخ شده است .


البته امروزه نیز پردازنده ها و میکروکنترلرهای 8 بیتی اینتل در برخی جاها  مثلا در کنار موتورخانه یا دیزل ژنراتور  یک بیمارستان  هنوز بکار می رود .


برای فهم بهتر این کدها باید از هگز ادیتورها کمک بگیریم . برنامه ی C32asm می تواند به ازای هر کد اسمبلی ،   چندین کد هگز تولید کند . اما شما باید فقط آن کد هگز را که با  انکودر اسمبلر RosAsm یعنی ابزار encoding   مطابق می باشد را در برنامه ی C32asm بکار گیرید . زیرا برخی از کدهایی که برنامه ی C32asm   تولید می کند باعث هنگ کردن سیستم می شوند و خطرناک هستند .


بنابراین  باید از RosAsm  و ابزار Encoding اش کمک بگیریم .


ابزار Encoding اسمبلر RosAsm  را می توانید از منوی Tools  پیدا کنید .


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



اینها بخش کوچکی از اسرار هگز ادیتورها می باشند . دنیای هگز ادیتورها بسیار بسیار وسیع و عمیق و شگفت انگیز است .


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





ADD r/m16,reg16    ; o16 01 /r [8086]


دستور add  اگر با رجیستر 16 بیتی سروکار داشته باشد به کد اوکتال 1601 تبدیل می شود .

حرف o در عبارت بالا مخفف  octal می باشد . اوکتال یعنی اعداد 0 تا 7 که روی هم   8 کاراکتر را تشکیل می دهند . اوکتال یعنی هشت تایی .

/  یعنی   " یا " 




نکته بسیار مهم  :

من شخصا از این عبارات نامفهوم   و مضحک  از قبیل  : دهدهی ، هشت هشتی ، دودویی ، شانزده شانزدهی ؛  متنفر هستم و نمی دانم کدام دیوانه ای این عبارات  احمقانه و جفنگ  را اختراع کرده   و در تمام متون اموزش برنامه نویسی  و در سرتاسر وب و البته در تمام دیکشنری ها  ، رایج کرده است؟؟؟؟



خب چرا مثل بچه ی آدم نمی گویید : ده تایی ، هشت تایی ، دو تایی ، شانزده تایی ؟؟؟


واقعا چه دلیل دارد که یک کلمه را دوبار تکرار می کنید و بدبختانه در تمام متون آموزشی نیز از این کلمات قلمبه سلمبه استفاده می نمایید ؟؟؟ . جای تاسف است .


عبارت دودویی آدم را به یاد ورزش دو میدانی می اندازد !!!


والاه .  یک مشت دیوانه  ، این کلمات احمقانه را باب کرده اند . اینها باید  اصلاح شوند :


بجای کلمه ی مضحک دودویی خیلی راحت بگویید : دوتایی .


بجای کلمه ی مضحک دهدهی ، خیلی راحت بگویید :  ده تایی .


بجای کلمه ی مضحک  شانزده شانزدهی ، خیلی راحت بگویید : شانزده تایی


بجای کلمه ی مضحک هشت هشتی ، خیلی راحت بگویید : هشت تایی .



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




ADD r/m32,reg32   ; o32 01 /r [386]

 دستور add اگر با رجیستر 32 بیتی و حافظه ی 32 بیتی سروکار داشته باشد به کد  اکتال ( هشت تایی )  3201   تبدیل می شود که می توانید با کمک یک هگز ادیتور  این کد را در مبنای اکتال ( هشت تایی )  با چشم ببینید .

حرف o مخفف  octal و به معنای سیستم عددی  هشت تایی می باشد . یعنی اعداد 0 تا 7  .


386  یعنی اینکه این کد فقط روی پردازنده ی اینتل 80386  و بالاتر اجرا می شود و روی پردازنده های پایین تر از 80386  اجرا نمی شود .  بالاتر یعنی جدیدتر و مدرن تر . پایین تر یعنی قدیمی تر .


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



فقط این حرف r  آخری  را هنوز نتوانستم رمزگشایی نمایم !!


/  یعنی   " یا " 






ADD reg8,r/m8 ; 02 /r [8086]

دستور add اگر با رجیستر 8 بیتی و رجیستر/حافظه ی 8 بیتی بکار رود به کد 02 تبدیل می شود .

/  یعنی   " یا "   



ADD reg16,r/m16 ; o16 03 /r [8086]


دستور add   اگر با رجیستر 16 بیتی و  رجیستر / حافظه ی 16 بیتی بکار رود به کد  اوکتال  1603  تبدیل می شود .

/  یعنی   " یا " 



ADD reg32,r/m32 ; o32 03 /r [386]

 دستور add  اگر با رجیستر 32 بیتی و رجیستر / حافظه ی 32 بیتی بکار رود به کد اوکتال 3203  تبدیل می شود .

/  یعنی   " یا " 


ADD r/m8,imm8 ; 80 /0 ib [8086]

دستور  add اگر با  رجیستر / حافظه ی 8 بیتی و  عدد فوری 8 بیتی بکار رود به کد  80 تبدیل می شود .

ib یعنی عدد فوری در اندازه ی بایت

b = بایت

0 = عدد صفر ( البته  احتمالا  همان عدد فوری است که در اینجا صفر می باشد)


/  یعنی   " یا " 



ADD r/m16,imm16 ; o16 81 /0 iw [8086]

دستور add  اگر با رجیستر /حافظه ی 16 بیتی و عدد فوری 16 بیتی بکار رود به کد اوکتال  1681 تبدیل می شود .

iw = عدد فوری در اندازه ی ورد 

w = word

word یعنی دو بایت یعنی 16 بیت

0 = عدد صفر ( البته  احتمالا  همان عدد فوری است که در اینجا صفر می باشد)

/  یعنی   " یا " 


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

هر بایت یعنی 8 بیت .




ADD r/m32,imm32 ; o32 81 /0 id [386]

دستور add اگر با رجیستر /حافظه ی 32 بیتی و عدد فوری 32 بیتی بکار رود به  کد اوکتال 3281  تبدیل می شود .


id  یعنی عدد فوری در اندازه ی دی ورد

دی ورد یا dword یعنی دوتا  ورد یعنی 4 تا بایت یعنی 32 بیت 

d  یعنی double  یعنی دوتایی  دوگانه . دولایه  . دوبرابر . دولا .

dword یعنی 32 بیت .

0 = عدد صفر ( البته  احتمالا  همان عدد فوری است که در اینجا صفر می باشد)

/  یعنی   " یا "  


 

ADD r/m16,imm8 ; o16 83 /0 ib [8086]


b یعنی byte

i یعنی عدد فوری

0 = عدد صفر ( البته  احتمالا  همان عدد فوری است که در اینجا صفر می باشد)

/  یعنی   " یا " 


ADD r/m32,imm8 ; o32 83 /0 ib [386]

b یعنی byte

i یعنی عدد فوری 

0 = عدد صفر ( البته  احتمالا  همان عدد فوری است که در اینجا صفر می باشد)

/  یعنی   " یا "   


 

ADD AL,imm8 ; 04 ib [8086]

b یعنی byte

i یعنی عدد فوری


دستور add اگر با رجیستر AL و عدد فوری 8 بیتی بکار رود به کد 4 تبدیل می شود که احتمالا همان عدد فوری می باشد .




ADD AX,imm16 ; o16 05 iw [8086]

iw  یعنی عدد فوری در اندازه ی Word

word یعنی 2 بایت پشت سرهم

بایت = هشت بیت

بیت =  0 یا 1

دستور add    اگر با رجیستر AX ( که 16 بیتی می باشد ) و عدد فوری 16 بیتی بکار رود به کد اوکتال 1605 تبدیل می شود .



ADD EAX,imm32 ; o32 05 id [386]

id یعنی عدد فوری در اندازه ی دی ورد

دی ورد = دو تا ورد

ورد = دو تا بایت پشت سرهم

بایت = هشت بیت

بیت = 0 و 1

دستور add  اگر با رجیستر 32 بیتی eax  و عدد فوری 32 بیتی بکار رود به کد اوکتال 3205 تبدیل می شود .


 

ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

دستور add  عملیات جمع بین دو عدد صحیح را اجرا می کند . این دستور ، دو عملوند اش را با یکدیگر جمع می کند ، و  باقی می گذارد نتیجه را در عملوند مقصد  ( اولین عملوند از سمت چپ به راست ) . عملوند مقصد ( اولین عملوند از سمت چپ )  می تواند یک رجیستر یا مکان حافظه باشد . عملوند مبدا می تواند یک رجیستر یا یک مکان حافظه یا یک عدد فوری باشد 

 

The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

رجیسترهای پرچم براساس نتیجه ی عملیات ، تنظیم می شوند : بطور خاص ، پرچم انتقال تحت تاثیر قرار گرفته است و می تواند بوسیله ی یک دستور adc  که بعدا می آید بکار گرفته شود .

+


یک مثال از کاربرد دستور add در اسمبلر RosAsm :

 

main:

std        ; set direction flag

Do        ; macro 

mov al bl | and al 0F | add al '0'

On al > '9', add al 7     ; on = macro

stosb | shr ebx 4

Do_Loop             ; Do_Loop = macro

cld     ;  clear  direction flag


ret

نکته : دستوراتی همچون stosb  و  shr را در پست مربوطه تفسیر و تشریح خواهم کرد . انشاء ا...


+

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


+

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




ADC








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



Assembly is real open source



adc


دستور ADC 



Usage: ADC dest,src Modifies flags: AF CF OF SF PF ZF


کاربرد : دستور ADC با  دو عملوند مقصد (dest) و مبدا (src) بکار می رود .

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


استفاده از علامت کاما بین عملوندهای مبدا و مقصد، در اسمبلر RosAm ؛  اختیاری است مگر برای برخی موارد نادر .



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

+

دستور ADC پرچمهای زیر را اصلاح می کند :


 

AF CF OF SF PF ZF




Sums two binary operands placing the result in the destination. If CF is set, a 1 is added to the destination.

دستور ADC ، دو عملوند باینری را با قرار دادن  نتیجه در عملوند مقصد، با خلاصه سازی، با یکدیگر  جمع   می کند . اگر پرچم  CF ( پرچم انتقال ) ، تعیین شده باشد ( یعنی مقدارش برابر با رقم باینری 1 باشد ) ، یک رقم باینری 1 به عملوند مقصد اضافه ( جمع می شود ) .






Add with Carry


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


 


 



ADC r/m8,reg8       ; 10 /r [8086]


r/m8 = 8bits register or memory

reg8 = 8bits register

10/r  = machine code / register




ADC r/m16,reg16      ; o16 11 /r [8086]


 r/m16 = 16 bits register or memory

o16 11 /r = machine code 1611 (octal) or register



ADC r/m32,reg32      ; o32 11 /r [386]



r/m32 = 32 bits register or memory

reg32  = 32 bits register

o32 11 /r  = machine code (octal ) 3211 or register




 



ADC reg8,r/m8 ; 12 /r [8086]


reg8 = 8 bits register

r/m8 = 8 bit register or 8 bit memory

 12 /r = machine code (decimal)  or register 


               


ADC reg16,r/m16 ; o16 13 /r [8086]


reg16 = 16 bits register

r/m16  = 16 bits  register  or memory

o16 13 /r = machine code 1613 ( octal) 


          


ADC reg32,r/m32 ; o32 13 /r [386]




 



ADC r/m8,imm8 ; 80 /2 ib [8086]


imm8 = 8 bits immediate

80 = machine code

ib = immediate  . 2 bytes



نکته : بدلیل عدم وجود هرگونه توضیح در مستندات اسمبلرهای مختلف و سایتهای ایرانی و خارجی ، عمل رمزگشایی از این عبارات کار بسیار بسیار دشواری برایم بود .

همینجا اعتراف می کنم که به دلیل همین عدم وجود مستندات کافی ، مرتکب اشتباه شدم . زیرا حرف b را به binary تفسیر کردم که اشتباه بود . حرف b بعد از ایمدیت ، مخفف byte بود .

مثلا در عبارت بالا   ib یعنی ایمدیت از نوع بایت . عدد 2 نیز یعنی دوتا عدد ایمدیت که هرکدام 2  بایت اندازه دارند . 

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

           



ADC r/m16,imm16 ; o16 81 /2 iw [8086]


w = word






ADC r/m32,imm32 ; o32 81 /2 id [386]


d = dword 



 



ADC r/m16,imm8 ; o16 83 /2 ib [8086]


ADC r/m32,imm8 ; o32 83 /2 ib [386]




 



ADC AL,imm8 ; 14 ib [8086]


ADC AX,imm16 ; o16 15 iw [8086]


ADC EAX,imm32 ; o32 15 id [386]




 



ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

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

عملوند مقصد می تواند یک رجیستر یا مکان حافظه باشد . عملوند مبدا می تواند یک رجیستر یا مکان حافظه یا یک مقدار فوری ( ایمدیت ) باشد .



 


The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

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



 


To add two numbers without also adding the contents of the carry flag, use ADD.

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

+


سورس برنامه قابل اجرا در RosAsm :



 


main:



xor eax  eax     ; eax =0


stc        ; set carry flag to 1b . b = binary


mov eax 10     ; eax = 10d =0Ah . 

                          ; d= decimal .        

                       ; h=hexadecimal


mov ebx 5      ; ebx = 5d


adc   eax ,  ebx               ; eax = 16d = 1Ah


ret






AAD


 Assembly is real open source





aad



دستور aad




Usage: AAD Modifies flags: SF ZF PF (AF,CF,OF undefined)


کاربرد : دستور AAD  محتویات پرچمهای SF و ZF و PF را تغییر می دهد . پرچمهای AF و CF و OF  تعریف نشده اند  .


Used before dividing unpacked decimal numbers. Multiplies AH by 10 and the adds result into AL.



دستور AAD ، قبل از تقسیم اعداد دسیمال غیربسته ای بکار می رود . دستور AAD مقدار درون رجیستر AH را در 10 ضرب می کند و حاصلضرب را با مقدار درون رجیستر AL ، جمع می کند .




Sets AH to zero.


مقدار درون رجیستر AH  را صفر می کند . ( رجیستر را کاملا خالی می کند) .


ASCII Adjustments



 تعدیل کنندگان اسکی .



AAA ; 37 [8086]


قبلا در پست AAA بطور مفصل معرفی شده است . به پست AAA مراجعه فرمایید . 



 



AAS ; 3F [8086]


قبلا در پست AAS معرفی شده است . به پست AAS مراجعه فرمایید . 



 



AAD ; D5 0A [8086]




AAD imm ; D5 ib [8086]








AAM ; D4 0A [8086]


AAM imm ; D4 ib [8086]


دستور AAM قبلا در پست AAM  معرفی شده است . به پست AAM مراجعه فرمایید . 



 

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


These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see DAA.



 


AAA (ASCII Adjust After Addition) should be used after a one-byte ADD instruction whose destination was the AL register: by means of examining the value in the low nibble of AL and also the auxiliary carry flag AF, it determines whether the addition has overflowed, and adjusts it (and sets the carry flag) if so. You can add long BCD strings together by doing ADD/AAA on the low digits, then doing ADC/AAA on each subsequent digit.



 


AAS (ASCII Adjust AL After Subtraction) works similarly to AAA, but is for use after SUB instructions rather than ADD.



 


AAM (ASCII Adjust AX After Multiply) is for use after you have multiplied two decimal digits together and left the result in AL: it divides AL by ten and stores the quotient in AH, leaving the remainder in AL. The divisor 10 can be changed by specifying an operand to the instruction: a particularly handy use of this is AAM 16, causing the two nibbles in AL to be separated into AH and AL.



 


AAD (ASCII Adjust AX Before Division) performs the inverse operation to AAM: it multiplies AH by ten, adds it to AL, and sets AH to zero. Again, the multiplier 10 can be changed.


دستور AAD ( مخفف تنظیم اسکی در رجیستر AX قبل از عملیات تقسیم ) عملیاتی معکوس با دستور AAM اجرا می کند : دستور AAD مقدار درون رجیستر AH را در عدد 10 ضرب می کند ، سپس نتیجه را به مقدار درون رجیستر AL اضافه ( جمع ) می کند ، و مقدار درون رجیستر AH را صفر ( خالی ) می کند . مجددا عدد 10 که مضروب فیه می باشد می تواند تغییر کند .


+

سورس برنامه در اسمبلر RosAsm :




 


main:



xor eax eax   ; eax = 0 . ah = 0


mov ah 5      ; ah = 5d


aad               ; eax = 32h = 50d


ret                ; return to RosAsm or OS


AAM





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




My Placard:   Assembly is real open source .






aam



دستور AAM



Usage: AAM Modifies flags: PF SF ZF (AF,CF,OF undefined)



کاربرد : دستور AAM مقادیر درون پرچمهای PF و SF و ZF را تغییر می دهد .


پرچمهای AF و CF  و OF  ، در اینجا تعریف نشده اند .


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

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


توجه داشته باشید که  تفکر زبان ماشین،  یک تفکر سیاه و سفید ( صفر و یک )  است و چیزی بنام خاکستری در منطق و قاموس زبان ماشین وجود ندارد .


درواقع زبان ماشین یا پردازنده  تفکر صفر و یکی دارد  .


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



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


فقط بدانید که تمام رجیسترها اعم از رجیسترهای عمومی و همه منظوره (eax  و ebx و ecx و edx و esp  و ebp  و  esi و edi  ) و رجیسترهای پرچم که همگی پسوند F را در نام خود دارند درواقع بخشهای فیزیکی پردازنده محسوب می شوند و بطور فیزیکی و واقعی در درون ساختمان پردازنده قرار دارند یعنی اگر پردازنده ی کامپیوتر را بشکافیم می توانیم تمام این رجیسترها را با چشم ببینیم .


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


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

لذا به همین دلیل بسیار ارزشمند و گران قیمت می باشند . و البته بخش اصلی پردازنده می باشند اما با سایر بخشهای اصلی و مهم  پردازنده یعنی واحد  محاسبات و منطق  (ALU) و بخش کنترل پردازنده (CU) که مغز متفکر پردازنده می باشد  تفاوتهای اساسی دارند زیرا برنامه نویس زبان اسمبلی قادر به دسترسی به بخش مرکز فرماندهی پردازنده نیست .


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


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


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


برخی از رجیسترها نیز غیرقابل دسترس هستند و برنامه نویس زبان اسمبلی تحت  هیچ شرایطی نمی تواند به انها دسترسی داشته باشد .


برنامه نویس زبان اسمبلی منحصرا با رجیسترها سروکار دارد و همین رجیسترها تمام نیازهای او را مرتفع می نمایند .



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


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


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


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


حتی هکرهای حرفه ای نیز قادر به دسترسی به این بخشها نیستند .


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


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


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


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


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


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


+





AH := AL / 10 AL := AL mod 10  



مقدار درون رجیستر AH از تقسیم محتویات رجیستر AL بر عدد 10 بدست می آید .

مقدار درون رجیستر AL از باقیمانده ی تقسیم محتویات رجیستر AL بر عدد 10 ،  بدست می آید .




Used after multiplication of two unpacked decimal numbers, this instruction adjusts an unpacked decimal number. The high order nibble of each byte must be zeroed before using this instruction.



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



AAM     ; D4 0A     [8086]


دستور AAM  در پردازنده های  8086 و بالاتر ( پنتیوم ، سلرون ، کور و ...  ) به کد هگزادسیمال D40A تبدیل می شود . برای دیدن این کد ، از یک هگز ادیتور (hex editor) استفاده نمایید .



AAM imm    ; D4 ib    [8086]



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


برای آشنایی دقیق با مفهوم عبارات imm و  ib  و عدد فوری ،  به پست  AAS  مراجعه فرمایید .



AAM (ASCII Adjust AX After Multiply) is for use after you have multiplied two decimal digits together and left the result in AL: it divides AL by ten and stores the quotient in AH, leaving the remainder in AL. The divisor 10 can be changed by specifying an operand to the instruction: a particularly handy use of this is AAM 16, causing the two nibbles in AL to be separated into AH and AL.

دستور AAM ( مخفف عبارت تنظیم اسکی در رجیستر AX بعد از عملیات ضرب ) برای بکارگیری در مواردیست که شما دو رقم دسیمال را در یکدیگر ضرب کرده اید و رها کرده اید نتیجه را در رجیستر AL  : دستور AAM  تقسیم می کند محتوای درون رجیستر AL را بر عدد 10 و نگهداری می کند باقیمانده را در رجیستر AH ، از طریق رها کردن باقیمانده ی تقسیم در رجیستر  AL . عدد 10 که در اینجا مقسوم علیه می باشد ممکن است تغییر کند با تخصیص یک عملوند به دستورالعمل : یک کاربرد خصوصا دستی از این ، دستور AAM 16  می باشد ، که باعث می شود دو نیم بایت موجود در رجیستر AL  بین رجیسترهای AL و AH تقسیم شود .

یعنی هرکدام از این دو رجیستر 8 بیتی ، یکی از این دو نیم بایت را در خود نگهداری نماید .

+

+

نمونه ی برنامه ی قابل اجرا در RosAsm :




main:


xor  eax  eax     ; eax = 0 . al = 0 . ah = 0


mov  al  15        ; al = 15d =0Fh


aam                  ; eax = 261d = 105h


ret



نکته : بعد از کپی کردن این سورس به درون اسمبلر RosAsm و فشردن کلید F4  و تشکیل دایره ی قرمز و سپس فشردن کلید F6  ،  اسمبلر از شما می پرسد آیا می خواهید این برنامه را که هیچگونه تابع API ندارد را کامپایل کنید ؟؟

اینجا شما جواب مثبت می دهید . به محض اینکه جواب مثبت دادید برنامه به  حالت دیباگ می رود و پنجره ی دیباگر آشکار می شود .


بعد که شما با فشردن مکرر کلید  F7 روی دستور  Ret  از برنامه خارج شدید و حالا  می خواهید از خود اسمبلر نیز خارج شوید مجددا یک پیام مبنی بر عدم ذخیره ی سورس کد و نیاز به کامپایل صادر می شود . اگر شما از قبل ، سورس کد نرم افزار را با فشردن کلیدهای ترکیبی CTRL+S  ذخیره کرده باشید  نباید پاسخ مثبت به این پیام دهید و باید به این پیام بی اعتنایی کنید .

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


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


+

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

+

نکته : توجه داشته باشید که هر عبارت که در سمت راست علامت سیمی کالن ( یعنی علامت ; )   قرار دارد اصطلاحا  کامنت یا توضیح نامیده می شود و نوشتن این عبارات کاملا اختیاری است و کامپایلر انها را نادیده می گیرد .


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


+

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

+

نکته ی مهم :

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

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


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


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


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


شعار من ( که روی یک پلاکارد نوشته شده است )  :  اسمبلی ، اوپن سورس واقعی است .


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


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


دیس اسمبلی = سورس کد


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


+

+

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


https://vahidmy.blog.ir







AAS







Assembly is real open source



aas


Usage: AAS Modifies flags: AF CF (OF,PF,SF,ZF undefined)





کاربرد : دستور AAS  پرچمهای  AF ( پرچم نقلی کمکی )  و CF  ( پرچم نقلی ) را اصلاح می کند . ( یعنی مقادیر درون شان را که ممکن است 0 یا 1 زبان ماشین باشد تغییر می دهد )


( پرچمهای  OF  و PF و SF  و  ZF  ، تعریف نشده اند . یعنی این دستور روی این پرچمها که درواقع  مابقی رجیسترهای پرچم می باشند  تاثیری ندارد . )







Corrects result of a previous unpacked decimal subtraction in AL. High order nibble is zeroed.




دستور AAS   نتایج  یک عملیات تفریق غیرفشرده دسیمال را در رجیستر AL  تصحیح می کند و خروجی این دستور در همان رجیستر AL  اعمال می شود .  نیم بایت بالایی برابر با صفر می شود .




( نکته : من برای جلوگیری از بروز اشتباه ، سعی می کنم اصل متن که به زبان انگلیسی می باشد را همراه با ترجمه ی تحت الفظی  ، در وبلاگ ام بیاورم . اینطوری اساتید محترم رشته ی مهندسی کامپیوتر می توانند اگر ایراد یا اشکالی در ترجمه دیدند در سایتها یا وبلاگهای خود ، نوشته های مرا نقد و بررسی نمایند و ایرادات کار مرا در آنجا بیان کنند  تا من بعدا با مراجعه به وبلاگها و سایتهای اساتید محترم ،  اشتباهات خودم را تصحیح نمایم .  به هرحال من فقط یک  تایپیست ساده و عادی هستم و تحصیلات دانشگاهی ندارم لذا ممکن است  در نوشته های من ایراد یا خطایی وجود داشته باشد که خودم بی خبر باشم . از تمام اساتید دلسوز  و محترم رشته ی مهندسی کامپیوتر  که خطا یا ایراد در کار این بنده ی حقیر می بینند درخواست می کنم که در سایت یا وبلاگ خودشان خطاها  یا ایرادات فنی  مربوط به اصل موضوع یا ترجمه  را  ذکر کرده و روشهای تصحیح خطا را نیز بیان کنند و تنها به نقد اکتفا ننمایند . یعنی راه حل را نیز به من نشان دهند . من اگر وقت داشته باشم حتما به سایتها و وبلاگهای تخصصی  سر می زنم تا اگر در جایی اشتباهی کرده باشم با استناد به مطالب سایتهای تخصصی ، اشتباهات خودم را تصحیح نمایم .  )





ASCII Adjustments


تعدیلات اسکی

( دستورات تعدیل کننده و تنظیم کننده ی کدهای اسکی )




AAA                     ; 37h                                  [8086]





تعدیل مقادر درون رجیستر AL بعد از عملیات جمع ( بعد از دستور ADD )  و اعمال کردن این تعدیلات در  داخل خود رجیستر AL .

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





 

AAS                      ; 3Fh                                                      [8086]





تعدیل نتایج بعد از عملیات تفریق بعد از دستور  SUB .  نتیجه ی عملیات ناشی از تفریق توسط دستور AAS تنظیم و تعدیل شده و سپس به درون رجیستر AL  کپی می شود .

اینجا نیز رجیستر AL بعنوان  عملوند مقصد ، رفتار می کند .


نکته : دستور  AAS  بعد از اسمبل شدن توسط کامپایلر زبان اسمبلی ، به کد 3F که کد زبان ماشین در مبنای هگزادسیمال است تبدیل می شود که شما می توانید این کد زبان ماشین را با کمک یک هگز ادیتور ، در آدرس مربوطه ، در فایل اجرایی نرم افزار ، مشاهده نمایید .


نکته : در حالت کلی ، در زبان برنامه نویسی اسمبلی و فارغ از هر نوع کامپایلر ،  کدهای هگزادسیمال زبان ماشین را با حرف h ( مخفف hex )  مشخص و تعریف می کنند . البته اگر این کدها با یکی از حروف A  تا  F  شروع شده باشند باید یک عدد 0 ( صفر ) را به ابتدای این کدها اضافه کرد .


نکته :


هگز یا hex  به معنای شش می باشد .


هگز =  حروف A   تا   F   که روی هم  شش حرف زبان انگلیسی می باشند .


دسیمال به معنای 10 تایی  ( ده تایی )  می باشد

دسیمال = اعداد 0 تا 9   

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



هگزادسیمال =  6 + 10 = 16 

هگزادسیمال یعنی شانزده تایی یعنی اعداد 0 تا 9 و حروف A  تا  F 



نکته : زبان ماشین به کوچکی و بزرگی حروف کدهایش ( کدهای 00 تا   FF  هگزادسیمال )  حساس نیست لذا بین ff و  FF هیچ  فرقی قائل نمی شود زیرا هردو به معنای 11111111   در مبنای باینری می باشند و برای پردازنده هیچ فرقی نمی کند که کد باینری 11111111  بواسطه ی  ff  ایجاد شود یا  FF  .


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


نکته ی  جالب :


کدهای هگزادسیمال   و دسیمال  و  اوکتال ،    ذاتا فقط  اسامی مستعار برای دسته هایی از بیتها ( 0 و 1 )   می باشند و در نتیجه ، زبان ماشین در حقیقت همان باینری یعنی 0 و 1 است  و فقط همان 0 و 1  را می فهمد . 


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



سیستمهای دسیمال و هگزادسیمال و اکتال توسط ما انسانها و برای سهولت فهم زبان ماشین و جلوگیری از بروز خطا ، اختراع شده اند وگرنه پردازنده بجز باینری ( 0 و 1 ) هیچ چیز دیگری را اصلا و ابدا  نمی فهمد و درک نمی کند .


اما پردازنده ها دارای ابزارها و سیستم های رمزگشا هستند  که این سیستمهای سه گانه را به باینری ترجمه می کند و البته از ان  جالبتر اینکه  در پردازنده ها یک ابزاری وجود دارد که  کدهای باینری را به جریانات برق مستقیم  ( برق  DC  یا همان برق باتری  )  ترجمه می کند . چون کامپیوتر یک ابزار برقی می باشد و همانند سایر لوازم برقی فقط دو حالت روشن ( 1 )  و خاموش ( 0 ) را می فهمد .

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


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


البته این مراحل می تواند با یا بدون حضور سیستم عامل انجام شود 


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


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



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


همین الان که دارم این مطالب را تایپ می کنم هرچیزی که تایپ می شود پاسخی است که پردازنده به  من نمایش می دهد !!



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


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


نکته ی مهم :

پردازنده ی کامپیوتر ، هرگز ارقام باینری را بصورت مجزا ( بیت 0 یا 1  ) نمی خواند بلکه در دسته های 8 تایی می خواند  یعنی 8 تا بیت 0 یا 8 تا بیت 1 یا ترکیبی از این دو رقم  0 و 1  .  مگر اینکه با کمک دستورات منطقی مثل and و  or و  XOR   و ...  بر روی برخی بیتها  (  0 یا 1  ) ماسک و نقاب بگذاریم . انوقت است که می توانیم مستقیما با تک تک بیتها  کارهای جالب و بامزه انجام دهیم و پردازنده اینکارهای جالب را برای ما  انجام می دهد  .



کدهای باینری زبان ماشین را  با حرف b  ( مخفف binary  )   مشخص و تعیین می نمایند .  باینری یعنی دوتایی یعنی 0 و 1  .


برای کدهای اکتال ( هشت تایی )  زبان ماشین نیز از حرف  o  ( مخفف octal  )  استفاده می نمایند .


کدهای زبان ماشین اگر بر مبنای دسیمال ( ده تایی  یا همان اعداد معمولی  بین 0 تا 9 ) باشند  معمولا با حرف d  ( مخفف  decimal )  مشخص می شوند یا اینکه اصولا از هیچ حرفی استفاده نمی شود  که در اکثر مواقع ، کدهای دسیمال را بصورت برهنه و بدون هرگونه پیشوند یا  پسوند می نویسند که البته بهتر است از اینکار پرهیز شود تا خوانایی کد بیشتر شود و کار کامپایلر زبان اسمبلی نیز اسانتر شود .



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


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


مثلا بهتر است بجای عدد 10  از کد   هگز  0A استفاده نماییم تا در خروجی یعنی دیس اسمبلر نیز کد مربوطه را به سادگی بتوانیم پیدا کنیم . 


پیشنهاد من اینست که اصولا از نوشتن اعداد در  مبنای  دسیمال یا اوکتال خودداری نماییم و مثلا عدد 10 را که دسیمال می باشد بصورت  0A و  عدد  11  را بصورت  0B  یعنی در مبنای هگزادسیمال بنویسیم تا اینطوری پیدا کردن این اعداد در هگز ادیتور  ، آسانتر و ساده تر باشد و ضمنا اینطوری بعد از مدتی تنها با یک نگاه ، می توانیم کدهای هگزادسیمال زبان ماشین را بهتر درک کنیم .


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


این ترفند مقدمه ای برای ورود به دنیای شگفت انگیز هگز ادیتورها و رمزگشایی زبان برنامه نویسی ماشین خواهد بود .


اینطوری بعد از تسلط بر زبان اسمبلی ، می توانیم خیلی زود بر زبان ماشین نیز مسلط شده و مستقیما با هگز ادیتور اقدام به برنامه نویسی نماییم .



هدف نهایی وبلاگ وحیدمی اینست که روش برنامه نویسی با زبان ماشین و با کمک هگز ادیتور را به شما آموزش دهد و اسرار جذاب هگزادیتورها را به شما  اعلام کند .

 

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


البته هگز ادیتور یک نرم افزار همه منظوره است و مثلا برای ساخت فایلهای PDF یا php یا  html  یا  ASP یا jpg یا  png  یا   PSD  یا  RTF  یا  ICO  یا  BMP  یا .......   نیز می توانیم از هگز ادیتور استفاده نماییم !  فقط کافیست بر معماری فایلهای مختلف مسلط شویم .

به محض تسلط کامل بر معماری انواع و اقسام فایلها ، براحتی می توانیم این فایلها را با کمک هگز ادیتور و بصورت کاملا دستی ، بسازیم و لذت ببریم .






AAD                     ; 0D50Ah                                [8086]





دستور AAD عدد اسکی را قبل از عملیات تقسیم ، تعدیل کرده و نتیجه را به درون رجیستر AX ارسال می کند .


نکته : همانطور که در بالا گفته شد اگر کد هگزادسیمال زبان ماشین با یکی از حروف A تا F شروع شود باید حتما قبل از آن یک  عدد صفر  را به سمت چپ کد هگز بیاوریم و سپس یک حرف h را به سمت راست کد هگز اضافه می نماییم .  لذا کد هگز  D50A را به شکلی که در بالا می بینید  تبدیل می کنیم .


البته اسمبلر RosAsm  به این استاندارد بین المللی ایراد می گیرد و معتقد است که برای معرفی کدهای هگز کافیست یک عدد صفر  و برای معرفی اعداد باینری  دو عدد صفر  را به سمت چپ آنها اضافه نمود .


البته با کمک  pre parser ( پیش تجزیه گر ) ، می توانیم گرامر اسمبلی استاندارد بین المللی را به درون RosAsm   بیاوریم  .


اسمبلر  RosAsm  دارای چندین  پیش تجزیه گر ( پری پارسر ) می باشد که با کمک آنها می توانیم کارهای جالبی انجام دهیم از جمله شبیه سازی گرامر زبانهای سطح بالا یا  گرامر اسمبلرهای معروف مثل masm و  fasm  یا  nasm   .


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


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


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


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


باید حتما تحصیلات آکادمیک و مهارتهای تخصصی داشته باشیم تا بتوانیم کارهای یک مهندس را شبیه سازی کنیم .




ادامه ی رمزگشایی !!!



8086 هم یعنی پردازنده ی اینتل 8086 و فرزندان اش ( 80186 - 80286 -80386 -80486 -80586-   80686  - پنتیوم - سلرون - کور - زئون  ) 

درواقع تمام پردازنده های اینتل که برروی مادربورد کامپیوترهای ما قرار دارد از نسل 8086 می باشند و دستورات زبان اسمبلی یکسان دارند و در نتیجه تمام این دستورات باید روی اکثر پردازنده های خانواده ی اینتل  بخوبی اجرا شود .









AAD imm                 ; 0D5    ib                               [8086]





همان دستور  AAD است که البته قبل از یک عدد فوری می آید . عدد فوری یا  immediate  به هر نوع عدد گفته می شود که بعد از یکی از دستورات زبان اسمبلی می  آید .  imm  یعنی  immediate   یعنی عدد فوری و بلافاصله .



مثلا در دستور  int 10     یا دستور  ret 16  و دستوراتی شبیه به اینها ، به این اعداد 10 یا 16  اصطلاحا  ایمدیت ( فوری ) گفته می شود.  اینها اکثرا کدهای دسیمال زبان ماشین می باشند .


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


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


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


البته ایشان در معرفی کردن رجیسترهای پردازنده ی اینتل ، نیز به شدت سهل انگاری نموده است و عملا طبق اعترافات خودش ، تمامی مستندات اسمبلر RosAsm را از بازنویسی اسمبلر معروف  Nasm   الهام گرفته است ولی خب آثار سهل انگاری در نوشته های ایشان دیده می شود .خصوصا اینکه ایشان فرانسوی می باشند و زبان انگلیسی شان ضعیف است لذا نتوانسته به خوبی از رفرنسهای معروف  و فراوان زبان اسمبلی  ،  در اسمبلر RosAsm  استفاده نماید  .


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


 



AAM           ;    0D40Ah        [8086]





تنظیم خروجی اعداد اسکی ( دسیمال ) بعد از عملیات ضرب و اعمال کردن خروجی نهایی به درون رجیستر  AX  . 

دستور  AAM بعد از  عملیات کامپایل ، به کد هگز  D40A تبدیل می شود . در مورد  پیشوندها و پسوندهای مربوط به کدهای هگز ، در بالای همین پست توضیح دادم  . 








AAM   imm      ;    0D4h   ib     [8086]


همان دستور AAM اما با یک عدد فوری از جنس باینری .


 



These instructions (AAA, AAS, AAD ,AAM) are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see DAA.



این دستورات (AAA  و AAS و AAD  و  AAM  ) ، در ارتباط با دستورات مربوط به عملیاتهای جمع ، تفریق ، ضرب و تقسیم بکار گرفته می شوند تا محاسبات مربوط به اعداد دسیمال کدگذاری شده ی باینری را در شکل  BCD ( یک رقم BCD برای هر بایت - این شیوه ی کدگذاری از دسیمال به باینری ، برای ترجمه به / از اسکی ، بواسطه ی نام دستورالعمل  )   اجرا نمایند . همچنین دستورالعملهای BCD فشرده یعنی DAA و DAS  نیز وجود دارند :  دستور DAA را ببینید .


 


AAA (ASCII Adjust After Addition) should be used after a one-byte ADD instruction whose destination was the AL register: by means of examining the value in the low nibble of AL and also the auxiliary carry flag AF, it determines whether the addition has overflowed, and adjusts it (and sets the carry flag) if so. You can add long BCD strings together by doing ADD/AAA on the low digits, then doing ADC/AAA on each subsequent digit.



 دستور AAA  را در پست  AAA  توضیح دادم . به پست قبلی با عنوان AAA مراجعه نمایید .





AAS (ASCII Adjust AL After Subtraction) works similarly to AAA, but is for use after SUB instructions rather than ADD.


دستور AAS  ( تنظیم نتایج اسکی در رجیستر AL بعد از عملیات تفریق )  شبیه به دستور AAA کار می کند ، اما برای بکارگیری بعد از دستور SUB ( تفریق)  بکار می رود نه  دستور ADD ( جمع )  .

برای کشف عملکرد دستور AAS به پست AAA مراجعه نمایید . انجا عملیات مربوطه بعد از عملیات جمع اجرا می شود اینجا بعد از عملیات تفریق . فرایند کلی این دو دستور یکسان است . لذا می توانید به پست AAA مراجعه نمایید تا با کلیت ماجرای دستور AAA  آشنا شوید .


خروجی دستور AAS به درون رجیستر AL ارسال می شود زیرا رجیستر AL  در اینجا نیز بعنوان عملوند مقصد بکار می رود .


نکته ی مهم :


برای دیدن تغییرات مربوطه   لازمست حتما نسخه ی اوریجینال اسمبلر RosAsm   یعنی  فایل   OriginalRosAsm.zip  را از پست قبلی  (AAA) و یا  از وبلاگهای اسمبلر و  اسپاسم  دانلود نمایید تا پس از دانلود این نسخه و اکسترکت کردن اش و پیکربندی اش و نوشتن این برنامه در درون این نسخه  و انجام مراحل دقیق که درپست  AAA  نوشتم  ،  بتوانید این تغییرات را در پنجره ی Debugger  مشاهده نمایید .


ترجیحا فایل  OriginalRosAsm.zip  را  دانلود نمایید تا علاوه بر اسمبلر بتوانید از برنامه های نمایشی و فایلهای اموزشی نیز بهره مند شوید .




حتما مطالب  پست  AAA  را  درباره ی روش دیباگ و اجرای برنامه ها را بخوانید .

دقیقا باید بدانید که چه زمانی از کلید F6   استفاده بکنید و چه زمانی استفاده نکنید .



نکته ی مهم :

من از این پست به بعد ، فرض را بر این می گیرم که  شما مخاطبین محترم ، نسخه ی اوریجینال و اصلی اسمبلر  RosAsm یعنی فایل  OriginalRosAsm.zip  را از وبلاگ وحیدمی ( پست AAA  )   یا از وبلاگهای  اسپاسم  یا   اسمبلر  ، دانلود کرده اید  و روش پیکربندی این اسمبلر را یاد گرفته اید . ( روش پیکربندی اسمبلر  RosAsm  در فایل های OriginalRosAsm.txt و  RosAsmReadMe.txt   توسط  طراح این اسمبلر توضیح داده شده است . دقیقا طبق توضیحات این دو فایل رفتار نمایید تا اسمبلر برایتان آماده شود و بتوانید با خیال راحت کارتان را شروع کنید ) .



لذا دیگه لینک مربوط به دانلود نسخه ی اصلی و اوریجینال اسمبلر RosAsm را  در وبلاگ قرار نمی دهم .

اگر موفق به یافتن این فایل، در وبلاگ وحیدمی  نشدید  می توانید به وبلاگهای  اسپاسم و اسمبلر  مراجعه نمایید و فایل OriginalRosAsm.zip  را دانلود نمایید .


خب ، فکر می کنم به حد کافی در مورد نسخه ی اصلی اسمبلر RosAsm و لینک دانلود این نسخه  صحبت کردم . 


تاکید می کنم : از این پست به بعد،  من فرض را  بر این می گیرم که شما فایل OriginalRosAsm.zip  را دانلود کرده اید و البته پیکربندی نیز کرده اید و می توانید انرا براحتی اجرا نمایید .


+


 


AAM (ASCII Adjust AX After Multiply) is for use after you have multiplied two decimal digits together and left the result in AL: it divides AL by ten and stores the quotient in AH, leaving the remainder in AL. The divisor 10 can be changed by specifying an operand to the instruction: a particularly handy use of this is AAM 16, causing the two nibbles in AL to be separated into AH and AL.

دستور AAM ( تنظیم اسکی بعد از عملیات ضرب و ارسال نتیجه به درون رجیستر AX ) برای بکارگیری در مواردیست که شما دو رقم دسیمال را در هم ضرب کرده اید و نتیجه را در رجیستر AL رها کرده اید : این دستور ( یعنی AAM ) محتویات درون رجیستر AL را بر عدد 10 تقسیم می کند و خارج قسمت تقسیم را در درون رجیستر AH نگهداری می کند و البته باقیمانده ی تقسیم را در رجیستر AL باقی می گذارد . مقسوم علیه 10 می تواند تغییر یابد  با اختصاص دادن یک اپرند ( عملوند ) به  دستورالعمل : یک کاربرد مخصوصا دستی از این : AAM 16   می باشد که باعث می شود دو نیبل ( نیم بایت ) موجود در  رجیستر AL  برای دو رجیستر AL و AH از هم جدا شوند !

یعنی یک نیبل ( نیم بایت = 4 بیت  ) به درون رجیستر AL و نیبل ( نیم بایت = 4 بیت )  بعدی به درون رجیستر AH   کپی شوند .


+

توضیح :



Operand = عملوند  = هر چیزی که روی  آن عملیات انجام شود . مثل همین رجیستر AL که در این دستورات در حکم عملوند مقصد می باشد  .


نکته :

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


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


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

به عبارت ساده تر ،  دستورات خام زبان اسمبلی ( مثل همین AAA  یا  AAS  یا  MOV   یا  RET   یا  Xor  یا  JE  یا  JMP  یا  CMP یا  Test  )  ،  در  حکم فاعل  ( عملگر یا اپراتور  ) ؛   و  عملوندهای مبدا و مقصد در حکم مفعول ( عملوند )   می باشند .


مثلا در دستور  MOV  eax  , 5 


دستور MOV  در حکم عملگر ( فاعل )  و   عبارات   eax  و  5  در حکم  عملوند ( مفعول )   می باشند .



یا مثلا  دستور  je  بعنوان عملگر تساوی ( = یا  ==  یا  =: )  و عملگر   JLE  بعنوان عملگر کوچکتر مساوی ( => )   یا   دستور JNE  بعنوان عملگر نامساوی     (=! ) بکار می رود .


عملا نمی دانستم که برای تایپ عملگر نامساوی در زبان برنامه نویسی سی  ،  اول باید علامت تعجب را تایپ کنم و بعد علامت تساوی یا اول باید علامت تساوی را تایپ کنم  و بعد علامت تعجب را !!!

درحالیکه تایپ کردن عملگر  JNE ( در زبان اسمبلی )  براحتی آب خوردن است .


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


 اینجا به حرف من رسیدید زیرا خودم با دشواری توانستم این عملگرهای زبانهای سی و سی پلاس پلاس را تایپ نمایم !!!


در حالیکه تایپ  کردن  je  و  jne  و  jle  و  jae و ...  بسیار ساده تر و اسانتر است  و البته قابل فهم تر نیز می باشند .


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


حالا به نظر شما  کدام زبان ساده تر و قابل فهم تر است ؟؟  سی یا اسمبلی ؟؟؟



بگذریم ....



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




بنابراین هرچیزی که  مفعول واقع شود و روی آن  کاری انجام شود اصطلاحا  اوپرند یا عملوند  نامیده می شود 


در دستور  AAM 16  ، عدد 16 که یک عدد فوری می باشد در حکم یک عملوند است که با کمک عملگر یعنی دستور  AAM  کارهای خاصی را انجام می دهد .


نتیجه ی نهایی :


Operator = عملگر = فاعل = دستور زبان اسمبلی

Operand = عملوند = مفعول = متغیر - عملوند مبدا یا مقصد در زبان اسمبلی


+

+



AAD (ASCII Adjust AX Before Division) performs the inverse operation to AAM: it multiplies AH by ten, adds it to AL, and sets AH to zero. Again, the multiplier 10 can be changed.


دستور AAD ( تنظیم اسکی در رجیستر AX قبل از تقسیم )  ، عملیاتی معکوس و در خلاف جهت دستور AAM را انجام می دهد : دستور  AAD  مقدار درون رجیستر AH  را  در عدد 10  ضرب می کند سپس نتیجه را  با مقدار درون رجیستر AL جمع می کند ، و سپس مقدار درون رجیستر AH را به صفر  تنظیم می کند ( یعنی مقدار درون رجیستر AH را برابر با صفر می کند یعنی او را کاملا خالی می کند ) .

مجددا  مضروب فیه ( ضرب کننده ) 10  می تواند تغییر باید . 


+

+

+

یک نمونه برنامه از کاربرد دستور  AAS  ( قابل اجرا در RosAsm ) :

 





main:


xor      eax    eax                  ; eax = 0d . d= decimal


mov      ax     001111           ;  eax = 1111b  . b = binary


aas                               ; eax = 0FF09h   . h= hexadecimal



ret                                      ; Return to RosAsm or OS





+

+

خب دوستان !!  این هم از این چهار دستور خفن زبان اسمبلی !!!


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


عنوان پست بعدی وبلاگ وحیدمی ، AAM و عنوان پست بعدی ، AAD  می باشد !


اما اون دو دستور قبلی یعنی AAA و  AAS را دیگه نمی آورم . چون نیازی به دوباره کاری و تکرار مکررات نیست . 


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


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


+

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


بعد از معرفی تمام دستورات زبان اسمبلی ، نوبت به معرفی کامل اسمبلر RosAsm و برنامه نویسی حرفه ای با این اسمبلر می رسد که اگر خدا عمری بدهد حتما اینکار را انجام خواهم داد .


بعد از تسلط کامل بر زبان اسمبلی عمومی و کسب مهارت در برنامه نویسی با این زبان تحت ویندوز ، نوبت به  مسائل تخصصی می رسد که بعدا اگر خدا عمری بدهد  این مسائل تخصصی را بیان خواهم کرد . انشاء ا....


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



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


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


+


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


AAA





Assembly is real open source


اسمبلی ، اوپن سورس واقعی است .



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   را می توانید با کمک یک هگز ادیتور ، در آدرس مربوطه در شکم فایل اجرایی نرم افزار ، پیدا و مشاهده نمایید . باید به کدهای هگزادسیمال ستون وسط هگز ادیتور نگاه کنید . ) .



 (ASCII Adjust After Addition) should be used after a one-byte ADD instruction whose destination was the AL register: by means of examining the value in the low nibble of AL and also the auxiliary carry flag AF, it determines whether the addition has overflowed, and adjusts it (and sets the carry flag) if so. You can add long BCD strings together by doing ADD/AAA on the low digits, then doing ADC/AAA on each subsequent digit.


دستور AAA  که مخفف عبارت ASCII Adjust After Addition

می باشد باید بعد از یک دستور 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  میلادی )  محسوب می شود !!


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


https://www.multicians.org/




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

به هرحال اگر زبان اسمبلی نبود مولتیکس همان دهه ی 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




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

+

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






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










به نام خدا



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

 


X86 Opcodes or intel instructions


 کدهای عملیاتی پردازنده ی ایکس 86 (پردازنده های خانواده ی 8086 تا پنتیوم و اینتل کور  نسل نهم  و ... )  یا دستورات زبان اسمبلی اینتل ( از ایکس 86  تا Intel Core i9 )  :


نکته : این عبارات ،  دستورات زبان اسمبلی می باشند که در سورس کد و دیس اسمبلی نرم افزارها به شکل یکسان بکار می رود و به شما اوپن سورس واقعی و آزادی واقعی را هدیه می دهند :

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


 آزادی کاربر ،  در برنامه نویسی با زبان اسمبلی و فهم باینری و آشتی کردن با زبانهای ماشین و اسمبلی  ؛ بدست می آید :


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


اوپن سورس یعنی دیس اسمبلی . اوپن سورس یعنی برنامه نویسی محض با زبان اسمبلی .


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


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


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


لذا باید حتما زبان اسمبلی را یاد بگیرید تا به  اوپن سورس واقعی و حقیقی برسید .


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


aaa     aas    aam     aad     adc      add    

addpd      addps       addsd      addss     addsubpd     addsubps

and      andnpd      andnps     andpd      andps       arpl

 

bound      bsf    bsr     bswap       bt    BTC    BTR    BTS

 

CALL      CBW     CWD    CWDE     CDQ    CLC    CLD    CLI    CLTS

CLFLUSH    CMC    CMP     CMPccPD    CMPccPS    CMPccSD   CMPccSS   

CMPSB     CMPSW      CMPXCHG      CMPXCHG8B

CMOVcc      COMISD     COMISS      CPUID 

 

CVTDQ2PD     CVTDQ2PS 

CVTPD2DQ      CVTPD2PI      CVTPD2PS     CVTPI2PD      CVTPI2PS   

CVTPS2DQ       CVTPS2PD     CVTPS2PI 

CVTSD2SI      CVTSD2SS       CVTSI2SD      CVTSI2SS  

CVTSS2SD      CVTSS2SI

CVTTPD2DQ     CVTTPD2PI     CVTTPS2DQ    CVTTPS2PI   CVTTSD2SI     CVTTSS2SI 

 

DAA     DAS      DEC      DIV      DIVPD     DIVPS     DIVSD     DIVSS

 

EMMS      ENTER   

 

F2XM1      FABS     FADD      FADDP      FBLD      FBSTP      FCHS    FCLEX 

FCMOVcc      FCOM       FCOMP      FCOMPP      FCOMI     FCOMIP       FCOS 

FDECSTP     FDIV      FDIVP      FDIVR      FDIVRP     FEMMS    FFREE 

FIADD       FICOM      FICOMP      FIDIV      FIDIVR 

FILD      FIST      FISTP      FISTTP      FIMUL      FINCSTP

FINIT      FNINIT     FISUB     FISUBR      FLD      FLDxx      FLDCW    FLDENV 

FMUL      FMULP      FNOP  

FNSAVE     FNSTCW     FNSTENV     FPATAN      FPTAN      FPREM         FPREM1 

FRNDINT     FRSTOR     FSAVE       FSCALE      FSETPM      FSIN       FSINCOS  

FSQRT     FST      FSTP      FSTCW       FSTENV      FSTSW   

FSUB       FSUBP     FSUBR      FSUBRP      FTST     FUCOMxx       FWAIT 

FXAM     FXCH      FXRSTOR     FXSAVE    FXTRACT     FYL2X       FYL2XP1    

 

HADDPD      HADDPS     HSUBPD      HSUBPS     HLT 

 

IDIV     IMUL      INC     IN     INSB     INSD     INSW     

INT       INT01      INT1      INT3     ICEBP      INTO     INVD     INVLPG 

IRET     IRETW     IRETD 

 

Jcc     JCXZ      JECXZ       JMP 

 

LAHF      LAR      LDDQU      LDMXCSR     LDS      LES      LFS      LGS     LSS   

 LEA      LEAVE      LFENCE      LGDT     LIDT      LLDT     LMSW   

    LODSB      LODSW      LODSD      LOCK  

    LOOP      LOOPE      LOOPZ     LOOPNE     LOOPNZ     LSL      LTR 

 

MASKMOVDQU       MASKMOVQ      MAXPD      MAXPS       MAXSD        MAXSS       MFENCE      

MINPD        MINPS      MINSD      MINSS      MONITOR 

MOV     MOVAPD     MOVAPS     MOVD      MOVDDUP      MOVDQ2Q      MOVDQA    MOVDQU      

MOVHLPS      MOVHPD     MOVHPS       MOVLHPS      MOVLPD       MOVLPS   

MOVMSKPD      MOVMSKPS      MOVNTDQ      MOVNTI      MOVNTPD MOVNTPS      MOVNTQ 

MOVQ       MOVQ2DQ      MOVSB      MOVSD      MOVSHDUP      MOVSLDUP      MOVSW     

MOVSS      MOVSX       MOVUPD       MOVUPS      MOVZX

MUL        MULPD       MULPS      MULSD       MULSS        MWAIT 

 

NEG       NOT        NOP       NOPE 

 

OR      ORPD        ORPS      OUT       OUTSB      OUTSW     OUTSD

 

PACKSSDW      PACKSSWB       PACKUSWB      PADDB    PADDW      PADDD       PADDQ  

PADDSB       PADDSW      PADDUSB       PADDUSW     PAND     PANDN     

PAUSE      PAVGB       PAVGW       PAVGUSB  

  PCMPxxx       PEXTRW 

PF2ID       PF2IW       PFACC      PFADD      PFCMPxx       PFMAX    PFMIN 

PFMUL        PFNACC       PFPNACC       PFRCP     

 PFRCPIT1       PFRCPIT2       PFRSQIT1       PFRSQRT

PFSUB         PFSUBR      PI2FD       PI2FW

PINSRW        PMADDWD        PMAXSW        PMAXUB      PMINSW         PMINUB     

PMOVMSKB       PMULHRWA       PMULHUW       PMULHW      PMULLW       PMULUDQ   

  POP       POPA        POPAD        POPF       POR 

  PREFETCH       PREFETCHh  

  PSADBW        PSHUFD       PSHUFHW     PSHUFLW      PSHUFW

   PSLLDQ        PSLLx        PSRAx      PSRLDQ      PSRLx   

   PSUBx        PSUBxx       PSWAPD      PUNPCKhxx   

  PUSH        PUSHA       PUSHAD       PUSHF      PXOR

 

RCL       RCR      RCPPS      RCPSS      RDMSR      RDPMC        RDTSC    

REP         RET         RETF           RETN         ROL        ROR 

  RSDC        RSLDT      RSM       RSQRTPS      RSQRTSS      RSTS

 

  SAHF        SAL      SAR       SBB       SCASB       SCASW      SCASD     SETcc    

   SFENCE        SGDT       SIDT       SLDT

   SHL       SHR       SHLD       SHRD       SHUFPD      SHUFPS        SMSW

SQRTPD       SQRTPS      SQRTSD      SQRTSS      STC      STD      STI    

STMXCSR        STOSB       STOSW       STOSD      STR

SUB        SUBPD        SUBPS        SUBSD       SUBSS

   SYSCALL        SYSENTER        SYSEXIT        SYSRET  

 

   TEST     

 

  UCOMISD        UCOMISS        UD0        UD1      UD2    

  UNPCKHPD       UNPCKHPS        UNPCKLPD        UNPCKLPS 

 

VERR       VERW 

 

  WAIT        WBINVD       WRMSR   

XADD        XCHG      XLATB       XOR      XORPD      XORPS

 

 

 



به نام خدا


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


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


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




به همین جهت با تمام قدرت ، ضمن محکوم کردن تمام زبانهای سطح بالا و فناوریهای خبیث و مکار ( دات نت و .... )  شرکت مایکروسافت ، قصد دارم کاری کنم که شما بتوانید تحت ویندوز ، با زبان اسمبلی  ، اقدام به برنامه نویسی حرفه ای و حتی تجاری نمایید و عملا برای همیشه از شر زبانهای سطح بالا و مشکلات فنی شان و لایسنس هایشان و محدودیتهایشان و نواقص شان و  دپندنسیهای چرت و مسخره شان  ،  راحت شوید  و دیگه هیچوقت پیامهای مبنی بر یافت نشدن فلان فایل dll یا فلان فایل h  یا فلان فایل cpp  یا ocx یا ....   ظاهر نشوند و شما را آزار ندهند .



یک زبان قدرتمند و همه منظوره  ( اسمبلی )  بهتر از  هزاران زبان ضعیف و مکار و ریاکار ( زبانهای سطح بالا )   می باشد .


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


اینها دستوراتی هستند که مستقیما به کدهای زبان ماشین ( 0 و 1 )  تبدیل می شوند لذا زبان اسمبلی که این دستورات را بصورت ذاتی بکار می برد سریعترین و قدرتمندترین و کاملترین و هوشمندترین و انعطاف پذیرترین زبان برنامه نویسی دنیا ( بعد از زبان ماشین ) می باشد و یک زبان برنامه نویسی همه منظوره است و تمام نیازهای شما را برطرف می نماید و شما را از تردید بین صدها زبان سطح بالا  ، خلاص می کند .



نگران کلمات  عجیب این دستورات نباشید چون از پست بعدی تک تک این دستورات را برایتان تشریح می کنم و برای تک تک این دستورات طبق گرامر اسمبلر RosAsm  برایتان  مثال و نمونه ی برنامه می آورم .


همچنین آنها را بصورت یک درمیان ، رنگی کردم تا بهتر بتوانید انها را بخوانید و از هم تشخیص دهید .



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


یعنی پست بعدی عنوان اش اینست :  AAA 


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

مثلا به محض کلیک روی  کلمه ی  AAA  مستقیما به پست مربوطه وارد شوید .


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


این کلمه ی کلیدی اینست :


Assembly is real open source


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




شما می توانید از این دستورات زبان اسمبلی اینتل ، در اسمبلرهای Fasm و Masm32  و البته  Goasm  نیز استفاده کنید .

حتی اگر بتوانید با  Nasm   کار کنید این دستورات  ، آنجا نیز کاربرد خواهند داشت .


به هرحال اینها دستورات زبان اسمبلی اینتل می باشند که در هر مدلی اعم از 8 بیت ، 16 بیت ، 32 بیت و 64 بیت ، کاربرد دارند .


این دستورات به هیچ سیستم عامل وابسته نیستند و لذا شما می توانید در تمام سیستم عاملهای دنیا از این دستورات برای برنامه نویسی با زبان اسمبلی اینتل ، استفاده نمایید .

فرقی نمی کند که کاربر داس باشید یا ویندوز یا یونیکس یا مولتیکس یا لینوکس یا بی اس دی یا  اندروید ایکس 86 یا    ....


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


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


خب ! از پست بعد تک تک این دستورات را به شما معرفی کرده و با ذکر یک نمونه برنامه  ، کاربرد دقیق این دستورات را به شما آموزش خواهم داد . انشاء ا...

+

فراموش نکنید : عنوان پست بعدی این وبلاگ (وبلاگ وحیدمی) ،  AAA و عنوان پست بعد از آن ، AAS  و عنوان پست بعدی ،  AAM  می باشد و الی اخر .....   یعنی هر پست ،  فقط یک دستور زبان اسمبلی را تشریح کرده و توضیح می دهد .  بنابراین برای هر دستور زبان اسمبلی ، یک پست جداگانه می سازم و منتشر می نمایم .

+


نکته ی مهم :

بسیاری از این دستورات زبان اسمبلی که در این پست ، لیست کرده ام بر روی تمام پردازنده های خانواده ی اینتل از پردازنده ی اینتل 8086  گرفته تا پردازنده ی اینتل کور نسل نهم    یعنی  Core i9    براحتی اجرا می شوند .


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


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

+


اخطار :

من در پست قبلی یک برنامه ی اسمبلی نوشتم که در آن از دستور push استفاده کردم ولی چون این برنامه را خیلی سریع و فی البداهه نوشتم فراموش کردم که روتین را با استفاده از دستور  pop  از حافظه  خارج نمایم .


یادتان باشد که برخی از دستورات زبان اسمبلی بصورت جفت و زوج  با هم بکار می روند .  مثلا هر وقت از دستور push  استفاده کردید و کارتان تمام شد حتما باید در  پایان کد از دستور  pop استفاده نمایید تا برنامه از حافظه ی کامپیوتر خارج شود و شما با  خطاهای خطرناک دچار نشوید  .


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


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


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


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




بروزرسانی :


 من بعد از مدتها جستجو موفق شدم نسخه ی اصلی و اوریجینال اسمبلر RosAsm  را پیدا و دانلود نمایم . این نسخه قدیمی است اما به درستی کار می کند مخصوصا که دیباگر (debugger) این نسخه  بخوبی و بطور صحیح نمایش داده می شود . شما می توانید نسخه ی اصلی و اوریجینال اسمبلر RosAsm را از آدرسهای  زیر دانلود نمایید :




++++++++

https://vahidmy.blog.ir

https://spasm.blog.ir

https://Assembler.blog.ir

+++++++++


Vahid Mohammady (vahidmy)

Original Site:  https://vahidmy.blog.ir




لینک دانلود نسخه ی اوریجینال اسمبلر RosAsm :


https://bayanbox.ir/download/150927488221190666/OriginalRosAsm.zip


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


ترجیحا فایل  OriginalRosAsm.zip را از لینک بالا ، دانلود نمایید .




+

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





اسمبلی به کتابخانه های زبانهای سطح بالا نیاز ندارد






 


 


بسمه تعالی


Assembly is real open source.

 


اسمبلی به کتابخانه های زبانهای سطح بالا نیاز ندارد


 


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


 


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


 


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


 


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


 


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


 


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


 


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


 


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


 


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


 


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


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


 


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


( گذر پوست به دباغ خانه می افتد !! )


 


زبان ماشین ، قبرستان تمام زبانهای برنامه نویسی سطح بالا و سطح پایین است . لذا در اوج قدرت است .


 


بگذریم ....


 


تمام عملوندها و عملگرهای تمام زبانهای سطح بالا و تمام گرامر و سینتاکس و فناوریهای این زبانها ، ذاتا از قدیم ( اوایل دهه ی 50 میلادی ) در زبان اسمبلی بوده است .


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


 


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


 


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


 


 


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


 


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


 


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


 


بسیاری از انواع داده که در زبانهای سطح بالا می بینید اضافی و ابلهانه هستند .


 


بسیاری از عملوندهای زبانهای سطح بالا تکراری و اضافی هستند .


مثلا در دلفی 6 شاهد بودم که عملوند + یا - یا * ، در چندین مورد مختلف بکار می رفت و عملا کاربر را گیج و سردرگم می کند .


 


در حالیکه اینها اضافی و غیرضروری هستند . 


 




یا مثلا در همین دلفی برای نمایش یک پیام ، دهها تابع مسخره را بکار می بردند در حالیکه در اسمبلی کافیست از تابع MessageBox استفاده کنید . به همین سادگی و راحتی .




 


 


بسیاری از عملوندهای زبانهای سی و سی پلاس پلاس را نمی توان به همین راحتی تایپ کرد . مثل عملوندهایی که ترکیبی از = و + می باشند !


 


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


 



دنیس ریچی یک دست به سرو روی زبان اسمبلی کشید و نام زبان اش را سی (C) گذاشت و در کتاب معروف اش با عنوان (The C programming language ) ، مدعی شد که زبان سی یک زبان برنامه نویسی سطح پایین ( !!!) و سیستمی و همه منظوره (!!!!) و کامل می باشد !!!!!!




 


( همه می دانیم که ما فقط دو زبان سطح پایین داریم : 1- زبان ماشین 2- زبان اسمبلی . مابقی زبانها همگی سطح بالا هستند . در ضمن زبان سی هرگز یک زبان همه منظوره نیست و ناقص است و مشکلات خاص خودش را دارد و از همان ابتدا یعنی سال 1972 میلادی که توسط ریچی اختراع شد نیز بسیاری از قابلیتهای زبان اسمبلی را نداشت و محدودیتهای عمدی را بر کاربر تحمیل می کرد و قادر نبود مستقیما با سخت افزار ارتباط برقرار کند چون یک زبان سطح بالا بود . )


 


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


 


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


 


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



کافیست سورس برنامه های این دو زبان یعنی سی و اسمبلی را با هم مقایسه کنید تا متوجه ی شباهتهای فراوان این دو زبان بشوید !


 



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




 


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


 


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


 



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




 


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


 


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


 


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


 


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


 


کامپیوتر خودم هست و به هیچکس دیگری اسیب نمی زنم .


 


تمام این حقوق توسط زبانهای سطح بالا پایمال شده اند .


 



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




 


این زبانها باعث می شوند که ما از اصل برنامه نویسی یعنی تولید نرم افزار غافل شویم و همیشه مجبور باشیم هزاران فایل کتابخانه را از این جا به اون جا جابجا کنیم !!


 



یعنی مدام باید نگران باشیم که مبادا فلان فایل کتابخانه ای با هر نوع پسوند اعم از dll یاocx یا lib یا h یا hpp یا inc یا C یا CPP یا Pas یا .... در این اسباب کشیها گم نشود که البته گم می شود و ما همیشه در هنگام نصب یا اجرای تمامی نرم افزارهای تولید شده توسط زبانهای سطح بالا یا حتی اجرای خود زبانهای سطح بالا با پیامهای آزاردهنده مبنی بر پیدا نشدن فلان فایل dll مواجه هستیم !




 



بدترین شکل این فاجعه در مورد اجرای بازیهایی است که توسط فناوری دایرکت ایکس (DirectX)ساخته شده اند و بدبختانه هر بازی با نسخه ی خاصی از دایرکت ایکس و هر نسخه از ویندوز نیز با نسخه ی خاصی از دایرکت ایکس سازگاری دارد . لذا این فرایند جهنمی واقعا کاربر را عصبانی و کلافه می کند .




 



همین نصب و اجرای بازی میدتاون مدنس (midtown madness ) با هزار بدبختی انجام شد و هزاران فایل مربوط به نسخه های مختلف دایرکت ایکس را دانلود و نصب کردم تا توانستم تحت ویندوز 10 بازی میدتاون مدنس را اجرا نمایم .




 


نصب بازی فیفا 99 نیز با دشواری انجام شد و البته منوهای این بازی متاسفانه به زبان انگلیسی نیستند لذا کارکردن با فیفا 99 تحت ویندوز 10 با دشواریهایی همراه است . فیفا 99 تحت ویندوز 10 اجرا می شود و خیلی سریع هم اجرا می شود اما بسته ی زبان انگلیسی را ندارد لذا بازی کردن در ان دشوار است .


 


زبان دلفی 6 که گیرم نیامد . بجایش دلفی 7 را دانلود و روی ویندوز 10 نصب کردم . اجرا شد اما پیام احمقانه ای داد که اجازه نمی داد هیچ نرم افزاری بسازم .


لذا دلفی 7 را بطور کامل از روی هارد رایانه حذف کردم .


 


ویژوال استودیو 98 تحت عنوان ویژوال استودیو 6 را روی ویندوز 10 نتوانستم نصب کنم .


 


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


 


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


 


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


 


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


 


 



همیشه شاهد عدم اجرای فلان نرم افزار بدلیل یافت نشدن فلان فایل dll هستیم .




 


اینها ارمغان زبانهای سطح بالا و کتابخانه های چرت و احمقانه شان می باشد .


 


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


 


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


 


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


 


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


 


لینوکس بجز احضار ارواح خبیث یونیکس کار دیگری انجام نداده است .


 


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


 


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


 


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


 


 


به هرحال ، ویندوز باید از شر این فایلهای وابستگی و کتابخانه ای خلاص شود و بطور کامل با زبان اسمبلی بازنویسی شود


تا شاهد تکرار این فاجعه ها نباشیم .


 


همه ی این فجایع فقط یک دلیل دارد : دور شدن از زبانهای واقعی برنامه نویسی یعنی زبانهای ماشین و اسمبلی .


 


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


 


من بارها گفته ام که برنامه نویسی چند سکویی و قابل حمل دیگه به آخر عمر خود رسیده زیرا بسیاری از پردازنده های قدیمی ، یا برای همیشه منسوخ شده اند یا در اینده ی نزدیک منسوخ می شوند مثل پردازنده های زیر :


 



mips


motorola


powerPC


Alpha dec




 


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


 


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


 




تمرکز بر روی فقط یک پردازنده که معروف و قدرتمند و سریع و کاربردی و تجاری و ارزان قیمت باشد و مستندات فراوان داشته باشد و مشتریان فراوان در سطح جهان داشته باشد کاری عاقلانه است که مایکروسافت این کار عاقلانه را از اواسط دهه ی 90 میلادی تا به امروز انجام داده است به همین دلیل است که امروز ویندوز 10 نهایتا روی سه پردازنده ی زیر اجرا می شود که در مدل 64 بیتی ، زبان اسمبلی کمابیش یکسان و مشابه دارند :




 



intel


AMD


Arm


 



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


 


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


 


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


 


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


 


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


مایکروسافت به دنبال جذب حداکثری می باشد و بهترین بازارها را زیر نظر می گیرد و جایی سرمایه گذاری می کند که میلیاردها مشتری و کاربر و توسعه دهنده حضور داشته باشند .


 


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


 


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


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


 


فلسفه ی یونیکس دیگه خریدار ندارد و رو به زوال است .


 


فلسفه ی یونیکس دیر یا زود طرد می شود و می میرد


 


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


 


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


 


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


 


رمز موفقیت ویندوز در دنیای پرمخاطب دسکتاپ در یک چیز است :


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


 


بله : تمرکز و جامع گرایی و تاکید روی کارایی و کاربرپسندی رمز موفقیت ویندوز بوده و هست و خواهد بود


 


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


 


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


 


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



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


 


بسیاری از این کتابخانه ها کاملا زائد و پردردسر هستند . مثل دایرکت ایکس و دات نت و صدها کتابخانه و فریم ورک مازوخیستی و اضافی و پرهزینه .


 


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


 


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


 


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


 


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


 




مثلا به این قطعه کد اسمبلی که می توان در ویندوز و توسط فلت اسمبلر (Fasm) اجرا کرد توجه کنید :




 



format pe gui


 


include 'win.inc'






xor eax , eax


xor edx , edx


mov eax , form1


cmp form1 , 0


je exit


cmp form1 , functions


je functios


 


functions:


push eax


mov eax , function1


mov eax , function2


mov eax , function 3


.....


.....


....


cmp eax , function1


je CreateWindow


cmp eax ,function2


je ShowWindow


cmp eax , function3


je ExitWindow


 


CreateWindow:


mov function1 , Window


 


ShowWindow:


mov function2 , Show


 


ExitWindow:


mov function3 , exit


 


exit:


xor eax , eax


ret


 




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




 



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




 


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


 


می بینید که اسمبلی انقدر هم که تصور می کنید سخت و دشوار نیست .


 



آیا شما در این کد اسمبلی که بصورت فی البداهه در بالا نوشتم هیچ اثری از توابع API ویندوز یا توابع یا کتابخانه های زبانهای سطح بالا مشاهده می کنید ؟؟؟؟




 


مسلما خیر . اینست کدنویسی خالص و اصیل و استاندارد .


 



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




 


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


 



حالا برای اجرای واقعی باید نهایتا این برنامه را مستقیما به کرنل ویندوز یعنی فایلntdll.dll وصل نماییم که اینجا فلت اسمبلر از دستور FF15 استفاده می نماید تا این برنامه بتواند مستقیما کرنل سیستم عامل ویندوز را فراخوانی کرده و اجرا شود .




 


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


 


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


 


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


 


 


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


 


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


 


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


 


این یعنی اینکه اسمبلی شامل این ضرب المثل است که می گوید :


 


طلا که پاک است چه حاجت اش به خاک است


 


و یا این ضرب المثل


 


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


 


 



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




 


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


 


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


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


 


 


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


 


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


 


 


من به ابتدای بحث برمی گردم و میگویم زبان اسمبلی هیچ نیازی به کتابخانه های زبانهای سطح بالا ندارد و می توانید این کتابخانه ها را حذف کنید و منحصرا با کدهای خام اسمبلی ، نرم افزار بسازید .


 


 


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


 


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


 


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



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




 


 



برای من همین توابع API ویندوز کلاسیک (Win32API) ، کاملا کفایت می کند .


من فعلا به سمت توابع ویندوز 64 بیتی نمی روم چون مستندات و ابزارهای اندکی دارد و شاید سالها طول بکشد که x64 بتواند x86 را از میدان به در کند .




 



بهرحال میلیونها نرم افزار و بازی و درایور ویندوز هنوز که هنوزه از توابع win32 استفاده می نمایند . پس فعلا کاری به ویندوز 64 بیتی نداریم .




 



در آینده اگر عمری باشد برنامه نویسی Win64 تحت اسمبلی را نیز اموزش خواهم داد انشاء ا...




 


نکته ی مهم :


 


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


بقول معروف ، آسیاب به نوبت !


 


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


 


نهایتا من زبان اسمبلی را نیز می بوسم و کنار می گذارم و منحصرا با کدهای زبان ماشین و البته با کمک هگز ادیتور ، تحت ویندوز برنامه نویسی خواهم کرد و به شما نیز یاد می دهم . انشاءا...


 


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


 


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


 


من برای برنامه نویسی با زبان اسمبلی تحت ویندوز منحصرا از این سه کامپایلر معروف زبان اسمبلی ، استفاده می نمایم :



Masm32


Fasm


RosAsm


 



سایر کامپایلرهای زبان اسمبلی عملا کارایی لازم را ندارند و به درد نمی خورند .


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


 


 


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


:


 




Hexplorer


 


Tiny Hexer






C32asm



 




البته Winhex و Hackman نیز بسیار خوب و عالی و قدرتمند می باشند و شما می توانید از این دو نیز به میل خودتان استفاده نمایید .




 


 


درواقع از هر هگز ادیتور دلخواه می توانید برای برنامه نویسی با هگز ادیتور استفاده نمایید . بستگی به تمایل و نیاز خودتان دارد


 


البته باید از دیباگرها و دیس اسمبلرهای قدرتمند نیز استفاده نمایید . مثل این موارد :


 



OllyDBG


 


Borg DisAssembler


 


w32dasm


 



C32Asm




 



این برنامه ی C32asm عملا یک شاهکار دنیای نرم افزار است که توسط هکرهای چینی ساخته شده و هیچ نمونه ی آمریکایی یا اروپایی  ندارد . من که هرچی جستجو کردم مشابه ای برایش ندیدم .




 



البته برنامه ی wHexEditor که هم نسخه ی ویندوزی دارد و هم نسخه ی لینوکس و هم نسخه ی مک ، تا حدودی برخی قابلیتهای C2asm را در خود دارد ولی هرگز به گرد پای C32asm نمی رسد .




 


چینی ها را هرگز دستکم نگیرید . خدای برنامه نویسی و هک و کرک می باشند !


 


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


 


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


عملا باید به عقل اروپایی ها و امریکاییها شک کرد .


 


شاید در فرصتی دیگه تمام ابزارهای هک و کرک و مهندسی معکوس را در وبلاگ ام آپلود نمایم !


 



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




 



برنامه ی Ida pro و هرنوع دیکامپایلر دیگه ، همگی شما را از زبانهای ماشین و اسمبلی دور می کنند و مجددا به دام زبانهای سطح بالا می اندازند .




 


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


 



لذا من همان OLLYDBG و C32Asm را به شما پیشنهاد می دهم .




 


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


 


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


 


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


 


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


 


چه نیازی به سورس سطح بالا دارید ؟؟؟


 


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


 


 



خب وقتیکه من تفاوت بین FF15 و E8 را که هردو به معنای Call می باشند می دانم و درک می کنم ، چه نیازی به اوپن سورس و دیکامپایلر دارم ؟؟




 


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


 



FF15 ، توابع بیرونی موجود در فایلهای dllنرم افزار یا سیستم عامل ویندوز و کرنل ویندوز را احضار می کند در حالیکه E8 ، توابع و روتینهای درون خود برنامه را فراخوانی و احضار می کند .




 


البته هرکدام از این دو کد زبان ماشین، مزایا و معایب خاص خود را دارند که در بحث های بعدی به آن می پردازم . انشاء ا...


 


+


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


 


+


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

+

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


 


 


 


 


 


 


 


 


 


 


 




 



سرنوشت درخشان ویندوز



به نام خدا


سرنوشت درخشان ویندوز


مخاطبین گرامی . سلام . همانطور که در پست قبلی با عنوان  Windows 365  ، گفتم ، شرکت مایکروسافت قصد دارد از دوم آگوست سال 2021 میلادی ، ( برابر با  11 مرداد  1400 شمسی )  ،  جدیدترین نسخه ی سیستم عامل ویندوز یعنی ویندوز ابری  365 را در سرتاسر دنیا عرضه نماید .


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


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


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


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



برخی از کاربران زومیت مدعی هستند که ویندوز ابری یعنی پایان دوران کرک و مهندسی معکوس نرم افزارهای تجاری !


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


ثانیا ویندوز ابری 365   کاملا روی ابر است و هیچ ربطی و ارتباطی با ویندوز کلاسیک که روی هارد رایانه نصب شده است ندارد و عملا اجرای نرم افزارهای کلاسیک ویندوز که روی هارد نصب شده اند کماکان بدون مشکل انجام می شود .


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


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


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



ویندوز 365 یک ویندوز مبتنی بر ابر است یعنی فقط یک سرویس است و نه یک سیستم عامل .


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


+

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


+

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


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


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


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


اما در مجموع ، ویندوز ابری 365   هرگز مانعی برای برنامه نویسان زبان ماشین یا هکرها  و کرکرها نخواهد بود  و من نیز همچون هکرها و کرکرها  با هیچ مشکلی روبرو نخواهم شد . 


لذا  ویندوز چه بصورت ابری و چه به صورت زمینی !  عمری جاودانه دارد و فرایند هک  و کرک و برنامه نویسی با زبان اسمبلی و ماشین نیز  یک فرایند همیشگی  و جاودانه است و این باعث بقای ویندوز می گردد .


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


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


+


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


من هرگز به سمت سیستم عاملها و فناوریهای ابری نمی روم زیرا دوست دارم  بدن ام روی زمین باشد و چاله چوله های جلوی پایم را  پر کنم تا نفرات بعدی با خیال راحت روی زمین راه بروند !!!


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


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



من با ویندوز 365 یا هر سیستم عامل ابری دیگری هیچ مشکل یا مخالفتی ندارم . من سرم توی کار خودم هست و راه خودم را می روم و به سخت افزار که زمین زیر پایم می باشد فکر می کنم  و اهل رویاپردازی در ابرها نیستم .


سیستم های ابری برای هرکس مشکل ساز شود برای ما کاربران قدیمی و سنتی که  عاشق سخت افزار و زبان ماشین هستیم  هرگز مشکل ساز نخواهد شد زیرا ما به ابر علاقه نداریم و کارمان پر کردن چاله های خیابان است !!!



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


+


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


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


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


تاکید می کنم ویندوز ابری هرگز دشمن کرک نیست . خیالتان راحت باشد . این دو سیستم عامل ( ویندوز ابری 365 و ویندوز کلاسیک قابل نصب  روی هارد )   اصلا هیچ  تداخلی با هم ندارند . شما با خیال راحت از کرک استفاده نمایید .


درواقع ، ویندوز 365 هرگز دشمن ویندوز 10 یا ویندوز 7 نیست بلکه صرفا یک سرویس اینترنتی مبتنی بر   ابر است . همین و بس .


+

آینده ی ویندوز ، درخشان است حالا چه با ویندوز ابری و چه با ویندوز زمینی !!


برخیها معتقدند که ویندوز ابری محکوم به شکست است و حتی این شکست را پیشگویی نیز می کنند انگار که علم غیب دارند !!!


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



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


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


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


+


برای دیدن نظرات کاربران زومیت درباب ویندوز 365 به این آدرس مراجعه نمایید :




https://www.zoomit.ir/os/372756-microsoft-windows-365-cloud-os/




+


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


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


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


به امید خدا ، از پست بعدی به تدریج ، روش برنامه نویسی با هگز ادیتور را در قالب متن ساده و قابل فهم ،  آموزش خواهم داد . انشاء ا...


+

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











Windows 365






به نام خدا


Windows 365


ویندوز 365  :


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

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


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




https://www.microsoft.com/en-us/windows-365?icid=mscom_marcom_H1a_Windows365





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


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

+


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


زیرا هنوز ویندوز 11 را رسما منتشر نکرده که یک ویندوز جدید به نام ویندوز 365 را به کاربران معرفی می نماید .


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


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


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


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


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

+

عنوان پست بعدی این وبلاگ :  سرنوشت درخشان ویندوز

+


بروزرسانی : لطفا از این پست ( اسرار و بسته های ویندوز ) ، بازدید فرمایید . این پست به مرور زمان ، آپدیت خواهد شد .  


http://vahidmy.blog.ir/post/Windows-Packages-and-Secrets





+

+

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