vahidmy

وبلاگ شخصی وحید محمدی

vahidmy

وبلاگ شخصی وحید محمدی

وحیدمی

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


آدرس وبلاگ وحیدمی :

Home Page


https://vahidmy.blog.ir

+


Archive

آرشیو و بایگانی وبلاگ وحیدمی

https://vahidmy.blog.ir/archive

+


نقشه وبلاگ وحیدمی:

Sitemap

https://vahidmy.blog.ir/sitemap.xml

+

خوراکخوان وبلاگ وحیدمی

Feed

RSS

https://vahidmy.blog.ir/rss

+

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

Robot

https://vahidmy.blog.ir/robots.txt


+

مشخصات وبلاگ وحیدمی:


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

بیست و چهار ساعته

وضعیت انتشار پست : نامنظم . در طول شبانه روز و در صورت صلاحدید ؛ پست جدید منتشر می کنم.


نام مدیر : وحید محمدی

گونه : وبلاگ شخصی با آدرس اختصاصی و محتوای عمومی

ژانر : تمام ژانرها

کاربرد : همه منظوره

هدف وبلاگ : به اشتراک گذاشتن دانش و تجربه با مردم و پرداخت زکات علم

مقصد مدیر وبلاگ : کسب رضای خداوند .

جنس وبلاگ : وبلاگ شخصی

تاریخ تاسیس : تیر 1398 خورشیدی



موضوعات وبلاگ : تمام علوم و فنون و مسائل مختلف در تمام زمینه


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

بروزرسانی:

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

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



آدرس وبلاگهای تخصصی :

https://spasm.blog.ir

https://fasmy.blog.ir

https://binasm.blog.ir

طبقه بندی موضوعی
مطالب پربحث‌تر
  • ۰۱/۰۴/۱۱
    adc
نویسندگان
پیوندها

Registers

دوشنبه, ۴ اسفند ۱۳۹۹، ۰۱:۴۲ ق.ظ


 

Registers ..

 

 

رجیسترها ( ثبت کننده های درون  پردازنده):


The CPU Registers may be represented as small Memory units directly located on the CPU. From this point of view, they are faster Memories than the real physical Memory. Also, several CPU Instructions make use of pre-defined Registers. In Win32 Assembly Applications programing, the commonly used Registers are:



 

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



GP (General Purpose) Registers:

ثباتهای چند منظوره:

 

eax, ax, ah, al

ebx, bx, bh, bl

ecx, cx, ch, cl

edx, dx, dh, dl

 

Strings Registers:


ثباتهای رشته ها :


esi

edi

 




Stack Registers:




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


ebp

esp

(There are others of no interest in the very first steps, and of very little interest in Win32 Application writing).



 

چیزهای غیرجذاب در گامهای اولیه  ، و چیزهای کم جاذبه در برنامه نویسی نویسی 32 بیتی ویندوز ، وجود دارند .



The Flags Register is a particular Register that indicates the different states of CPU. More infos in Flags_and_Jcc.



 

 ثبات پرچم ها یک ثبات ویژه است که وضعیتهای متفاوت پردازنده را  مشخص می کند ( با ارقام 0 یا 1 )  . اطلاعات بیشتر را در بخش پرچمها و پرشها  ببینید .



You can write and read some values in all the Registers, according with their sizes: The first thing to know about a Register, before using it, is its size.




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


 

eax, ebx, ecx, edx, esi, edi, ebp, esp = dWord = 4 Bytes [0 > 4,294,967,295]



از  صفر بایت  تا   4294967295  بایت فضای آدرسدهی حافظه (32 بیت ) معادل با 4 گیگابایت حافظه ی رم  در ویندوزهای 32 بیتی . کامپیوترهای قدیمی که پردازنده ی 32 بیتی پنتیوم  داشتند .   (دسیمال)



ax, bx, cx, dx = Words = 2 Bytes [0 > 65,535]



