https://vahidmy.blog.ir/post/208
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