فهرست دستورهای ایکس۸۶

از ویکی‌پدیا، دانشنامهٔ آزاد
(تغییرمسیر از فهرست دستورات اسمبلی)
پرش به: ناوبری، جستجو

مجموعه دستورالعمل ایکس۸۶ چندین بار گسترش یافته و هر بار ثبات‌ها و انواع داده‌ای گسترده‌تر و یا قابلیت‌های جدیدی را معرفی کرده است.

دستورهای عدد صحیح ایکس۸۶[ویرایش]

آنچه در ادامه می‌آید مجموعه دستورالعمل کامل ۸۰۸۶/۸۰۸۸ است، اما بیشتر این دستورها و نه همۀ آ‌ها، در حالت ۳۲ بیتی در دسترس هستند، و فقط روی مقادیر و ثبات‌های ۳۲ بیتی (EAX، EBX، و غیره) به جای متانظر ۱۶ بیتی آن‌ها (AX، BX، و غیره) به کار می‌روند.

دستورهای اصلی ۸۰۸۶/۸۰۸۸[ویرایش]

مجموعه دستورالعمل‌های اصلی ۸۰۸۶/۸۰۸۸
دستور معنی توضیحات آپ‌کد
AAA تنظیم کد اسکی AL بعد از عملیات جمع همراه با بی‌سی‌دی فشرده‌نشده استفاده می‌شود
AAD تنظیم کد اسکی AL قبل از عملیات تقسیم راهنمای منتشر شدۀ ۸۰۸۶/۸۰۸۸ فقط مبنای ۱۰ AAD را پوشش می‌دهد ولی در عمل مبناهای دیگر نیز قابل استفاده هستند.
AAM تنظیم کد اسکی AL بعد از عملیات ضرب
AAS تنظیم کد اسکی AL بعد از عملیات تفریق
ADC جمع با رقم نقلی مقصد := مقصد + مبدأ + فلگ نقلی
ADD جمع (1) r/m += r/imm; (2) r += m/imm;
AND عطف منطقی (1) r/m &= r/imm; (2) r &= m/imm;
CALL فراخوانی رویه push eip + 2 ; jmp operand
CBW تبدیل بایت به کلمه
CLC پاک کردن فلگ نقلی CF = 0;
CLD پاک کردن فلگ جهت DF = 0;
CLI پاک کردن فلگ وقفه IF = 0;
CMC مکمل کردن فلگ نقلی
CMP مقایسۀ عملوندها
CMPSB مقایسۀ بایت‌ها در حافظه
CMPSW مقایسۀ کلمه‌ها
CWD تبدیل کلمه به کلمه‌مضاعف
DAA تنظیم ده‌دهی AL بعد از عملیات جمع همراه با بی‌سی‌دی فشرده‌شده استفاده می‌شود.
DAS تنظیم ده‌دهی AL بعد از عملیات تفریق
DEC کم کردن یک واحد
DIV تقسیم بدون علامت DX:AX = DX:AX / r/m; resulting DX = remainder
ESC همراه با واحد ممیز-شناور استفاده می‌شود
HLT ورود به حالت توقف 0xF4
IDIV تقسیم با علامت DX:AX = DX:AX / r/m; resulting DX = remainder
IMUL ضرب با علامت (1) DX:AX = AX * r/m; (2) AX = AL * r/m
IN خواندن ورودی از درگاه (1) AL = port[imm]; (2) AL = port[DX]; (3) AX = port[DX];
INC اضافه کردن یک واحد
INT فراخوانی وقفه
INTO فراخوانی وقفه در صورت وجود سرریز
IRET بازگشت از وقفه
Jcc پرش‌های شرطی (JA, JAE, JB, JBE, JC, JE, JG, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ)
JCXZ پر در صورت صفر بودن CX
JMP پرش
LAHF بار کردن فلگ به ثبات AH
LDS بار کردن اشاره‌گر به DS
LEA بار کردن آدرس مؤثر
LES بار کردن ES با اشاره‌گر
LOCK اعلام سیگنال BUS LOCK# برای چندپردازی
LODSB بار کردن بایت رشته if (DF==0) AL = *SI++; else AL = *SI--;
LODSW بار کردن کلمه رشته if (DF==0) AX = *SI++; else AX = *SI--;
LOOP/LOOPx کنترل حلقه (LOOPE, LOOPNE, LOOPNZ, LOOPZ) if (x && --CX) goto lbl;
MOV Move کپی کردن داده از جایی به جای دیگر، (1) r/m = r; (2) r = r/m;
MOVSB انتقال بایت از رشته به رشته if (DF==0) *(byte*)DI++ = *(byte*)SI++; else *(byte*)DI-- = *(byte*)SI--;
MOVSW انتقال کلمه از رشته به رشته if (DF==0) *(word*)DI++ = *(word*)SI++; else *(word*)DI-- = *(word*)SI--;
MUL ضرب بدون علامت (1) DX:AX = AX * r/m; (2) AX = AL * r/m;
NEG تغییر علامت مکلمل دو r/m *= -1;
NOP بدون عمل معادل XCHG EAX, EAX 0x90
NOT نفی منطقی r/m ^= -1;
OR فصل منطقی = r/imm; (2) r |= m/imm;
OUT بردن خروجی به درگاه (1) port[imm] = AL; (2) port[DX] = AL; (3) port[DX] = AX;
POP گرفتن (pop) داده از پشته POP CS (آپ‌کد 0x0F) فقط در ۸۰۸۶/۸۰۸۸ کار می‌کند، و سی‌پی‌یوهای بعدی از 0x0F به عنوان پیشوند دستورهای جدید استفاده می‌کنند. SP++ = r/m; 0x0F
POPF گرفتن داده از ثبات فلگ *SP++ = flags;
PUSH گنجاندن (push) داده در پشته *--SP = r/m;
PUSHF گنجاندن فلگ‌ها در پشته *--SP = flags;
RCL گردش به چپ (با رقم نقلی)
RCR گردش به راست (با رقم نقلی)
REPxx تکرار شرطی دستورهای MOVS/STOS/CMPS/LODS/SCAS (REP, REPE, REPNE, REPNZ, REPZ)
RET بازگشت از رویه اسمبلر این دستور را بسته به مدل حافظۀ سیستم مقصد به RETN یا RETF تبدیل می‌کند.
RETN بازگشت از رویه نزدیک (near)
RETF بازگشت از رویه دور (far)
ROL گردش به چپ
ROR گردش به راست
SAHF ذخیرۀ AH در فلگ‌ها
SAL شیفت به چپ با علامت (1) r/m <<= 1; (2) r/m <<= CL;
SAR شیفت به راست با علامت (1) (signed)r/m >>= 1; (2) (signed)r/m >>= CL;
SBB تفریق با رقم قرضی جایگزین کدگذاری یک بایتی دستور SBB AL, AL از طریق دستور مستندنشدۀ SALC در دسترس است.
SCASB مقایسۀ رشته بایت
SCASW مقایسۀ رشته کلمه
SHL شیفت به چپ بدون علامت
SHR شیفت به راست بدون علامت
STC روشن کردن فلگ نقلی CF = 1;
STD روشن کردن فلگ جهت DF = 1;
STI روشن کردن فلگ وقفه IF = 1;
STOSB ذخیره بایت در رشته if (DF==0) *ES:DI++ = AL; else *ES:DI-- = AL;
STOSW ذخیره کلمه در رشته if (DF==0) *ES:DI++ = AX; else *ES:DI-- = AX;
SUB تفریق (1) r/m -= r/imm; (2) r -= m/imm;
TEST قیاس منطقی (AND) (1) r/m & r/imm; (2) r & m/imm;
WAIT انتظار تا وقتی که مشغول نباشد منتظر می‌ماند تا پین BUSY # غیر فعال شود (در واحد ممیز-شناور استفاده می‌شود)
XCHG جابه‌جا کردن داده r :=: r/m;
XLAT ترجمه با مراجعه به جدول مانند MOV AL, [BX+AL] عمل می‌کند.
XOR یای مانعةالجمع (1) r/m ^= r/imm; (2) r ^= m/imm;