از صفر تا  65535  بایت فضای آدرسدهی حافظه رم معادل با 2 گیگابایت حافظه ی رم در ویندوزهای 16 بیتی و سیستم عامل داس  ( 16 بیت ) (دسیمال) . کامپیوترهای بسیار قدیمی حاوی سیستم عامل داس و ویندوزهای 1 تا 98 . تمامی ویندوزهای قدیمی 16 بایتی .




ah, al, bh, bl, ch, cl, dh, dl = 1 Byte [0 > 255]



 از عدد صفر تا  عدد  255  (دسیمال ) . سیستمهای بسیار بسیار قدیمی 8 بیتی و منسوخ شده  . سیستم عاملهای بسیار قدیمی 8 بیتی مثل مولتیکس ، یونیکس ، بی اس دی یونیکس ، سیستم عاملهای 8 بیتی خانواده ی داس شامل سیستم عامل بسیار قدیمی سی پی ام  و هر نوع سیستم عامل و یا میکروپروسسور و میکروکنترولر  8  بیتی .

فضای آدرسدهی حافظه ی اصلی  در این سیستم ها فقط  8 بیت گنجایش داشته است . لذا سیستم عاملها نیز 8 بیتی بوده اند .



ah, al are parts of ax. ax is part of eax; idem for b... , c... , d... Like this:



 ah و al بخشهایی از  رجیستر  ax می باشند .  رجیستر ax  بخشی از رجیستر eax  می باشد . ایضا (همچنین ) همین قاعده برای ثباتهایی که نامشان با حروف b و c و d  شروع می شود صدق می کند .  مانند این : 



____________________

__| __| __| __| eax ; full 4 Bytes register

__| __| __| __| ax ; lower half 2 Bytes of eax

__| __| __| __| ah ; higher half of ax

__| __| __| __| al ; lower half of ax



 

eax : ثبات چهاربایتی کامل (32 بیتی - برای سیستم عامل 32 بیتی )

ax : دو بایت نیمه ی کم ارزش ثبات eax

ah : نیمه ی پر ارزش  ax

al :  نیمه ی کم ارزش ax 



This representation is easier to understand at a byte level. Reading from right to left, you have 4 Bytes in each Register. You can also view them as sets of 32 bits units, from Bit 0 to Bit 31.




این نمایش برای درک (مفاهیم ) در یک سطح بایت ، آسانتر است .  با خواندن از راست به چپ  ، شما 4 بایت در هر ثبات دارید . شما همچنین می توانید  به آنها همچون  مجموعه های از واحدهای 32 بیتی نگاه کنید ، از بیت 0 تا بیت  31 .


 


 

AL is called the LOW byte of EAX and of AX

AH is called the HIGH Byte of AX.

AX is called the LOW word of eax.




AL بایت کم ارزش eax و ax نامیده می شود

AH  بایت پر ارزش AX نامیده می شود

AX  کلمه ی کم ارزش از eax نامیده می شود .





To read the first BYTE in the EAX register (bits 0 to 7), and store its Value into a Memory Address, you may use, for example:





برای خواندن اولین بایت در ثبات eax ( بیتهای 0 تا 7 ) ، و انباشتن مقدار به درون یک آدرس حافظه ، ، شما می توانید ( اجازه دارید ) بکار ببرید ، بعنوان مثال :



 

mov B$byteval al   ; move 1st byte size value into the 'byteval' variable.




کپی کردن اولین مقدار بایت از ثبات  al  به داخل متغیر  byteval 


(توضیح مترجم:  عبارت   mov B$byteval  al    یک  دستورالعمل زبان اسمبلی است که در ان متغیر درون ثبات al  به درون  متغیر  byteval که به اندازه ی 1 بایت حجم دارد  کپی می شود .

نکته :

در اسمبلر RosAsm شما نیازی به استفاده از علامت کاما بین عملوندهای مبدا و مقصد ندارید .  لذا بین al که عملوند مبدا می باشد و B$byteval

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

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


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

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

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

نکته :

در اسمبلر  RosAsm  برای نشان دادن مقادیر از  علامت  دلار  (استرینگ ) استفاده می شود . اینجا  $   مخفف  string ( یعنی یک رشته از بایت یا ورد یا دی ورد ) می باشد . در این دستور مقدار متغیر برابر با بایت است .

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

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

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

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


ادامه ی ترجمه:





To read the second BYTE in the EAX register (bits 8 to 15)), and store its Value into a Memory Address, you may use, for example:



