وو

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

وو

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


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


+


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


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










به نام خدا



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

 


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 and Binary




به نام خدا


اسمبلی و باینری (زبان ماشین):


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

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

+

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

+

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

+

برنامه نویسی با هگز ادیتور به چند فاکتور مهم نیازمند است:

1- تسلط کامل بر زبان اسمبلی

2- تسلط کامل بر زبان ماشین

3- تسلط کامل با  عناصر سازنده ی  سیستم عامل ویندوز از قبیل توابع و ثابتهای ویندوز

4- تسلط کامل بر معماری نرم افزارهای ویندوز

5- روش استفاده از هگز ادیتور 

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



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


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

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


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

+

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

+

+

شروع آموزش زبان برنامه نویسی اسمبلی 

همانطور که قبلا نیز گفتم زبان برنامه نویسی اسمبلی نخستین بار بصورت یک زبان کاملا دستی توسط آلن تورینگ و در اوایل دهه ی  50 میلادی ابداع شد و جایگزین زبان ماشین گردید ( زبان ماشین نخستین بار توسط کنراد زوس دانشمند آلمانی در سال 1935 میلادی بر روی کامپیوتر Z1  پیاده سازی شد و بدین ترتیب قدیمی ترین کامپیوتر الکتریکی قابل برنامه نویسی در جهان با کمک زبان ماشین ساخته شد و سپس زبان ماشین تا سال 1950 میلادی رسما بعنوان تنها زبان برنامه نویسی بکار رفت . البته الان نیز می توانیم زبان ماشین را بکار گیریم  . هیچ مشکلی در این مورد وجود ندارد. )  .  بعدها زبان اسمبلی توسط سایر دانشمندان بعنوان جایگزینی بجای زبان ماشین بکار گرفته شد تا اینکه اوایل دهه ی 60 میلادی شرکت آی بی ام اولین کامپایلر  را برای زبان اسمبلی ساخت و  رسما روی مین فریمهای خودش پیاده سازی کرد . از آن زمان تا به امروز زبان اسمبلی به یک زبان برنامه نویسی اتوماتیک تبدیل شده و دیگه دستی نیست . لذا فرایند برنامه نویسی در آن بسیار آسانتر شده است . 

+

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

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

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

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

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

مثال:

mov eax , 01       ;   B801

در اینجا عبارت   mov eax    یک یادمان است که پس از اسمبل شدن به کد B8 که یک کد زبان ماشین در مبنای هگزادسیمال است تبدیل می شود که شما می توانید این کد زبان ماشین را از طریق یک هگز ادیتور براحتی مشاهده و حتی ویرایش کنید .  عدد 01  مستقیما و بدون تغییر به کد 01  زبان ماشین در مبنای هگزادسیمال تبدیل می شود . لازم به ذکر است که اعداد بین 0 تا 9 بدون تغییر به اعداد مشابه ترجمه می شوند . لذا این دسته از اعداد را می توانید بصورت دسیمال یا هگزادسیمال  بنویسید . مشکلی ایجاد نمی شود . 

دستورالعمل بالا که یک اینستراکشن زبان اسمبلی می باشد موجب می شود که عدد 01  به درون رجیستر eax  که  یک رجیستر 32 بیتی در پردازنده ی اینتل می باشد  کپی شود .  همانطور که می بینید  دستورالعمل  mov eax که یک دستور زبان اسمبلی می باشد مستقیما با کد B8 که یک کد زبان ماشین است مطابقت  دارد  و رابطه ای نظیر به نظیر دارد . اینجاست که می گوییم هر دستور زبان اسمبلی دقیقا با یک دستور زبان ماشین مطابقت دارد و اینست که اسمبلی را بسیار سریع و قدرتمند و انعطاف پذیر و کارآمد می نماید . فراموش نکنید که هرچه زبان برنامه نویسی سطح پایین تر باشد قدرتمندتر و سریعتر و هوشمندتر و کارامدتر است . زیرا به سخت افزار نزدیکتر می باشد . 

+

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


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


https://vahidmy.blog.ir








+

+

بروزرسانی: 

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


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


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


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


نکته : 

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




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

ِ

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



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


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


https://vahidmy.blog.ir



https://vahidmy.blog.ir/archive


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