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
درس بعدی در رابطه با استک یا پشته می باشد . اگر عمری باشد به امید خدا درس بعدی را که در رابطه با پشته و حافظه ی کامپیوتر می باشد ارائه می دهم . انشاء ا...
وحید محمدی . وبلاگ وحیدمی