وو

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

وو

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

AND



Assembly is real open source .





and


دستور  and 

Usage: AND dest,src Modifies flags: CF OF PF SF ZF (AF undefined)


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


دستور and بجز  پرچم AF سایر پرچمها را اصلاح می کند .

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





Performs a logical AND of the two operands replacing the destination with the result.

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


Bitwise AND

 دستور and  منطقی (عقلانی ) .


در مورد عبارات زیر در اولین فرصت توضیح خواهم داد :

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



بروزرسانی :


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


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


پست add  را حتما بخوانید تا هم به رمزگشایی 99 درصدی دست یابید و هم با ایده ها و انتقادات و پیشنهادات ام آشنا شوید .







AND r/m8,reg8 ; 20 /r [8086]

AND r/m16,reg16 ; o16 21 /r [8086]

AND r/m32,reg32 ; o32 21 /r [386]

 

AND reg8,r/m8 ; 22 /r [8086]

AND reg16,r/m16 ; o16 23 /r [8086]

AND reg32,r/m32 ; o32 23 /r [386]

 

AND r/m8,imm8 ; 80 /4 ib [8086]

AND r/m16,imm16 ; o16 81 /4 iw [8086]

AND r/m32,imm32 ; o32 81 /4 id [386]

 

AND r/m16,imm8 ; o16 83 /4 ib [8086]

AND r/m32,imm8 ; o32 83 /4 ib [386]

 

AND AL,imm8 ; 24 ib [8086]

AND AX,imm16 ; o16 25 iw [8086]

AND EAX,imm32 ; o32 25 id [386]

 

AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the 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.

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

 

The MMX instruction PAND performs the same operation on the 64-bit MMX registers.

دستورالعمل PAND ( از خانواده ی MMX ) همان عملیات را روی رجیسترهای 64 بیتی MMX  اجرا می نماید .

+

+

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


نکته : عباراتی همچون  Do  و On و Do_Loop   ماکرو می باشند و هیچکدامشان دستور زبان اسمبلی نیستند .


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

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

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




 

main:

std       ; set direction flag

Do

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

On al > '9', add al 7

stosb | shr ebx 4

Do_Loop

cld          ; clear  direction flag


ret


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


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


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



+


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

+

+

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


ADDSUBPS


Assembly is real open source.



addsubps


دستور ADDSUBPS


Usage: ADDSUBPS dest,src Modifies flags: None


دستور ADDSUBPS روی هیچکدام از رجیسترهای پرچم تاثیر ندارد .




Add/Subtract packed SP FP numbers from 'src' to 'dest'.

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



Packed Single-FP Add/Subtract

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

ADDSUBPS xmm1, xmm2/mem128 ; F2 0F D0 /r [Pent4]


قابل اجرا روی اینتل پنتیوم 4 

 

Adds odd-numbered single-precision floating-point values of the 'src' operand (second operand) with the corresponding single-precision floating-point values from the 'dest' operand (first operand); stores the result in the odd-numbered values of the 'dest' operand. Subtracts the even-numbered single-precision floating-point values in the 'src' operand from the corresponding single-precision floating values in the 'dest' operand; stores the result into the even-numbered values of the 'dest' operand.

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


 

