فهرست دستورهای ایکس۸۶
مجموعه دستورالعمل ایکس۸۶ چندین بار گسترش یافته و هر بار ثباتها و انواع دادهای گستردهتر یا قابلیتهای جدیدی را معرفی کرده است.
دستورهای عدد صحیح ایکس۸۶
آنچه در ادامه میآید مجموعه دستورالعمل کامل ۸۰۸۶/۸۰۸۸ است، اما بیشتر این دستورها و نه همهٔ آها، در حالت ۳۲ بیتی در دسترس هستند، و فقط روی مقادیر و ثباتهای ۳۲ بیتی (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 = ۰; | |
CLD | پاک کردن فلگ جهت | DF = ۰; | |
CLI | پاک کردن فلگ وقفه | IF = ۰; | |
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==۰) *(byte*)DI++ = *(byte*)SI++; else *(byte*)DI-- = *(byte*)SI--; | |
MOVSW | انتقال کلمه از رشته به رشته | if (DF==۰) *(word*)DI++ = *(word*)SI++; else *(word*)DI-- = *(word*)SI--; | |
MUL | ضرب بدون علامت | (1) DX:AX = AX * r/m; (2) AX = AL * r/m; | |
NEG | تغییر علامت مکلمل دو | r/m *= -۱; | |
NOP | بدون عمل | معادل XCHG EAX, EAX | 0x90 |
NOT | نفی منطقی | r/m ^= -۱; | |
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 = ۱; | |
STD | روشن کردن فلگ جهت | DF = ۱; | |
STI | روشن کردن فلگ وقفه | IF = ۱; | |
STOSB | ذخیره بایت در رشته | if (DF==۰) *ES:DI++ = AL; else *ES:DI-- = AL; | |
STOSW | ذخیره کلمه در رشته | if (DF==۰) *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. |