برای خواندن بایت دوم در ثبات eax  ( بیتهای 8 تا 15  )  ، و نگهداری مقدارش در داخل یک آدرس حافظه ، شما می توانید (اجازه دارید)  بعنوان مثال چنین دستوری را بکار ببرید :



 

mov B$byteval ah    ; move 2nd byte size value into the 'byteval' variable.





 

Same for the first WORD (bits 0 to 15):





 همان روش برای اولین ورد ( کلمه  = بیتهای 0 تا 15  ) :




mov W$wordval ax ; move 1st word size value into the 'wordval' variable.

 


To get at bits 16 to 31, you must rotate the bits in the register so they can be accessed by the previous instructions. Rotating a 32 bit register in either direction by 16 bits moves the LOW 16 bits into the HIGH 16 bits and the HIGH 16 bits into the low 16 bits of the register.





برای رسیدن به بیتهای  16 تا 31  ، شما باید بچرخانید بیتها را در ثبات طوریکه انها بتوانند قابل دسترس باشند بوسیله ی دستورالعملهای قبلی . چرخاندن یک ثبات 32 بیتی در هر  جهت (راست یا چپ )  بوسیله ی  16 بیت ،  کپی می کند  16 بیت کم ارزش را به داخل 16 بیت پر ارزش  و  16 بیت پر ارزش را به داخل 16 بیت کم ارزش ثبات .


 

If you need to read and store, in a Memory Word, say, only the higher Word of EAX, you have to modify the content of EAX with the ROL or with the ROR Instructions:






اگر شما نیاز دارید به خواندن و نگهداری ، در یک کلمه ی حافظه ، مثلا ، فقط کلمه ی بالاتر ثبات eax ،  آنگاه شما مجبورید اصلاح کنید محتویات ثبات eax را با استفاده از دستورالعملهای  ROL  یا  ROR  زبان اسمبلی :


