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