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