(توضیح مترجم:  دستور ROR محتویات ثبات را به سمت راست و  دستور  ROL   محتویات ثبات را به سمت چپ  می چرخاند که متاسفانه در این متن ، مولف به این موضوع اشاره ای نکرده است .


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


ادامه ی ترجمه:



 

rol eax 16 ; rotate EAX by 16 bits

or

ror eax 16 ; rotate EAX by 16 bits

 

... Then, the Higher Word is now in AX.




 

آنگاه ، اکنون کلمه ی بالاتر در ثبات  AX قرار می گیرد .




In all x86 Instructions, involving a Source and a Destination, the sizes of the two members must be the same. You cannot mix, for example, Bytes and dWords in one single operation:




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



mov eax cl ; Error: eax is 32 bit, cl is 8 bit

 

Though the upper rule does not apply on MOVSX and MOVZX Mnemonics, whose purpose is exactly with saving you from such situation:




اگرچه قانون بالا بر روی دستورات  MOVSX  و MOVZX   اعمال  نمی شود ، مقصود ما کاملا  نجات دادن شما از چنین وضعیتی می باشد:



 

movzx eax cl ; 'z' stands for 'zero' extended unsigned integer operation.


 

عملیات عدد صحیح بدون علامت




movsx eax cl ; 'S' stands for 'sign' extended signed

integer operation

 





عملیات عدد صحیح با علامت




In some cases you may use,



 

در برخی موارد شما می توانید (اجازه دارید) بکار ببرید ،




mov eax 0 ; clear eax.

mov al cl ; copy cl into al.



 

Some less often used mnemonics also do this kind of conversion:



 

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




mov al cl ; copy cl into al

cbw ; convert BYTE in AL to WORD in AX

cwde ; convert WORD in AX to DWORD in EAX

 

 

 

Each Register may have some specific usage:



 

هر ثبات می تواند برخی کاربردهای خاص را داشته باشد:



 



General Purpose Registers

 



ثباتهای چند منظوره:



eax, ebx, ecx, edx, are called 'General Purpose Registers', but they may have some specific task to assume under certain circumstances




eax ، ebc ، ecx  ، edx   تحت عنوان " ثباتهای چند منظوره " نامیده می شوند ، اما   آنها می توانند وظایف خاصی برای بعهده گرفتن  تحت کیفیتهای   معین را داشته باشند :  




eax, 'Accumulator', is the most ''general purpose'' of all but it is slightly specialized for mathematical source and results.




eax ، " انباره " چند منظوره تر از تمام ثباتها می باشد اما  آن کمی  برای منبع و نتایج محاسباتی  اختصاص داده شده است.




ebx, 'Base', is often used for indexing.




ebx ، بیس ، پایه ، اغلب برای شاخص گذاری بکار رفته است .

( مترجم: ثبات ebx در سیستم عامل ویندوز بعنوان ثبات پایه ی سیستم عامل بکار می رود و از قبل رزرو شده است  لذا نباید انرا همینطوری دستکاری کرد . چون ممکن است ویندوز را ناپایدار کند . برای هر کاری از همان ثبات eax استفاده کنید ) .



ecx, 'Counter' is the required one for some counts.





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




edx, 'Data', is required for some integer Math

operations




edx ، داده . این ثبات برای انجام  برخی عملیاتهای ریاضی صحیح  روی داده ،  مورد نیاز می باشد .  


 

Offset Registers


ثباتهای آدرس   




esi and edi, Source and Destination Index, have specific usage in Strings_Instructions but can also be used for anything else you want.





esi و  edi  ، ثباتهای شاخص منبع و مقصد . کاربرد ویژه در دستورالعملهای رشته ها دارند اما می توانند همچنین  برای هر کار دیگری که شما بخواهید بکار روند .




ebp and esp, Base and Stack Pointers, are for Stack management. ebp can be used for what you want, but not esp. ebp is usually reserved for Stack pointing, in HLL style writing. esp is, most often, modified directly by several instructions (Call / Ret / Push / Pop ...). Out of the HLL macros for Stack frames managing, you should refrain from modifying esp or ebp.






 ebp و esp  : اشاره گرهای به بیس و پشته   ، برای مدیریت پشته بکار می روند . ebp می تواند برای هر مقصودی که شما می خواهید بکار رود اما esp نمی تواند برای هر منظوری بکار رود .

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




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

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

مجددا تاکید می کنم از هرگونه دستکاری ثباتهای ebp و esp  جدا خودداری نمایید .

ثباتهای ebp  و  esp  را می توانید در دیس اسمبلی  ویندوز و نرم افزارهای تجاری ویندوز که توسط زبانهای سطح بالا ساخته شده اند  در قالب روالها  مشاهده کنید . بدین شکل :




push  ebp

mov ebp , esp

….

mov  esp , ebp

pop  ebp





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

در واقع این روتین با عبارتی همچون  proc  مطابقت دارد .  این روتین در زبان اسمبلی نیز زیاد بکار می رود  و همان کاربرد را دارد یعنی روال . )


پایان ترجمه و توضیح .


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


عنوان درس بعدی  این است :




The Stack




درس بعدی در رابطه با  استک یا  پشته می باشد .  اگر عمری باشد به امید خدا درس بعدی را که در رابطه با پشته و حافظه ی کامپیوتر می باشد ارائه می دهم . انشاء ا... 


~~~~~~~


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




https://vahidmy.blog.ir




  • ۹۹/۱۲/۰۴
  • vahidmy

vahidmy