اضافه شده در پردازنده‌های خاص[ویرایش]

اضافه شده با ۸۰۱۸۶/۸۰۱۸۸[ویرایش]

دستور معنی توضیحات
BOUND بررسی حدود ایندکس آرایه اگر آزمایش با شکست مواجه شود وقفۀ نرم‌افزاری ۵ را افزایش می‌دهد
ENTER ورود به قاب پشته معادل دستورهای
Push (E)BP
Set a temporary value (E)FRAME_PTR:=(E)SP
If LEVEL > 0 then
   Repeat (LEVEL - 1) times:
      (E)BP:=(E)BP - 2
      Push the word pointed to by (E)BP
   End repeat
   Push (E)FRAME_PTR
End if
(E)BP:=(E)FRAME_PTR
(E)SP:=(E)SP - first operand.
INS گرفتن ورودی از درگاه و انتقال به رشته معادل دستورهای
IN (E)AX, DX
MOV ES:[(E)DI], (E)AX
; adjust (E)DI according to operand size and DF
LEAVE ترک کردن قاب پشته معادل دستورهای
MOV SP, BP
POP BP
OUTS بردن رشته خروجی به درگاه معادل دستورهای
MOV (E)AX, DS:[(E)SI]
OUT DX, (E)AX
; adjust (E)SI according to operand size and DF
POPA گرفتن همۀ ثبات‌های عمومی از پشته معادل دستورهای
POP DI
POP SI
POP BP
POP AX ;no POP SP here, only ADD SP,2
POP BX
POP DX
POP CX
POP AX
PUSHA گنجاندن همه ثبات‌های عمومی در پشته معادل دستورهای
PUSH AX
PUSH CX
PUSH DX
PUSH BX
PUSH SP
PUSH BP
PUSH SI
PUSH DI