When the source operand is a memory operand, it must be aligned on a 16-byte boundary or a general-protection exception (#GP) will be generated.

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


xmm1[31-0] = xmm1[31-0] - xmm2/m128[31-0];

xmm1[63-32] = xmm1[63-32] + xmm2/m128[63-32];

xmm1[95-64] = xmm1[95-64] - xmm2/m128[95-64];

xmm1[127-96] = xmm1[127-96] + xmm2/m128[127-96]



مثال :


main:

addsubps     xmm1   Label


ret


+

+

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


ADDSUBPD


Assembly is real open source.


addsubpd 

دستور  ADDSUBPD


Usage: ADDSUBPD dest,src Modifies flags: None


دستور ADDSUBPD  روی هیچکدام از رجیسترهای پرچم تاثیر ندارد .



Add/Subtract packed DP FP numbers from 'src' to 'dest'.

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

Packed Double-FP Add/Subtract

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


ADDSUBPD xmm1, xmm2/mem128 ; 66 0F 00 /r [Pent4]

 این دستور روی پردازنده ی پنتیوم 4 اجرا می شود .


Adds the double-precision floating-point values in the high quadword of the 'src' and 'dest' operands and stores the result in the high quadword of the 'dest' operand. Subtracts the double-precision floating-point value in the low quadword of the 'src' operand from the low quadword of the 'dest'  operand and stores the result in the low quadword of the 'dest' operand.

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

 

When the source operand is a memory operand, it must be aligned on a 16-byte boundary or a general-protection exception (#GP) will be generated.

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



xmm1[63-0] = xmm1[63-0] - xmm2/m128[63-0];

xmm1[127-64] = xmm1[127-64] + xmm2/m128[127-64]

 

مثال :


main:

addsubpd    xmm1  xmm2


ret


+

+

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


ADDSS

Assembly is real open source.



addss 

دستور ADDSS

Usage: ADDSS dest,src Modifies flags: None

این دستور روی هیچکدام از  رجیسترهای  پرچم تاثیر ندارد .


Adds the low single-precision floating-point values from the 'src' and the 'dest', and stores the single-precision floating-point result in the 'dest' operand.

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



دستور ADDSS مخفف عبارت زیر می باشد :

ADD Scalar Single-Precision FP Values

 


الگوی کلی دستورالعمل :

خانواده ی SSE2

ADDSS xmm1,xmm2/mem32 ; F3 0F 58 /r [WILLAMETTE,SSE2]

 

ADDSS adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

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

 

dst[0-31] := dst[0-31] + src[0-31],

dst[32-127] remains unchanged.

 

The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location. The three high-order doublewords of the 'dest' operand remain unchanged.

مقصد ، یک رجیستر XMM می باشد .  عملوند مبدا می تواند یک رجیستر XMM را یک آدرس حافظه ی 32 بیتی باشد . 3 دابل ورد بالایی حافظه عملوند مقصد ، بصورت دست نخورده باقی می ماند .


مثال :



main:

adds    xmm1  label


ret


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


ADDSD

Assembly is real open source.


addsd

 


دستور ADDSD

Usage: ADDSD dest,src Modifies flags: None


 این دستور روی هیچکدام از رجیسترهای پرچم تاثیر ندارد .


Adds the low double-precision floating-point values from the 'src' operand and the 'dest' operand, and stores the double-precision floating-point result in the 'dest' operand. The 'src' operand can be an XMM register or a 64-bit memory location. operand remains unchanged.

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

عملوند مبدا می تواند یک رجیستر XMM  یا یک مکان حافظه ی 64 بیتی باشد .

عملوند بدون تغییر باقی می ماند .




دستور ADDSD مخفف عبارت زیر است :

ADD Scalar Double-Precision FP Values

 


الگوی کلی دستور:

ADDSD xmm1,xmm2/mem64 ; F2 0F 58 /r [KATMAI,SSE]

 


ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

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

 



dst[0-63] := dst[0-63] + src[0-63],

dst[64-127) remains unchanged.

 

The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

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


 

SIMD Floating-Point Exceptions

استثنائات :


Overflow, Underflow, Invalid, Precision, Denormal.

سرریز ، پاریز ، بی اعتبار ، دقت ، غیرطبیعی


مثال :

 

Main:


addsd    xmm1   label


ret



+

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


ADDPS

Assembly is real open source.



addps 

دستور ADDPS


Usage: ADDPs dest,src Modifies flags: None


این دستور روی هیچکدام از رجیسترهای پرچم تاثیر ندارد . 




Performs an SIMD add of the four packed single-precision floating-point values from the 'src' operand and the 'dest' operand , and stores the packed single-precision floating-point results in the 'dest' .

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


دستور ADDPS مخفف عبارت زیر می باشد :


ADD Packed Single-Precision FP Values

 

ADDPS xmm1,xmm2/mem128 ; 0F 58 /r [KATMAI,SSE]

 این دستورالعمل از استاندارد SSE پشتیبانی می نماید .


ADDPS performs addition on each of four packed single-precision FP value pairs

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

 

dst[0-31] := dst[0-31] + src[0-31],

dst[32-63] := dst[32-63] + src[32-63],

dst[64-95] := dst[64-95] + src[64-95],

dst[96-127] := dst[96-127] + src[96-127].

 

The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

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


استثنائات ممیز شناور SIMD :


 

SIMD Floating-Point Exceptions


Overflow, Underflow, Invalid, Precision, Denormal.

سرریز ، پاریز ، بی اعتبار ، دقت ، غیرطبیعی


+

مثال :

 


main:


addps    xmm1   label


ret


+

+

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



ADDPD

Assembly is real open source.




addpd

دستور addpd






Usage: ADDPD dest,src Modifies flags:None

روش بکارگیری : از چپ به راست  دستور addpd  ، عملوند مقصد ، عملوند مبدا



Performs an SIMD add of the two packed double-precision floating-point values from the 'src' and the 'dest' operand and stores the packed double-precision floating-point results in the 'dest' operand. The 'src' operand can be an XMM register or a 128-bit memory location. The 'dest' operand is an XMM register.

دستور ADDPD  یک عملیات جمع  SIMD روی دو مقدار ممیز شناور با دقت مضاعف بسته ای روی عملوند مبدا و مقصد اجرا می کند و  نتایج ممیز شناور با دقت مضاعف بسته ای را در عملوند مقصد ذخیره می کند  .  عملوند مبدا می تواند یک رجیستر XMM یا یک مکان 128 بیتی آدرس باشد . عملوند مقصد یک رجیستر XMM می باشد .


دستور ADDPD مخفف عبارت زیر است :


ADD Packed Double-Precision FP Values

 



 



ADDPD xmm1,xmm2/mem128 ; 66 0F 58 /r [WILLAMETTE,SSE2]


در فرمول بالا ، بعد از دستور ADDPD ، عملوند مقصد می تواند یک رجیستر XMM باشد مثلا xmm1  و عملوند مبدا ( عملوند سمت راست ) می تواند یا یک رجیستر xmm  باشد ( مثلا xmm2 ) یا یک آدرس 128 بیتی حافظه باشد .


کاراکتر  /  به  معنای  یا  می باشد . دستور ADDPD در این حالت به کد 660F58 تبدیل می شود . r  در اینجا می تواند به معنای register باشد . SSE2 یک استاندارد جدید است که از تعدادی دستورالعمل جدید پردازنده ی اینتل پشتیبانی می نماید .


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


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

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


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


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




ADDPD performs addition on each of two packed double-precision FP value pairs.

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



 


dst[0-63] := dst[0-63] + src[0-63],


dst[64-127] := dst[64-127] + src[64-127].




 



The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

  مقصد ؛ یک رجیستر XMM می باشد ( که در نقش یک عملوند ظاهر می شود زیرا این دستور مربوط به خود پردازنده است ) . عملوند مبدا می تواند یا یک رجیستر XMM  یا یک ادرس  از حافظه ی 128 بیتی باشد .



 


SIMD Floating-Point Exceptions

استثنائات ممیز  شناور SIMD  می تواند در مورد مسائل زیر باشد:



Overflow, Underflow, Invalid, Precision, Denormal.

سرریز ، پاریز ، بی اعتبار ، دقت ، غیرطبیعی



+

الگوی مفهومی  کاربرد این دستور  در RosAsm :


به جای xmm1   و  Label باید  عبارت مناسبی را بنویسیم تا برنامه اجرا شود .


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


ابتدا مطمئن شوید که پردازنده ی کامپیوترتان از استانداردهای تخصصی  XMM و  SSE2 و مجموعه ی دستورالعملهای جدید  ، پشتیبانی می کند .






main:



addpd   xmm1  label


ret


+

+

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


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