اضافه شده با ۸۰۲۸۶[ویرایش]

دستو معنی توضیحات
ARPL تنظیم قسمت RPL انتخاب کننده
CLTS پاک کردن فلگ وظیفه در ثبات CR0
LAR خواندن بایت حقوق دسترسی
LGDT خواندن جدول توصیف سراسری
LIDT خواندن جدول توصیف وقفه
LLDT خواندن جدول توصیف محلی
LMSW خواندن کلمه وضعیت ماشین
LOADALL خواندن همۀ ثبات‌های سی‌پی‌یو شامل ثبات‌های داخلی مانند جی‌دی‌تی مستند نشده، فقط در ۸۰۲۸۶ و ۸۰۳۸۶
LSL خواندن حد سگمنت
LTR خواندن ثبات وظیفه
SGDT ذخیره جدول توصیف سراسری
SIDT ذخیره جدول توصیف وقفه
SLDT ذخیره جدول توصیف محلی
SMSW ذخیرۀ کلمه وضعیت ماشین
STR ذخیرۀ ثبات وظیفه
VERR مشخص کردن سگمنت برای خواندن
VERW مشخص کردن سگمنت برای نوشتن

اضافه شده با ۸۰۳۸۶[ویرایش]

دستور معنی توضیحات
BSF اسکن بیت به جلو
BSR اسکن بیت به عقب
BT سنجش بیت
BTC سنجش بیت و مکمل کردن آن
BTR سنجش بیت و پاک کردن آن
BTS سنجش بیت و روشن کردن آن
CDQ تبدیل double-word به quad-word Sign-extends EAX into EDX, forming the quad-word EDX:EAX. Since (I)DIV uses EDX:EAX as its input, CDQ must be called after setting EAX if EDX is not manually initialized (as in 64/32 division) before (I)DIV.
CMPSD مقایسه رشته کلمه-مضاعف Compares ES:[(E)DI] with DS:[SI]
CWDE تبدیل کلمه به کلمه-مضاعف Unlike CWD, CWDE sign-extends AX to EAX instead of AX to DX:AX
INSD خواندن از درگاه و انتقال به کلمه-مضاعف
IRETx Interrupt return; D suffix means 32-bit return, F suffix means do not generate epilogue code (i.e. LEAVE instruction) Use IRETD rather than IRET in 32-bit situations
JECXZ پرش در صورت صفر بودن ECX
LFS, LGS خواندن اشاره‌گر دور
LSS خواندن سگمنت پشته
LODSD خواندن رشته کلمه-مضاعف can be prefixed with REP
LOOPW, LOOPccW حلقه شرطی Same as LOOP, LOOPcc for earlier processors
LOOPD, LOOPccD گردش تا زمان برابر بودن if (cc && --ECX) goto lbl;, cc = Z(ero), E(qual), NonZero, N(on)E(qual)
MOVSD انتقال رشته کلمه-مضاعف *(dword*)ES:EDI±± = (dword*)ESI±±; (±± depends on DF)
MOVSX انتقال و گسترش با علامت (long)r = (signed char) r/m; and similar
MOVZX انتقال و گسترش با صفر (long)r = (unsigned char) r/m; and similar
OUTSD خروجه به درگاه از رشته کلمه-مضاعف port[DX] = *(long*)ESI±±; (±± depends on DF)
POPAD گرفتن همۀ ثبات‌های کلمه-مضاعف از پشته Does not pop register ESP off of stack
POPFD گرفتن داده از پشته و انتقال به ثبات EFLAGS
PUSHAD گنجاندن همۀ ثبات‌های کلمه-مضاعف در ثبات
PUSHFD گنجاندن ثبات EFLAGS در پشته
SCASD اسکن داده رشته کلمه-مضاعف
SETcc تنظیم بایت به یک در صورت درست بودن شرط و در غیر این صورت صفر کردن آن (SETA, SETAE, SETB, SETBE, SETC, SETE, SETG, SETGE, SETL, SETLE, SETNA, SETNAE, SETNB, SETNBE, SETNC, SETNE, SETNG, SETNGE, SETNL, SETNLE, SETNO, SETNP, SETNS, SETNZ, SETO, SETP, SETPE, SETPO, SETS, SETZ)
SHLD شیفت به چپ کلمه-مضاعف
SHRD شیفت به راست کلمه-مضاعف r1 = r1>>CL ∣ r2<<(32-CL); Instead of CL, immediate 1 can be used
STOSD ذهیره رشته کلمه-مضاعف *ES:EDI±± = EAX; (±± depends on DF, ES cannot be overridden)

اضافه شده با ۸۰۴۸۶[ویرایش]

دستور معنی توضیحات
BSWAP جابجایی بایت r = r<<24 | r<<8&0x00FF0000 | r>>8&0x0000FF00 | r>>24; Only works for 32 bit registers
CMPXCHG مقایسه و جابجایی اتمی
INVD باطل کردن کاشه داخلی Flush internal caches
INVLPG باطل کردن ورودی TLB Entry Invalidate TLB Entry for page that contains data specified
WBINVD بازنویسی و باطل کردن کاشه Writes back all modified cache lines in the processor's internal cache to main memory and invalidates the internal caches.
XADD جمع و جابجایی Exchanges the first operand with the second operand, then loads the sum of the two values into the destination operand.

منابع[ویرایش]

  • مشارکت‌کنندگان ویکی‌پدیا، «x86 instruction listings»، ویکی‌پدیای انگلیسی، دانشنامهٔ آزاد (بازیابی در ۲۳ شهریور ۱۳۹۲).