รายการคำสั่ง x86
| ส่วนหนึ่งของชุดบทความเกี่ยวกับ |
| รายการคำสั่ง x86 |
|---|
|
ชุดคำสั่งx86 หมายถึงชุดคำสั่งที่ไมโครโปรเซสเซอร์ที่เข้ากันได้กับ สถาปัตยกรรม x86รองรับ โดยปกติแล้วคำสั่งเหล่านี้จะเป็นส่วนหนึ่งของ โปรแกรม ที่สามารถเรียกใช้งานได้ซึ่งมักจัดเก็บในรูปแบบไฟล์คอมพิวเตอร์และถูกประมวลผลบนโปรเซสเซอร์
ชุดคำสั่ง x86 ได้รับการขยายหลายครั้ง โดยมีการแนะนำรีจิสเตอร์และชนิดข้อมูลที่กว้างขึ้น รวมถึงฟังก์ชันการทำงานใหม่ๆ[ 1 ]
คำสั่งจำนวนเต็ม x86
ด้านล่างนี้คือ ชุดคำสั่ง 8086 / 8088 แบบเต็ม ของ Intel (คำสั่งทั้งหมด 81 คำสั่ง) [ 2 ]คำสั่งเหล่านี้ยังมีให้ใช้งานในโหมด 32 บิต ซึ่งจะทำงานกับรีจิสเตอร์ 32 บิต ( eax , ebx , เป็นต้น) และค่าต่างๆ แทนที่จะเป็นค่า 16 บิต ( ax , bx , เป็นต้น) ชุดคำสั่งที่อัปเดตแล้วจะถูกจัดกลุ่มตามสถาปัตยกรรม ( i186 , i286 , i386 , i486 , i586 / i686 ) และเรียกว่า (32 บิต) x86และ (64 บิต) x86-64 (หรือที่รู้จักกันในชื่อAMD64 )
คำแนะนำดั้งเดิมสำหรับ 8086/8088
นี่คือชุดคำสั่งดั้งเดิม ในคอลัมน์ 'หมายเหตุ' rหมายถึงรีจิสเตอร์ m หมายถึงที่อยู่หน่วยความจำและimmหมายถึง ค่า คงที่ (immediate value)
| คำแนะนำ | ความหมาย | หมายเหตุ | รหัสปฏิบัติการ |
|---|---|---|---|
| แอลเอ | ปรับค่า ASCII AL หลังจากเพิ่ม | ใช้กับเลขฐานสองที่เข้ารหัสแบบไบนารี ที่ไม่ได้บรรจุ | 0x37 |
| เอเอดี | ปรับค่า ASCII AX ก่อนหาร | เอกสารข้อมูลจำเพาะของ 8086/8088 ระบุเฉพาะคำสั่ง AAD เวอร์ชันฐาน 10 ( รหัสปฏิบัติการ0xD5 0x0A ) เท่านั้น แต่ฐานอื่นๆ ก็สามารถใช้งานได้เช่นกัน เอกสารของ Intel ในภายหลังมีรูปแบบทั่วไปด้วย ซีพียู NEC V20และ V30 (และอาจรวมถึงซีพียู NEC V-series รุ่นอื่นๆ) ใช้ฐาน 10 เสมอ และไม่สนใจอาร์กิวเมนต์ ทำให้เกิดความไม่เข้ากันหลายประการ | 0xD5 |
| เอเอเอ็ม | ปรับค่า ASCII AX หลังการคูณ | มีการบันทึกเฉพาะเวอร์ชันฐาน 10 (ตัวดำเนินการคือ 0xA) เท่านั้น โปรดดูหมายเหตุสำหรับ AAD | 0xD4 |
| เอเอเอส | ปรับค่า ASCII AL หลังจากการลบ | 0x3F | |
| เอดีซี | เพิ่มด้วยการขนส่ง | (1) r += (r/m/imm+CF);(2)m += (r/imm+CF); | 0x10 ... 0x15 , 0x80 ... 0x81/2 , 0x83/2 |
| เพิ่ม | เพิ่ม | (1) r += r/m/imm;(2)m += r/imm; | 0x00 ... 0x05 , 0x80/0 ... 0x81/0 , 0x83/0 |
| และ | ตรรกะ AND | (1) r &= r/m/imm;(2)m &= r/imm; | 0x20 ... 0x25 , 0x80 ... 0x81/4 , 0x83/4 |
| เรียก | ขั้นตอนการโทร | (1) ผลัก IP, กระโดดภายในเซกเมนต์; (2) ผลัก CS:IP, กระโดดข้ามเซกเมนต์ | 0x9A , 0xE8 , 0xFF/2 , 0xFF/3 |
| ซีบีดับบลิว | แปลงไบต์เป็นเวิร์ด | AH = (sign)AL | 0x98 |
| ซีแอลซี | ธงที่ชัดเจน สำหรับการพกพา | CF = 0; | 0xF8 |
| ซีแอลดี | ธงแสดงทิศทางที่ชัดเจน | DF = 0; | 0xFC |
| ซีแอลไอ | ล้างแฟล็กการขัดจังหวะ | IF = 0; | 0xFA |
| ซีเอ็มซี | เสริมการถือธง | CF = !CF; | 0xF5 |
| ซีเอ็มพี | เปรียบเทียบตัวถูกดำเนินการ | (1) r - r/m/imm;(2)m - r/imm; | 0x38 ... 0x3D , 0x80 ... 0x81/7 , 0x83/7 |
| ซีเอ็มพีเอสบี | เปรียบเทียบไบต์ในหน่วยความจำ อาจใช้ร่วมกับคำนำหน้าREPEหรือREPNEเพื่อทดสอบและทำซ้ำคำสั่งCXครั้ง | ถ้า( DF == 0 ) * ( ไบต์* ) SI ++ - * ( ไบต์* ) ES : DI ++ ; อื่น* ( ไบต์* ) SI -- - * ( ไบต์* ) ES : DI -- ; | 0xA6 |
| ซีเอ็มพีเอสดับบลิว | เปรียบเทียบคำศัพท์ อาจใช้ร่วมกับ คำนำหน้า REPEหรือREPNEเพื่อทดสอบและทำซ้ำคำสั่งCXครั้ง | ถ้า( DF == 0 ) * ( คำ* ) SI ++ - * ( คำ* ) ES : DI ++ ; อื่น* ( คำ* ) SI -- - * ( คำ* ) ES : DI -- ; | 0xA7 |
| ซีดับบลิวดี | แปลงคำธรรมดาเป็นคำคู่ | DX = (เครื่องหมาย)AX | 0x99 |
| ดีเอเอ | ปรับค่าทศนิยม AL หลังจากบวก | (ใช้ร่วมกับBCD ที่บรรจุอุปกรณ์แล้ว ) | 0x27 |
| ดาส | ปรับค่าทศนิยม AL หลังจากการลบ | (ใช้ร่วมกับBCD ที่บรรจุอุปกรณ์แล้ว ) | 0x2F |
| ธันวาคม | ลดลง 1 | 0x48 ... 0x4F , 0xFE/1 , 0xFF/1 | |
| ดิฟ | หาร แบบไม่ระบุเครื่องหมาย | (1) AX = DX:AX / r/m; DX = remainder(2)AL = AX / r/m;] AH = remainder | 0xF7/6 , 0xF6/6 |
| เอสเอส | ใช้กับหน่วยประมวลผลทศนิยม | 0xD8 .. 0xDF | |
| เอชแอลที | เข้าสู่สถานะหยุดทำงาน | 0xF4 | |
| ไอดีวี | การแบ่งที่ลงนาม | (1) AX = DX:AX / r/m; DX = remainder(2)AL = AX / r/m; AH = remainder | 0xF7/7 , 0xF6/7 |
| อิมูล | การคูณแบบมีเครื่องหมายในรูปแบบตัวดำเนินการเดียว | (1) DX:AX = AX * r/m;(2)AX = AL * r/m | 0xF7/5 , 0xF6/5 |
| ใน | อินพุตจากพอร์ต | (1) AL = port[imm];(2) AL = port[DX];(3) AX = port[imm];(4)AX = port[DX]; | 0xE4 , 0xE5 , 0xEC , 0xED |
| บริษัท อิงค์ | เพิ่มขึ้นทีละ 1 | 0x40 ... 0x47 , 0xFE/0 , 0xFF/0 | |
| อินท์ | โทรเพื่อขัดจังหวะ | *--SP = แฟล็ก; *--SP = CS; *--SP = IP | 0xCC , 0xCD |
| เข้าไปข้างใน | เรียกฟังก์ชันเพื่อขัดจังหวะหากเกิดการล้น | ถ้า (O == 1) *--SP = FLAGS; *--SP = CS; *--SP = IP | 0xCE |
| ไอเร็ต | กลับจากการขัดจังหวะ | IP = *SP++, CS = *SP++, FLAGS = *SP++; | 0xCF |
| เจซีซี | กระโดดหากเงื่อนไข | JA, JAE, JB, JBE, JC (เหมือนกับ JB), JE, JG, JGE, JL, JLE, JNA (เหมือนกับ JBE), JNAE (เหมือนกับ JB), JNB (เหมือนกับ JAE), JNBE (เหมือนกับ JA), JNC (เหมือนกับ JAE), JNE, JNG (เหมือนกับ JLE), JNGE (เหมือนกับ JL), JNL (เหมือนกับ JGE), JNLE (เหมือนกับ JG), JNO, JNP, JNS, JNZ (เหมือนกับ JNE), JO, JP, JPE (เหมือนกับ JP), JPO (เหมือนกับ JNP), JS, JZ (เหมือนกับ JE) [ 3 ] | 0x70 ... 0x7F |
| เจซีเอ็กซ์ซี | กระโดดหาก CX เป็นศูนย์ | ใช้ JECXZแทน ECX แทน CX ในโหมด 32 บิต (รหัสคำสั่งเดียวกัน) | 0xE3 |
| เจเอ็มพี | กระโดด | (1) กระโดดภายในส่วน; (2) กระโดดระหว่างส่วน | 0xE9 ... 0xEB , 0xFF/4 , 0xFF/5 |
| แอลเอเอชเอฟ | โหลดค่า FLAGS ลงในรีจิสเตอร์ AH | 0x9F | |
| แอลดีเอส | โหลด DS:r ด้วยตัวชี้ระยะไกล | r = m; DS = 2 + m; | 0xC5 |
| ลีอา | โหลดที่อยู่ที่มีประสิทธิภาพ | 0x8D | |
| เลส | โหลด ES:r ด้วยตัวชี้ระยะไกล | r = m; ES = 2 + m; | 0xC4 |
| ล็อค | ยืนยันสัญญาณ BUS LOCK# | (สำหรับการประมวลผลแบบมัลติโปรเซสซิ่ง) | 0xF0 |
| ลอดส์บี | โหลดไบต์สตริง สามารถใช้ร่วมกับ คำนำหน้า REPเพื่อทำซ้ำคำสั่งCXครั้ง | if(DF==0)AL=*SI++;elseAL=*SI--; | 0xAC |
| LODSW | โหลดสตริงคำ อาจใช้ร่วมกับ คำนำหน้า REPเพื่อทำซ้ำคำสั่งCXครั้ง | if(DF==0)AX=*SI++;elseAX=*SI--; | 0xAD |
| ลูป / ลูปซ์ | การควบคุมลูป | ( ลูป, ลูป, LOOPNZ, LOOPZ )if(x&&--CX)gotolbl; | 0xE0 ... 0xE2 |
| โมวี | เคลื่อนไหว | (1) r = r/m/imm;(2) m = r/imm;(3) r/m = sreg;(4) sreg = r/m; | 0x88 ... 0x8C , 0x8E , 0xA0 ... 0xA3 , 0xB0 ... 0xBF , 0xC6 , 0xC7 |
| เอ็มวีเอสบี | ย้ายไบต์จากสตริงหนึ่งไปยังอีกสตริงหนึ่ง อาจใช้ร่วมกับ คำนำหน้า REPเพื่อทำซ้ำคำสั่งCXครั้ง | ถ้า( DF == 0 ) * ( ไบต์* ) ES : DI ++ = * ( ไบต์* ) SI ++ ; อื่น* ( ไบต์* ) ES : DI -- = * ( ไบต์* ) SI -- ; | 0xA4 |
| เอ็มวีเอสดับบลิว | ย้ายคำจากสตริงหนึ่งไปยังอีกสตริงหนึ่ง อาจใช้ร่วมกับ คำนำหน้า REPเพื่อทำซ้ำคำสั่งCXครั้ง | ถ้า( DF == 0 ) * ( คำ* ) ES : DI ++ = * ( คำ* ) SI ++ ; อื่น* ( คำ* ) ES : DI -- = * ( คำ* ) SI -- ; | 0xA5 |
| มุล | การคูณแบบไม่มีเครื่องหมาย | (1) DX:AX = AX * r/m;(2)AX = AL * r/m; | 0xF7/4 , 0xF6/4 |
| เนก | การปฏิเสธส่วนเติมเต็มของสอง | r/m=0–r/m; | 0xF6/3 ... 0xF7/3 |
| โนป | ไม่มีการดำเนินการใดๆ | เทียบเท่ากับโอเปอเรเตอร์โค้ดXCHG EAX, EAX | 0x90 |
| ไม่ | ปฏิเสธตัวถูกดำเนินการ โดยใช้ตรรกะ NOT | r/m^=-1; | 0xF6/2 ... 0xF7/2 |
| หรือ | ตรรกะ OR | (1) (2) r ∣= r/m/imm;m ∣= r/imm; | 0x08 ... 0x0D , 0x80 ... 0x81/1 , 0x83/1 |
| ออก | ส่งออกไปยังพอร์ต | (1) port[imm] = AL;(2) port[DX] = AL;(3) port[imm] = AX;(4)port[DX] = AX; | 0xE6 , 0xE7 , 0xEE , 0xEF |
| โผล่ | ดึงข้อมูลออกจากสแต็ก | r/m/sreg = *SP++; | 0x07 , 0x17 , 0x1F , 0x58 ... 0x5F , 0x8F/0 |
| ป๊อปเอฟ | ดึงรีจิสเตอร์ FLAGS ออก จากสแต็ก | FLAGS = *SP++; | 0x9D |
| ดัน | ผลักดันข้อมูลลงบนสแต็ก | *--SP=r/m/sreg; | 0x06 , 0x0E , 0x16 , 0x1E , 0x50 ... 0x57 , 0xFF/6 |
| พุชเอฟ | ผลักธงลงบนกอง | *--SP=FLAGS; | 0x9C |
| อาร์ซีแอล | หมุนไปทางซ้าย (พร้อมถือ) | 0xC0 ... 0xC1/2 (186+), 0xD0 ... 0xD3/2 | |
| อาร์ซีอาร์ | หมุนไปทางขวา (พร้อมถือ) | 0xC0 ... 0xC1/3 (186+), 0xD0 ... 0xD3/3 | |
| รีพีเอ็กซ์เอ็กซ์ | ทำซ้ำคำสั่ง MOVS/STOS/CMPS/LODS/SCAS | ( ตัวแทน ตัวแทน ตัวแทน ตัวแทน ตัวแทน ) | 0xF2 , 0xF3 |
| เรท | การกลับจากขั้นตอน | นี่ไม่ใช่คำสั่งจริง ๆ ตัวประกอบภาษาแอสเซมบลีจะแปลงคำสั่งเหล่านี้เป็น RETN หรือ RETF ขึ้นอยู่กับรูปแบบหน่วยความจำของระบบเป้าหมาย | |
| เรตเอ็น | การกลับจากขั้นตอนใกล้เคียง | 0xC2 , 0xC3 | |
| รีทีเอฟ | การกลับจากขั้นตอนระยะไกล | 0xCA , 0xCB | |
| โรล | หมุนไปทางซ้าย | 0xC0 ... 0xC1/0 (186+), 0xD0 ... 0xD3/0 | |
| อาร์โออาร์ | หมุนไปทางขวา | 0xC0 ... 0xC1/1 (186+), 0xD0 ... 0xD3/1 | |
| SAHF | บันทึก AH ลงใน FLAGS | 0x9E | |
| ซาล | เลื่อนบิตไปทางซ้ายแบบเลขคณิต (การเลื่อนบิตไปทางซ้ายแบบมีเครื่องหมาย) | (1) r/m <<= 1;(2)r/m <<= CL; | 0xC0 ... 0xC1/4 (186+), 0xD0 ... 0xD3/4 |
| ส.ส. | เลื่อนบิตไปทางขวาแบบเลขคณิต (การเลื่อนบิตไปทางขวาแบบมีเครื่องหมาย) | (1) (signed) r/m >>= 1;(2)(signed) r/m >>= CL; | 0xC0 ... 0xC1/7 (186+), 0xD0 ... 0xD3/7 |
| เอสบีบี | การลบที่มีการยืม | (1) r -= (r/m/imm+CF);(2) m -= (r/imm+CF);การเข้ารหัส 1 ไบต์ทางเลือกของSBB AL, ALสามารถใช้งานได้ผ่านคำสั่ง SALC ที่ไม่ได้บันทึกไว้ | 0x18 ... 0x1D , 0x80 ... 0x81/3 , 0x83/3 |
| สกาสบ. | เปรียบเทียบสตริงไบต์ อาจใช้ร่วมกับ คำนำหน้า REPEหรือREPNEเพื่อทดสอบและทำซ้ำคำสั่งCXครั้ง | if(DF==0)AL-*ES:DI++;elseAL-*ES:DI--; | 0xAE |
| สกาสว. | เปรียบเทียบสตริงคำ อาจใช้ร่วมกับ คำนำหน้า REPEหรือREPNEเพื่อทดสอบและทำซ้ำคำสั่งCXครั้ง | if(DF==0)AX-*ES:DI++;elseAX-*ES:DI--; | 0xAF |
| เอสเอชแอล | Shiftซ้าย (shift ซ้ายแบบไม่มีเครื่องหมาย) | ใช้โอเปอเรเตอร์โค้ดเดียวกันกับ SAL เนื่องจากคำสั่งเลื่อนบิตซ้ายเชิงตรรกะเท่ากับคำสั่งเลื่อนบิตซ้ายเชิงเลขคณิต | 0xC0 ... 0xC1/4 (186+), 0xD0 ... 0xD3/4 |
| เอสเอชอาร์ | Shift ขวา (shift ขวาแบบไม่มีเครื่องหมาย) | 0xC0 ... 0xC1/5 (186+), 0xD0 ... 0xD3/5 | |
| เอสทีซี | ตั้งธงการถือ | CF = 1; | 0xF9 |
| โรคติดต่อทางเพศสัมพันธ์ | ตั้งธงทิศทาง | DF = 1; | 0xFD |
| โรคติดต่อทางเพศสัมพันธ์ | ตั้งค่าแฟล็กการขัดจังหวะ | IF = 1; | 0xFB |
| สโตสบ | เก็บไบต์ลงในสตริง สามารถใช้ร่วมกับ คำนำหน้า REPเพื่อทำซ้ำคำสั่งCXครั้ง | if(DF==0)*ES:DI++=AL;else*ES:DI--=AL; | 0xAA |
| สโตสว | เก็บคำไว้ในสตริง สามารถใช้ร่วมกับ คำนำหน้า REPเพื่อทำซ้ำคำสั่งCXครั้ง | if(DF==0)*ES:DI++=AX;else*ES:DI--=AX; | 0xAB |
| ซับ | การลบ | (1) r -= r/m/imm;(2)m -= r/imm; | 0x28 ... 0x2D , 0x80 ... 0x81/5 , 0x83/5 |
| ทดสอบ | การเปรียบเทียบเชิงตรรกะ (AND) | (1) r & r/m/imm;(2)m & r/imm; | 0x84 , 0x85 , 0xA8 , 0xA9 , 0xF6/0 , 0xF7/0 |
| รอ | รอจนกว่าจะไม่ยุ่ง | รอจนกว่าขา BUSY# จะไม่ทำงาน (ใช้กับหน่วยประมวลผลทศนิยม ) | 0x9B |
| XCHG | แลกเปลี่ยนข้อมูล | r:=:r/m;โดยทั่วไปแล้ว สปินล็อกจะใช้ xchg เป็นการดำเนินการอะตอมิก ( บั๊กเกี่ยวกับเครื่องหมายจุลภาค ) | 0x86 , 0x87 , 0x91 ... 0x97 |
| เอ็กซ์แอลเอที | การแปลการค้นหาในตาราง | มีพฤติกรรมเหมือนMOV AL, [BX+AL] | 0xD7 |
| เอ็กซ์ออร์ | เอกสิทธิ์เฉพาะ หรือ | (1) r ^+= r/m/imm;(2)m ^= r/imm; | 0x30 ... 0x35 , 0x80 ... 0x81/6 , 0x83/6 |
เพิ่มในโปรเซสเซอร์เฉพาะบางรุ่น
มีการเพิ่มคำสั่งและรูปแบบคำสั่งใหม่ในโปรเซสเซอร์ Intel 80186 และ 80188 นอกจากนี้ยังพบใน โปรเซสเซอร์ NEC V20 /V30 และรุ่นต่อๆ มาด้วย
| ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ | คำอธิบายคำแนะนำ | แหวน[ก] |
|---|---|---|---|
PUSHA | 60[ข] | ผลักรีจิสเตอร์อเนกประสงค์ทั้งหมดลงบนสแต็ก คำสั่งนี้จะผลักค่า AX, CX, DX, BX, SP, BP, SI, DI ลงบนสแต็กตามลำดับ โดยค่าของ SP ที่ถูกผลักลงบนสแต็กจะเป็นค่าเริ่มต้นของ SP ก่อนที่จะได้รับคำ | 3 |
POPA | 61[ข] | ดึงค่าจากรีจิสเตอร์อเนกประสงค์ทั้งหมดออกจากสแต็ก ค่าที่ถูกดึงออกจากสแต็กจะถูกเก็บไว้ในรีจิสเตอร์ในลำดับย้อนกลับPUSHA(ค่าที่ตรงกับรีจิสเตอร์ SP จะถูกดึงออก แต่จะไม่ถูกเก็บไว้ในรีจิสเตอร์ใดๆ) | |
BOUND reg,m16&16 | NFx 62 /r[ค] [ข] | อ่านค่าขอบเขตของอาร์เรย์แบบมีเครื่องหมายสองค่าจากหน่วยความจำ จากนั้นตรวจสอบว่าค่าในรีจิสเตอร์ที่ป้อนเข้าไปนั้นไม่ต่ำกว่าขอบเขตแรกและไม่สูงกว่าขอบเขตที่สอง หากการทดสอบใดการทดสอบหนึ่งล้มเหลว จะเกิดข้อยกเว้นขอบเขตเกิน (#BR, เวกเตอร์ขัดจังหวะ 5) [ d ] | |
PUSH imm | 68 iw | ผลักค่าเวิร์ดทันที (หรือไบต์ที่ขยายเครื่องหมายเป็นเวิร์ด) ลงบนสแต็ก ตัวอย่างเช่น: กด12 ชั่วโมง; เข้ารหัสเป็น 6Ah 12 ชั่วโมงกด1234 ชั่วโมง; เข้ารหัสเป็น 68 ชั่วโมง 34 ชั่วโมง 12 ชั่วโมง | 3 |
6A ib | |||
IMUL reg,r/m,imm, IIMUL reg,r/m,imm[ e ] | 69 /r iw | การคูณคำจำนวนเต็ม 3 อาร์กิวเมนต์แบบไม่ขยายด้วยค่าคงที่ ตัวอย่าง: IMUL CX , DX , 12 ชม. IMUL BX , SI , 1200 ชม. IMUL DI , คำว่าptr [ BX + SI ], 12 ชม. IMUL SI , คำว่าptr [ BP - 4 ], 1200hโปรดทราบว่าเนื่องจากส่วนล่างเหมือนกันสำหรับการคูณแบบไม่มีเครื่องหมายและแบบมีเครื่องหมาย ดังนั้นคำสั่งเวอร์ชันนี้จึงสามารถใช้ได้กับทั้งสองกรณี | |
6B /r ib | |||
INSB | 6C[ f ] | อินพุต 8 บิตจากพอร์ต I/Oไปยังสตริง[ g ] การดำเนินการนี้เทียบเท่ากับ: ในAL , DX STOSB ; ปรับ DI ตามขนาดของตัวดำเนินการและ DF | โดยปกติ 0 [ชั่วโมง] |
INSW | 6D[ f ] | อินพุต 16 บิตจากพอร์ต I/O ไปยังสตริง[ g ] | |
OUTSB | 6E[ f ] | ส่งออกข้อมูล 8 บิตจากสตริงไปยังพอร์ต I/O การทำงานเทียบเท่ากับ: LODSB ; ปรับ SI ตามขนาดของตัวดำเนินการและ DF OUT DX , AL | |
OUTSW | 6F[ f ] | ส่งสัญญาณเอาต์พุต 16 บิตจากสตริงไปยังพอร์ต I/O | |
ROL r/m, imm8 | C0 /0 ibC1 /0 ib[ฉัน] | หมุนไปทางซ้ายทันที | 3 |
ROR r/m, imm8 | C0 /1 ib, [ฉัน]C1 /1 ib | หมุนไปทางขวาทันที | |
RCL r/m, imm8 | C0 /2 ib, [ฉัน]C1 /2 ib | หมุนไปทางซ้ายพร้อมกับการถือโดยหมุนทันทีตามปริมาณที่กำหนด | |
RCR r/m, imm8 | C0 /3 ib, [ฉัน]C1 /3 ib | หมุนไปทางขวาพร้อมกับการหมุนทันทีในปริมาณที่กำหนด | |
SHL r/m, imm8 | C0 /4 ib, [ฉัน]C1 /4 ib | เลื่อนไปทางซ้ายทันที | |
| C0 /6 ib , C1 /6 ib [ j ] | |||
SHR r/m, imm8 | C0 /5 ib, [ฉัน]C1 /5 ib | ไม่มีการลงชื่อ เลื่อนไปทางขวา ทันที | |
SAR r/m, imm8 | C0 /7 ib, [ฉัน]C1 /7 ib | ลงชื่อเปลี่ยนกะทันที | |
ENTER imm16,imm8 | C8 iw ib[ k ] | สร้างเฟรมสแต็กของขั้นตอนการทำงาน ตัวถูกดำเนินการตัวแรกระบุขนาดของเฟรมสแต็กที่จะจัดสรรโดยคำสั่ง ตัวถูกดำเนินการตัวที่สองระบุระดับการซ้อน (จำนวนตัวชี้เฟรมสแต็กก่อนหน้าที่ CPU จะคัดลอกก่อนที่จะปรับตัวชี้สแต็ก) การดำเนินการคือENTER arg1,arg2: [ l ]พุช rBP temp1 := rSP ถ้า (arg2 > 0) { สำหรับ (i = 1; i < arg2; i++) { temp2 := read_mem[SS:rBP-i*OperandSize] กดอุณหภูมิ 2 } พุช rBP } rSP := rSP - arg1 ; จัดสรรสแต็ก - อัปเดต SP/ESP/RSP ตาม StackAddressSize rBP := temp1 ; ตั้งค่าตัวชี้เฟรม - อัปเดต BP/EBP/RBP ตาม OperandSize | 3 |
LEAVE | C9 | ปล่อยสแต็กขั้นตอนที่สร้างขึ้นโดยENTERคำสั่งก่อนหน้า การดำเนินการนี้เทียบเท่ากับ:MOV rSP , rBP ; ปล่อยสแต็ก - อัปเดต SP/ESP/RSP ตาม StackAddressSize POP rBP ; คืนค่าตัวชี้เฟรมเดิม - อัปเดต BP/EBP/RBP ตาม OperandSize | |
UDW | FF FF | ชิปเซ็ต 80186/80188 ได้นำข้อยกเว้น #UD มาใช้ แต่ไม่ได้สงวนการเข้ารหัสโอเปอเรเตอร์โค้ดใดๆ ไว้สำหรับการเรียกใช้ #UD โดยเฉพาะ การใช้ไบต์สองไบต์ที่มีบิตทั้งหมดตั้งค่าเป็นหนึ่งนั้นสะดวก – มันทำงานได้หากหน่วยความจำได้รับการเริ่มต้นอย่างชัดเจนให้บิตทั้งหมดตั้งค่าเป็นหนึ่ง และมันทำงานได้หากชิปเซ็ตตอบสนองต่อการเข้าถึงที่ไม่ใช่ DRAM และไม่ใช่ MMIO (ในกรณีนี้คือการดึงโค้ด) ด้วยไบต์ที่มีบิตทั้งหมดตั้งค่าเป็นหนึ่ง ไม่มีโปรเซสเซอร์ x86 รุ่นต่อมาใดที่จัดสรรการเข้ารหัสนี้ให้กับสิ่งอื่นใดอีกเลย เพื่อให้มั่นใจว่าพฤติกรรม #UD ยังคงอยู่ จึงใช้ชื่อ UDW ซึ่งเป็นไปตามลำดับความสำคัญของการตั้งชื่อที่กำหนดโดย UDB โดยที่ B หมายถึงความยาวไบต์ และ W หมายถึงความยาวเวิร์ด x86 นอกจากนี้ยังหลีกเลี่ยงการใช้ UD{0,1,2} ด้วย กลุ่ม #5 (FF ตัวแรก) พร้อมไบต์ modrm ของ mod=11b r/m=111b (/7) reg=111b (FF ตัวที่สอง) | |
- ↑วงแหวนป้องกันใช้ได้กับรุ่น 80286 และรุ่นที่ใหม่กว่า ไม่ใช่รุ่น 80186
- 1 2 3ในโหมด 64 บิต คำสั่ง ,
PUSHAและPOPAจะBOUNDไม่สามารถใช้งานได้ —PUSHAและPOPAจะทำให้เกิด #UD และBOUNDรหัสคำสั่ง (62) จะถูกนำไปใช้ใหม่สำหรับคำนำหน้า EVEX - ↑ในโปรเซสเซอร์บางตัว รวมถึง 80186 บางรุ่น การใช้คำนำหน้าซ้ำกับ
BOUNDคำสั่งจะปรับเปลี่ยนการทำงานให้เปรียบเทียบเฉพาะขอบล่างเท่านั้น [ 4 ]ด้วยเหตุนี้ จึงควรหลีกเลี่ยงการใช้คำนำหน้าซ้ำสำหรับคำสั่งนี้ - ↑บนโปรเซสเซอร์ Intel 80186/80188 และ NEC V-series ความล้มเหลวในการตรวจสอบขอบเขตจะทำให้ #BR ออกมาเป็นข้อยกเว้นประเภทกับดัก (ค่าของ CS:IP ที่เก็บไว้ในสแต็กชี้ไปยังคำสั่งถัดจาก
BOUNDคำสั่งนั้น) [ 5 ]ในขณะที่บนโปรเซสเซอร์ 80286 และรุ่นต่อมา จะออกมาเป็นข้อยกเว้นประเภทความผิดพลาด (ค่าของ CS:IP ที่เก็บไว้ในสแต็กคือค่าของBOUNDคำสั่งนั้นเอง) [ 6 ] - ↑ บางครั้งมีการใช้ "
IIMUL" เป็นตัวย่อสำหรับคำสั่ง multiply-immediate ของ 80186 ในเอกสารของ IBM PC [ 7 ]แต่โดยทั่วไปแล้วไม่ได้ใช้ - 1 2 3 4สามารถใช้คำนำหน้า ( ) ร่วมกับคำ
REPสั่ง///ได้ การทำเช่นนั้นจะทำให้คำสั่งถูกทำซ้ำตามจำนวนครั้งที่ระบุใน rCX (การตั้งค่า rCX เป็น 0 จะทำให้ไม่มีการทำซ้ำ กล่าวคือ คำสั่งจะทำงานเหมือน NOP)F3INSBINSWOUTSBOUTSW - 1 2บนโปรเซสเซอร์ 80286 และรุ่นที่ใหม่กว่า
INSB/INSWอาจทำการตรวจสอบสิทธิ์การเข้าถึงหน่วยความจำหลังจากการอ่านข้อมูลจากพอร์ต I/O เสร็จสิ้นแล้ว หากการตรวจสอบใดๆ ล้มเหลว (เช่น segfault หรือ page-fault) ข้อมูลที่อ่านจากพอร์ต I/O จะสูญหายไป ด้วยเหตุนี้ การใช้INSB/INSWเพื่ออ่านพอร์ต I/O ที่มีผลข้างเคียงเมื่ออ่านจึงไม่แนะนำ - ↑การเข้าถึงพอร์ต I/O จะได้รับอนุญาตก็ต่อเมื่อ CPL≤IOPLหรือ (ใน 80386 และรุ่นที่ใหม่กว่า) บิต แผนที่สิทธิ์การเข้าถึงพอร์ต I/Oสำหรับพอร์ตที่จะเข้าถึงนั้นถูกตั้งค่าเป็น 0 ทั้งหมด
- 1 2 3 4 5 6 7สำหรับคำสั่ง ROL/ROR/RCL/RCR/SHL/SHR/SAR นั้น opcode
C0จะใช้สำหรับรูปแบบไบต์ และ opcodeC1จะใช้สำหรับรูปแบบเวิร์ดสำหรับC0/C1immediate นั้น จะใช้เพียง 5 บิตล่างสุดของ immediate เท่านั้น (6 บิตสำหรับ opcodeC1หากเข้ารหัสด้วยขนาด operand 64 บิตภายใต้ x86-64) - ↑ในโปรเซสเซอร์ 80186 และรุ่นต่อมา ซับโอเปอเรเตอร์โค้ด /6 สำหรับชิฟต์โอเปอเรเตอร์โค้ด
C0/C1/D0/D1/D2/D3ทำหน้าที่เป็นชื่อเรียกแทน (ซึ่งมักมีการอธิบายไว้ไม่ดีนัก) ของซับโอเปอเรเตอร์โค้ด /4 — ทั้งหมดนี้เป็นรูปแบบต่างๆ ของSHLคำสั่งดังกล่าว - ↑อาร์กิวเมนต์แรกของ
ENTERคำสั่งนี้จะเป็นค่าคงที่แบบไม่มีเครื่องหมายขนาด 16 บิตเสมอ ไม่ว่า OperandSize จะเป็นเท่าใดก็ตามอาร์กิวเมนต์ที่สองของ
ENTERคือ ค่าคงที่ 8 บิต - บนโปรเซสเซอร์ 80186/80188 และ NEC V-series จะใช้ทั้ง 8 บิต[ 5 ]แต่โปรเซสเซอร์ 80286 และรุ่นต่อมาจะใช้เพียง 5 บิตล่างสุด[ 6 ] - ↑บนโปรเซสเซอร์รุ่นใหม่กว่า
ENTERคำสั่งนี้จะตรวจสอบหลังจากตั้งค่าเฟรมสแต็กแล้วว่าตำแหน่งไบต์ที่ชี้โดยค่าใหม่ของ SS:rSP สามารถเขียนได้หรือไม่ — หากไม่สามารถเขียนได้ คำสั่งนี้จะสร้างข้อยกเว้นเดียวกัน (เช่น เพจฟอลต์) เช่นเดียวกับการเขียนไปยังที่อยู่ดังกล่าว [ 8 ]
เพิ่มด้วย80286
คำสั่งใหม่ที่เพิ่มเข้ามาใน 80286 เพิ่มการรองรับโหมดป้องกัน x86 คำสั่งบางส่วนแต่ไม่ใช่ทั้งหมด สามารถใช้งานได้ในโหมดจริงเช่นกัน
| คำแนะนำ | รหัสปฏิบัติการ | คำอธิบายคำแนะนำ | โหมดจริง | แหวน |
|---|---|---|---|---|
LGDT m16&32[ก] | 0F 01 /2 | โหลด GDTR ( Global Descriptor Table Register) จากหน่วยความจำ[ b ] | ใช่ | 0 |
LIDT m16&32[ก] | 0F 01 /3 | โหลด IDTR (Interrupt Descriptor Table Register) จากหน่วยความจำ[ b ] IDTR ควบคุมไม่เพียงแต่ที่อยู่/ขนาดของ IDT ( Interrupt Descriptor Table ) ในโหมดป้องกันเท่านั้น แต่ยังควบคุม IVT (Interrupt Vector Table) ในโหมดจริงด้วย | ||
LMSW r/m16 | 0F 01 /6 | โหลด MSW (Machine Status Word) จากรีจิสเตอร์หรือหน่วยความจำ 16 บิต[ c ] [ d ] | ||
CLTS | 0F 06 | ล้างสถานะการสลับงานใน MSW | ||
LLDT r/m16 | 0F 00 /2 | โหลด LDTR (Local Descriptor Table Register) จากรีจิสเตอร์หรือหน่วยความจำ 16 บิต[ b ] | #UD | |
LTR r/m16 | 0F 00 /3 | โหลด TR (Task Register) จากรีจิสเตอร์หรือหน่วยความจำ 16 บิต[ b ] ส่วนสถานะงาน (TSS ) ที่ระบุโดยอาร์กิวเมนต์ 16 บิตถูกทำเครื่องหมายว่าไม่ว่าง แต่ยังไม่มีการสลับงานเกิดขึ้น | ||
SGDT m16&32[ก] | 0F 01 /0 | บันทึกค่า GDTR ลงในหน่วยความจำ | ใช่ | โดยปกติ 3 [ e ] |
SIDT m16&32[ก] | 0F 01 /1 | บันทึกค่า IDTR ลงในหน่วยความจำ | ||
SMSW r/m16 | 0F 01 /4 | บันทึก MSW ลงในรีจิสเตอร์หรือหน่วยความจำ 16 บิต[ f ] | ||
SLDT r/m16 | 0F 00 /0 | บันทึกค่า LDTR ลงในรีจิสเตอร์หรือหน่วยความจำ 16 บิต[ f ] | #UD | |
STR r/m16 | 0F 00 /1 | บันทึก TR ลงในรีจิสเตอร์หรือหน่วยความจำ 16 บิต[ f ] | ||
ARPL r/m16,r16 | 63 /r[ g ] | ปรับค่าฟิลด์ RPL ( ระดับสิทธิ์ ที่ร้องขอ ) ของตัวเลือก การดำเนินการที่ทำคือ:ถ้า (dst & 3) < (src & 3) แล้ว dst = (dst & 0xFFFC) | (src & 3) eflags.zf = 1 อื่น eflags.zf = 0 | #UD [ h ] | 3 |
LAR r,r/m16 | 0F 02 /r | โหลดไบต์สิทธิ์การเข้าถึงจากตัวอธิบายเซ็กเมนต์ ที่ ระบุอ่านไบต์ที่ 4-7 ของตัวอธิบายเซ็กเมนต์ ทำการ AND แบบบิตwise กับ0x00FxFF00[ i ] จากนั้นจัดเก็บ 16/32 บิตล่างของผลลัพธ์ลงในรีจิสเตอร์ปลายทาง ตั้งค่าEFLAGS .ZF=1 หากสามารถโหลดตัวอธิบายได้ และ ZF=0 หากไม่สามารถโหลดได้[ j ] | #UD | |
LSL r,r/m16 | 0F 03 /r | โหลดขีดจำกัดเซ็กเมนต์จากตัวอธิบายเซ็กเมนต์ที่ระบุ ตั้งค่า ZF=1 หากสามารถโหลดตัวอธิบายได้ และ ZF=0 หากไม่สามารถโหลดได้[ j ] | ||
VERR r/m16 | 0F 00 /4 | ตรวจสอบความสามารถในการอ่านเซ็กเมนต์ กำหนดค่า ZF เป็น 1 หากสามารถอ่านเซ็กเมนต์ได้ และกำหนดค่า ZF เป็น 0 หากอ่านไม่ได้ | ||
VERW r/m16 | 0F 00 /5 | ตรวจสอบเซ็กเมนต์สำหรับการเขียน กำหนดค่า ZF=1 หากสามารถเขียนเซ็กเมนต์ได้ และ ZF=0 หากไม่สามารถเขียนได้[ k ] | ||
| โหลดทั้งหมด[ l ] | 0F 05 | โหลดค่าไปยังรีจิสเตอร์ CPU ทั้งหมดจากโครงสร้างข้อมูลขนาด 102 ไบต์ โดยเริ่มต้นที่แอดเดรสทางกายภาพ800hรวมถึงส่วน "ที่ซ่อนอยู่" ของรีจิสเตอร์ตัวอธิบายเซกเมนต์ด้วย | ใช่ | 0 |
| ร้านค้าทั้งหมด[ l ] | F1 0F 04 | บันทึกค่ารีจิสเตอร์ทั้งหมดของ CPU ลงในโครงสร้างข้อมูลขนาด 102 ไบต์ โดยเริ่มต้นที่แอดเดรสทางกายภาพ800hจากนั้นปิดการทำงานของ CPU | ||
- 1 2 3 4ตัวอธิบายที่ใช้โดย
LGDT,LIDT,SGDTและSIDTประกอบด้วยโครงสร้างข้อมูล 2 ส่วน ส่วนแรกเป็นค่า 16 บิต ระบุขนาดตารางเป็นไบต์ลบ 1 ส่วนที่สองเป็นค่า 32 บิต (ค่า 64 บิตในโหมด 64 บิต) ระบุที่อยู่เริ่มต้นเชิงเส้นของตารางสำหรับLGDTและLIDTที่มีขนาดตัวถูกดำเนินการ 16 บิต ที่อยู่จะถูก AND กับ 00FFFFFFhบนซีพียู Intel (แต่ไม่ใช่ AMD) คำสั่ง
SGDTและSIDTที่มีขนาดตัวดำเนินการ 16 บิตนั้น – ตามเอกสาร Intel SDM ฉบับแก้ไข 079 เดือนมีนาคม 2023 – ระบุว่าจะเขียนตัวอธิบายลงในหน่วยความจำโดยตั้งค่าไบต์สุดท้ายเป็น 0 อย่างไรก็ตาม พฤติกรรมที่สังเกตได้คือบิตที่ 31:24 ของที่อยู่ตารางตัวอธิบายจะถูกเขียนแทน[ 9 ]บน Intel 80286 ไบต์สุดท้ายที่เขียนโดย
SGDT/ จะเป็น 0xFF เสมอ ซึ่งซอฟต์แวร์ (เช่น ไดรเวอร์NE2000 NDIS [ 10 ]และ Microsoft Windows 3.0 [ 11 ]SIDT) ใช้สิ่งนี้ในการตรวจจับว่า CPU เป็น 80286 หรือไม่ - 1 2 3 4คำ
LGDT,LIDT,LLDTและLTRจะถูกเรียงลำดับบน โปรเซสเซอร์ Pentiumและรุ่นที่ใหม่กว่า - ↑ คำสั่ง นี้
LMSWทำงานแบบเรียงลำดับบนโปรเซสเซอร์ Intel ตั้งแต่ Pentiumขึ้นไป แต่ไม่ทำงานบนโปรเซสเซอร์ AMDเมื่อ
LMSWใช้คำสั่งเพื่อเข้าสู่โหมดป้องกันควรตามด้วยคำสั่งกระโดดทันทีเพื่อล้างคิวพรีเฟตช์[ 12 ] (บน Intel 80286LMSWมีรายงานว่าการเรียกใช้คำสั่งที่ไม่ใช่การกระโดดสามคำสั่งทันทีหลังจากเข้าสู่โหมดป้องกันจะทำให้ CPU รีเซ็ต) [ 13 ] - ↑บน 80386 และรุ่นต่อมา "คำสถานะเครื่อง" จะเหมือนกับรีจิสเตอร์ควบคุม CR0 – อย่างไรก็ตาม
LMSWคำสั่งนี้สามารถแก้ไขได้เฉพาะ 4 บิตล่างสุดของรีจิสเตอร์นี้เท่านั้น และไม่สามารถล้างบิตที่ 0 ได้ การที่ไม่สามารถล้างบิตที่ 0 ได้หมายความว่าLMSWสามารถใช้เพื่อเข้าสู่โหมดป้องกัน x86บน 80286 ไม่สามารถออกจากโหมดป้องกันได้เลย (ไม่ว่าจะใช้LMSWหรือไม่ใช้LOADALL[ 14 ] ) โดยไม่ต้องรีเซ็ต CPU – บน 80386 และรุ่นต่อมา สามารถออกจากโหมดป้องกันได้ แต่ต้องใช้คำสั่งMOVมาCR0 - ↑หาก
CR4.UMIP=1มีการตั้งค่าSGDT,SIDT,SLDT,SMSWและSTRสามารถทำงานได้เฉพาะใน Ring 0 เท่านั้นคำสั่งเหล่านี้ไม่มีสิทธิ์พิเศษบนซีพียู x86 ทั้งหมดตั้งแต่ 80286 เป็นต้นไปจนกระทั่งมีการนำ UMIP มาใช้ในปี 2017 [ 15 ] นี่เป็นปัญหาด้านความปลอดภัยที่สำคัญสำหรับการจำลองเสมือนแบบใช้ซอฟต์แวร์ เนื่องจากทำให้คำสั่งเหล่านี้สามารถใช้โดยแขก VM เพื่อตรวจจับว่ากำลังทำงานอยู่ภายใน VM [ 16 ] [ 17 ] - 1 2 3คำ
SMSW,SLDTและSTRจะใช้ขนาดตัวถูกดำเนินการ 16 บิตเสมอเมื่อใช้กับอาร์กิวเมนต์หน่วยความจำ สำหรับโปรเซสเซอร์ 80386 หรือรุ่นที่ใหม่กว่า หากใช้อาร์กิวเมนต์รีจิสเตอร์ จะมีขนาดตัวถูกดำเนินการปลายทางที่กว้างกว่า และทำงานดังนี้:SMSW: จัดเก็บค่าCR0 แบบเต็ม ในโหมด 64 บิตบนซีพียู x86-64 มิฉะนั้นจะไม่กำหนดค่าSLDT: ขยายค่าศูนย์ให้กับอาร์กิวเมนต์ 16 บิตบน โปรเซสเซอร์ Pentium Proและรุ่นที่ใหม่กว่า ไม่มีค่าในโปรเซสเซอร์รุ่นก่อนหน้าSTR: ขยายค่าอาร์กิวเมนต์ 16 บิตเป็นศูนย์
- ↑บนโปรเซสเซอร์ที่มีสถาปัตยกรรม x86-64
ARPLคำสั่งนี้ไม่สามารถใช้งานได้ในโหมด 64 บิต เนื่องจากคำสั่งที่63 /rใช้งานได้เฉพาะในโหมด 64 บิตเท่านั้นMOVSXD - ↑ คำสั่ง นี้
ARPLทำให้เกิด #UD ในโหมดจริงและโหมดเสมือน 8086 – Windows 95 และ OS/2 2.x เป็นที่ทราบกันดีว่าใช้ #UD นี้อย่างกว้างขวางเพื่อใช้63โอเปอเรเตอร์เป็นเบรกพอยต์หนึ่งไบต์เพื่อเปลี่ยนจากโหมดเสมือน 8086ไปเป็นโหมดเคอร์เนล [ 18 ] [ 19 ] - ↑บิต 19:16 ของมาสก์นี้ถูกบันทึกไว้ว่าเป็น "ไม่ได้กำหนด" บนซีพียู Intel [ 20 ]บนซีพียู AMD มาสก์นี้ถูกบันทึกไว้เป็น
0x00FFFF00. - 1 2สำหรับ
LARandLSLหากไม่สามารถโหลดตัวอธิบายเซ็กเมนต์ที่ระบุได้ รีจิสเตอร์ปลายทางของคำสั่งนั้นจะไม่มีการเปลี่ยนแปลง - ↑ในชุดค่าผสม CPU/ไมโครโค้ดของ Intel บางชุดตั้งแต่ปี 2019 เป็นต้นไป รวมถึงชุดค่าผสม CPU/ไมโครโค้ดของ AMD บางชุดตั้งแต่ปี 2025 เป็นต้นไป
VERWคำสั่งนี้ยังทำการล้างบัฟเฟอร์ข้อมูลไมโครสถาปัตยกรรมต่างๆ ในลักษณะเฉพาะของการใช้งาน ซึ่งทำให้สามารถใช้เป็นส่วนหนึ่งของวิธีแก้ปัญหาสำหรับช่องโหว่ด้านความปลอดภัย เช่นการสุ่มตัวอย่างข้อมูลไมโครสถาปัตยกรรมและการโจมตีตัวกำหนดเวลาชั่วคราว [ 21 ] [ 22 ] [ 23 ] ฟังก์ชันการล้างบัฟเฟอร์ไมโครสถาปัตยกรรมบางส่วนที่เพิ่มเข้ามาVERWอาจต้องการให้คำสั่งนี้ถูกดำเนินการด้วยตัวดำเนินการหน่วยความจำ [ 24 ] - 1 2ไม่มีเอกสาร เฉพาะ 80286 เท่านั้น [ 14 ] [ 25 ] [ 26 ] (
LOADALLมีรูปแบบที่แตกต่างกันซึ่งมีรหัสคำสั่งและโครงสร้างหน่วยความจำที่แตกต่างกันบน 80386)
เพิ่มด้วย80386
โปรเซสเซอร์ 80386 เพิ่มการรองรับการทำงานแบบ 32 บิตให้กับชุดคำสั่ง x86 โดยการขยายรีจิสเตอร์อเนกประสงค์เป็น 32 บิต และแนะนำแนวคิดของOperandSizeและAddressSize – รูปแบบคำสั่งส่วนใหญ่ที่ก่อนหน้านี้รับอาร์กิวเมนต์ข้อมูล 16 บิต สามารถรับอาร์กิวเมนต์ 32 บิตได้โดยการตั้งค่า OperandSize เป็น 32 บิต และคำสั่งที่สามารถรับอาร์กิวเมนต์ที่อยู่ 16 บิต สามารถรับอาร์กิวเมนต์ที่อยู่ 32 บิตได้โดยการตั้งค่า AddressSize เป็น 32 บิต (รูปแบบคำสั่งที่ทำงานกับข้อมูล 8 บิตจะยังคงเป็น 8 บิตไม่ว่า OperandSize จะเป็นเท่าใด การใช้ขนาดข้อมูล 16 บิตจะทำให้เฉพาะ 16 บิตล่างของรีจิสเตอร์อเนกประสงค์ 32 บิตเท่านั้นที่จะถูกแก้ไข – 16 บิตบนจะยังคงไม่เปลี่ยนแปลง)
ขนาดโอเปแรนด์ (OperandSize) และขนาดแอดเดรส (AddressSize) เริ่มต้นที่จะใช้สำหรับแต่ละคำสั่งนั้นกำหนดโดยบิต D ของตัวอธิบายเซ็กเมนต์ (segment descriptor)ของเซ็กเมนต์โค้ดปัจจุบัน - D=0จะทำให้ทั้งสองเป็น 16 บิตD=1จะทำให้ทั้งสองเป็น 32 บิต นอกจากนี้ ยังสามารถแทนที่ค่าเหล่านี้ได้ในแต่ละคำสั่งด้วยคำนำหน้าคำสั่งใหม่สองคำที่ถูกนำมาใช้ใน 80386:
66h: การกำหนดค่า OperandSize ใหม่ จะเปลี่ยน OperandSize จาก 16 บิตเป็น 32 บิตหากCS.D=0หรือจาก 32 บิตเป็น 16 บิตCS.D=1หาก67h: การกำหนดค่า AddressSize ใหม่ จะเปลี่ยน AddressSize จาก 16 บิตเป็น 32 บิตหากCS.D=0หรือจาก 32 บิตเป็น 16 บิตCS.D=1หาก
นอกจากนี้ 80386 ยังได้แนะนำรีจิสเตอร์เซ็กเมนต์ใหม่สองตัวFSรวมGSถึง รีจิสเตอร์ ควบคุมดีบักและทดสอบของ x86 ด้วย
คำสั่งใหม่ที่นำมาใช้ใน 80386 สามารถแบ่งออกได้เป็นสองประเภทหลัก ๆ ดังนี้:
- โอเปอเรเตอร์โค้ดที่มีอยู่เดิมซึ่งต้องการตัวย่อใหม่สำหรับตัวแปร OperandSize 32 บิต (เช่น
CWDE,LODSD) - โอเปอเรเตอร์โค้ดใหม่ที่เพิ่มฟังก์ชันการทำงานใหม่ (เช่น
SHLD,SETcc)
สำหรับรูปแบบคำสั่งที่สามารถอนุมานขนาดของตัวถูกดำเนินการได้จากอาร์กิวเมนต์ของคำสั่ง (เช่นADD EAX,EBXสามารถอนุมานได้ว่ามี OperandSize ขนาด 32 บิต เนื่องจากมีการใช้ EAX เป็นอาร์กิวเมนต์) ไม่จำเป็นต้องมีตัวย่อคำสั่งใหม่ และไม่มีการจัดเตรียมตัวย่อดังกล่าว
| พิมพ์ | ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ | คำอธิบาย | ตัวช่วยจำสำหรับรุ่น 16 บิตแบบเก่า | แหวน |
|---|---|---|---|---|---|
| คำสั่งสตริง[ a ] [ b ] | LODSD | AD | โหลดสตริง doubleword:EAX := DS:[rSI±±] | LODSW | 3 |
STOSD | AB | เก็บสตริง doubleword:ES:[rDI±±] := EAX | STOSW | ||
MOVSD | A5 | ย้ายสตริงคำคู่:ES:[rDI±±] := DS:[rSI±±] | MOVSW | ||
CMPSD | A7 | เปรียบเทียบสตริง doubleword:temp1 := DS:[rSI±±] temp2 := ES:[rDI±±] CMP temp1, temp2 /* เปรียบเทียบและตั้งค่า EFLAGS แบบ 32 บิต */ | CMPSW | ||
SCASD | AF | สแกนสตริงคำคู่:temp1 := ES:[rDI±±] CMP EAX, temp1 /* เปรียบเทียบและตั้งค่า EFLAGS แบบ 32 บิต */ | SCASW | ||
INSD | 6D | สตริงอินพุตจากพอร์ต I/O ดับเบิลเวิร์ด: [ c ]ES:[rDI±±] := port[DX] | INSW | โดยปกติ 0 [ d ] | |
OUTSD | 6F | ส่งออกสตริงไปยังพอร์ต I/O แบบ doubleword:port[DX] := DS:[rSI±±] | OUTSW | ||
| อื่น | CWDE | 98 | ขยายเครื่องหมายค่า 16 บิตใน AX เป็นค่า 32 บิตใน EAX [ e ] | CBW | 3 |
CDQ | 99 | ขยายเครื่องหมายของค่า 32 บิตใน EAX ให้เป็นค่า 64 บิตใน EDX:EAX โดยส่วนใหญ่ใช้เพื่อเตรียมตัวตั้งหารสำหรับคำสั่งหารแบบ 32 บิต | CWD | ||
JECXZ rel8 | E3 cb[ f ] | กระโดดหาก ECX เป็นศูนย์ | JCXZ | ||
PUSHAD | 60 | ผลักรีจิสเตอร์ 32 บิตทั้งหมดลงบนสแต็ก[ g ] | PUSHA | ||
POPAD | 61 | ดึงรีจิสเตอร์อเนกประสงค์ 32 บิตทั้งหมดออกจากสแต็ก[ h ] | POPA | ||
PUSHFD | 9C | ผลัก รีจิสเตอร์ E FLAGSขนาด 32 บิตลงบนสแต็ก | PUSHF | โดยปกติ 3 [ i ] | |
POPFD | 9D | ดึงรีจิสเตอร์ EFLAGS 32 บิตออกจากสแต็ก | POPF | ||
IRETD | CF | คำสั่งส่งคืนการขัดจังหวะแบบ 32 บิต แตกต่างจากIRETคำสั่ง 16 บิตแบบเก่าตรงที่มันจะดึงรายการส่งคืนการขัดจังหวะ (EIP, CS, EFLAGS; รวมถึง ESP [ j ]และ SS หากมี การเปลี่ยนแปลง CPL ; และรวมถึง ES, DS, FS, GS หากกลับไปยังโหมดเสมือน 8086 ) ออกจากสแต็กเป็นรายการ 32 บิตแทนที่จะเป็นรายการ 16 บิต ควรใช้เพื่อส่งคืนจากการขัดจังหวะเมื่อเข้าสู่ตัวจัดการการขัดจังหวะผ่านเกต การขัดจังหวะ/ดักจับ IDTแบบ 32 บิตคำสั่งกำลังเรียงลำดับ | IRET | ||
- ↑สำหรับคำสั่งสตริง 32 บิต สัญลักษณ์ ±± ใช้เพื่อระบุว่ารีจิสเตอร์ที่ระบุจะถูกลดค่าลง 4 ถ้าเป็นจริง
EFLAGS.DF=1และจะเพิ่มขึ้น 4 ในกรณีอื่น ๆสำหรับตัวถูกดำเนินการที่ระบุเซกเมนต์ DS เซกเมนต์ DS สามารถถูกแทนที่ได้ด้วยคำนำหน้าการแทนที่เซกเมนต์ – ในกรณีที่ระบุเซกเมนต์ ES เซกเมนต์จะเป็น ES เสมอและไม่สามารถถูกแทนที่ได้การเลือกใช้รีจิสเตอร์ SI/DI 16 บิตหรือรีจิสเตอร์ ESI/EDI 32 บิตเป็นรีจิสเตอร์แอดเดรสจะทำโดย AddressSize ซึ่งสามารถแทนที่ได้ด้วยคำนำ67หน้า - ↑คำสั่งสตริง 32 บิตยอมรับคำนำหน้าการทำซ้ำในลักษณะเดียวกับคำสั่งสตริง 8/16 บิตแบบเก่าสำหรับ
LODSD,STOSD,MOVSD,INSDและOUTSDหน้าREP(F3) จะทำซ้ำคำสั่งตามจำนวนครั้งที่ระบุใน rCX (CX หรือ ECX ซึ่งตัดสินโดย AddressSize) โดยลดค่า rCX ลงในแต่ละรอบ (โดย rCX=0 จะไม่มีการดำเนินการใดๆ และดำเนินการต่อในคำสั่งถัดไป)สำหรับCMPSDและSCASDคำนำREPE(F3) และREPNE(F2) สามารถใช้งานได้ ซึ่งจะทำซ้ำคำสั่งโดยลดค่า rCX ลงในแต่ละรอบ แต่จะทำซ้ำได้ก็ต่อเมื่อเงื่อนไขแฟล็ก (ZF=1 สำหรับREPE, ZF=0 สำหรับREPNE) เป็นจริง และ rCX ≠ 0 เท่านั้น - ↑สำหรับ
INSB/W/Dคำสั่งนี้ สิทธิ์การเข้าถึงหน่วยความจำสำหรับES:[rDI]ที่อยู่หน่วยความจำอาจจะไม่ได้รับการตรวจสอบจนกว่าจะมีการเข้าถึงพอร์ตเสร็จสิ้นแล้ว – หากการตรวจสอบนี้ล้มเหลว (เช่น ข้อผิดพลาดในการเข้าถึงหน้าหน่วยความจำ หรือข้อยกเว้นหน่วยความจำอื่นๆ) ข้อมูลที่อ่านจากพอร์ตจะสูญหายไป ดังนั้นจึงไม่แนะนำให้ใช้คำสั่งนี้ในการเข้าถึงพอร์ต I/O ที่มีผลข้างเคียงใดๆ ในระหว่างการอ่าน - ↑การเข้าถึงพอร์ต I/O จะได้รับอนุญาตก็ต่อเมื่อ CPL≤IOPLหรือบิตในแผนที่สิทธิ์การเข้าถึงพอร์ต I/O ทั้งหมดถูกตั้งค่าเป็น 0 เท่านั้น
- ↑ คำสั่ง นี้
CWDEแตกต่างจากคำสั่งเดิมCWDตรงที่มันCWDจะขยายค่า 16 บิตใน AX ให้เป็นค่า 32 บิตในคู่รีจิสเตอร์ DX:AX - ↑สำหรับ
E3โอเปรนด์โค้ด (JCXZ/JECXZ) การเลือกใช้ว่าจะใช้CXหรือECXสำหรับการเปรียบเทียบ (และด้วยเหตุนี้จึงใช้ตัวย่อใด) ขึ้นอยู่กับขนาดที่อยู่ (AddressSize) ไม่ใช่ขนาดตัวดำเนินการ (OperandSize) (ในทางกลับกัน OperandSize จะควบคุมว่าปลายทางการกระโดดควรถูกตัดให้เหลือ 16 บิตหรือไม่)สิ่งนี้ยังใช้กับคำสั่งวนซ้ำLOOP,LOOPE,LOOPNE(โอเปรนด์โค้ดE0,E1,E2) ด้วย อย่างไรก็ตาม ต่างจากJCXZ/JECXZคำสั่งเหล่านี้ไม่ได้มีตัวย่อใหม่สำหรับเวอร์ชันที่ใช้ ECX - ↑สำหรับกรณีนี้
PUSHA(D)ค่าของ SP/ESP ที่ถูกผลักลงบนสแต็กคือค่าที่มันมีอยู่ก่อนที่PUSHA(D)คำสั่งจะเริ่มทำงาน - ↑สำหรับ
POPA/POPADรายการในสแต็กที่สอดคล้องกับ SP/ESP จะถูกดึงออกจากสแต็ก (โดยทำการอ่านหน่วยความจำ) แต่จะไม่ถูกใส่กลับเข้าไปใน SP/ESP - ↑คำ
PUSHFD`and`POPFDจะทำให้เกิดข้อยกเว้น `#GP` หากดำเนินการในโหมดเสมือน 8086หาก IOPL ไม่ใช่ 3`and`, `and` และ`or` จะทำให้เกิดข้อยกเว้น `#GP` หากดำเนินการในโหมดเสมือน 8086 หาก IOPL ไม่ใช่ 3 และ VME ไม่ได้เปิดใช้งานPUSHFPOPFIRETIRETD - ↑หาก
IRETDใช้เพื่อกลับจากโหมดเคอร์เนลไปยังโหมดผู้ใช้ (ซึ่งจะเกี่ยวข้องกับการเปลี่ยนแปลง CPL) และเซ็กเมนต์ สแต็กโหมดผู้ใช้ ที่ระบุโดย SS เป็นเซ็กเมนต์ 16 บิตIRETDคำสั่งจะคืนค่าเฉพาะ 16 บิตล่างของตัวชี้สแต็ก (ESP/RSP) เท่านั้น โดยบิตที่เหลือจะคงค่าใดก็ตามที่มีอยู่ในโค้ดเคอร์เนลก่อนหน้านั้นIRETDซึ่งทำให้จำเป็นต้องมีวิธีแก้ปัญหาที่ซับซ้อนทั้งใน Linux ("ESPFIX") [ 27 ]และ Windows [ 28 ]IRETQปัญหานี้ยังส่งผลกระทบต่อ คำสั่ง64 บิตในภายหลังด้วย
| ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ | คำอธิบาย | แหวน |
|---|---|---|---|
BT r/m, r | 0F A3 /r | การทดสอบบิต[ก] ตัวถูกดำเนินการตัวที่สองระบุบิตของตัว ถูกดำเนินการตัวแรกที่จะทดสอบ บิตที่จะทดสอบจะถูกคัดลอกไปยังEFLAGS.CF | 3 |
BT r/m, imm8 | 0F BA /4 ib | ||
BTS r/m, r | 0F AB /r | การทดสอบและตั้งค่าบิต[ a ] [ b ] ตัวถูกดำเนินการตัวที่สองระบุว่าต้องการทดสอบและตั้งค่าบิตใดของตัวถูกดำเนินการตัวแรก | |
BTS r/m, imm8 | 0F BA /5 ib | ||
BTR r/m, r | 0F B3 /r | การทดสอบบิตและการรีเซ็ต[ a ] [ b ] ตัวถูกดำเนินการตัวที่สองระบุว่าต้องการทดสอบและล้างบิตใดของตัวถูกดำเนินการตัวแรก | |
BTR r/m, imm8 | 0F BA /6 ib | ||
BTC r/m, r | 0F BB /r | การทดสอบบิตและการเติมเต็ม[ a ] [ b ] ตัวถูกดำเนินการตัวที่สองระบุว่าต้องการทดสอบและสลับบิตใดของตัวถูกดำเนินการตัวแรก | |
BTC r/m, imm8 | 0F BA /7 ib | ||
BSF r, r/m | NFx 0F BC /r[ค] | สแกนบิตไปข้างหน้า ส่งคืนดัชนีบิตของบิตที่ตั้งค่าต่ำที่สุดในอินพุต[ d ] | 3 |
BSR r, r/m | NFx 0F BD /r[ e ] | การสแกนบิตแบบย้อนกลับ ส่งคืนดัชนีบิตของบิตที่ตั้งค่าสูงสุดในอินพุต[ d ] | |
SHLD r/m, r, imm8 | 0F A4 /r ib | Shift Left Double การดำเนินการSHLD arg1,arg2,shamtคือ: [ f ]arg1 := (arg1<<shamt) | (arg2>>(operand_size - shamt)) | |
SHLD r/m, r, CL | 0F A5 /r | ||
SHRD r/m, r, imm8 | 0F AC /r ib | Shift Right Double การดำเนินการSHRD arg1,arg2,shamtคือ: [ f ]arg1 := (arg1>>shamt) | (arg2<<(operand_size - shamt)) | |
SHRD r/m, r, CL | 0F AD /r | ||
MOVZX reg, r/m8 | 0F B6 /r | แปลงจากแหล่งข้อมูล 8/16 บิตเป็นรีจิสเตอร์ 16/32 บิตพร้อมส่วนขยายศูนย์ | 3 |
MOVZX reg, r/m16 | 0F B7 /r | ||
MOVSX reg, r/m8 | 0F BE /r | แปลงจากซอร์สโค้ด 8/16 บิต เป็นรีจิส เตอร์16/32/64 บิต พร้อมการขยายเครื่องหมาย | |
MOVSX reg, r/m16 | 0F BF /r | ||
SETcc r/m8 | 0F 9x /0[ g ] [ h ] | กำหนดค่าไบต์เป็น 1 หากตรงตามเงื่อนไข และเป็น 0 หากไม่ตรงตามเงื่อนไข | |
Jcc rel16Jcc rel32 | 0F 8x cw0F 8x cd[ g ] | การกระโดดแบบมีเงื่อนไขในระยะใกล้ แตกต่างจากคำสั่งกระโดดแบบมีเงื่อนไขรุ่นเก่าตรงที่ยอมรับค่าออฟเซ็ต 16/32 บิต แทนที่จะเป็นเพียงค่าออฟเซ็ต 8 บิต | |
IMUL r, r/m | 0F AF /r | การคูณจำนวนเต็มสองตัวแปรแบบไม่ขยายขอบเขต | |
FS: | 64 | คำนำหน้าสำหรับแทนที่เซ็กเมนต์ในรีจิสเตอร์เซ็กเมนต์ FS และ GS | 3 |
GS: | 65 | ||
PUSH FS | 0F A0 | รีจิสเตอร์เซ็กเมนต์แบบพุช/ป๊อป FS และ GS | |
POP FS | 0F A1 | ||
PUSH GS | 0F A8 | ||
POP GS | 0F A9 | ||
LFS r16, m16&16LFS r32, m32&16 | 0F B4 /r | โหลดตัวชี้ระยะไกลจากหน่วยความจำ ส่วนออฟเซ็ตจะถูกเก็บไว้ในอาร์กิวเมนต์รีจิสเตอร์ปลายทาง ส่วนเซกเมนต์จะถูกเก็บไว้ในรีจิสเตอร์เซกเมนต์ FS/GS/SS ตามที่ระบุโดยคำสั่งย่อ[ i ] | |
LGS r16, m16&16LGS r32, m32&16 | 0F B5 /r | ||
LSS r16, m16&16LSS r32, m32&16 | 0F B2 /r | ||
MOV reg,CRx | 0F 20 /r[ j ] | ย้ายจากรีจิสเตอร์ควบคุมไปยังรีจิสเตอร์ทั่วไป[ k ] | 0 |
MOV CRx,reg | 0F 22 /r[ j ] | ย้ายจากรีจิสเตอร์ทั่วไปไปยังรีจิสเตอร์ควบคุม[ k ] การย้ายไปยัง ในโปรเซสเซอร์ Pentium และรุ่นที่ใหม่กว่า การย้ายไปยังรีจิสเตอร์ควบคุม | |
MOV reg,DRx | 0F 21 /r[ j ] | ย้ายจากรีจิสเตอร์ดีบัก x86ไปยังรีจิสเตอร์ทั่วไป[ k ] | |
MOV DRx,reg | 0F 23 /r[ j ] | ย้ายจากรีจิสเตอร์ทั่วไปไปยังรีจิสเตอร์ดีบัก x86 [ k ] ในโปรเซสเซอร์ Pentium และรุ่นที่ใหม่กว่า การย้ายข้อมูลไปยังรีจิสเตอร์ดีบัก DR0-DR7 จะดำเนินการแบบเรียงลำดับ | |
MOV reg,TRx | 0F 24 /r[ j ] | ย้ายจากรีจิสเตอร์ทดสอบ x86 ไปยังรีจิสเตอร์ทั่วไป[ n ] | |
MOV TRx,reg | 0F 26 /r[ j ] | ย้ายจากรีจิสเตอร์ทั่วไปไปยังรีจิสเตอร์ทดสอบ x86 [ n ] | |
| ICEBP, INT01, INT1 [ o ] | เอฟ1 | จุดหยุด การจำลองในวงจร ดำเนินการขัดจังหวะซอฟต์แวร์ #1 หากเรียกใช้เมื่อไม่ได้ใช้การจำลองวงจร[ p ] | 3 |
| UMOV r/m, r8 | 0F 10 /r | การย้ายข้อมูลของผู้ใช้ – ดำเนินการย้ายข้อมูลที่สามารถเข้าถึงหน่วยความจำของผู้ใช้ขณะอยู่ในโหมด HALT ของการจำลองวงจรภายใน ดำเนินการเช่นเดียวกับ | |
| UMOV r/m, r16/32 | 0F 11 /r | ||
| UMOV r8, r/m | 0F 12 /r | ||
| UMOV r16/32, r/m | 0F 13 /r | ||
| XBTS reg,r/m | 0F A6 /r | การแยกบิตฟิลด์ (เฉพาะ 386 รุ่นแรก) [ r ] [ s ] | |
| ไอบีเอส อาร์เอ็ม เรก | 0F A7 /r | การแทรกบิตฟิลด์ (เฉพาะรุ่น 386 ช่วงแรก) [ r ] [ s ] | |
| โหลดทั้งหมด D, โหลดทั้งหมด386 [ t ] | 0F 07 | โหลดค่าไปยังรีจิสเตอร์ CPU ทั้งหมดจากโครงสร้างข้อมูลขนาด 296 ไบต์ โดยเริ่มต้นที่ ES:EDI รวมถึงส่วน "ที่ซ่อนอยู่" ของรีจิสเตอร์ตัวอธิบายเซกเมนต์ด้วย | 0 |
- 1 2 3 4สำหรับ
BT,BTS,BTRและBTC:- หากอาร์กิวเมนต์แรกของคำสั่งเป็นตัวถูกดำเนินการในรีจิสเตอร์ และ/หรือ อาร์กิวเมนต์ที่สองเป็นค่าคงที่ ระบบจะคำนวณดัชนีบิตในอาร์กิวเมนต์ที่สองโดยหารด้วยขนาดของตัวถูกดำเนินการ (16/32/64 ซึ่งในทางปฏิบัติจะใช้เพียง 4, 5 หรือ 6 บิตล่างสุดของดัชนีเท่านั้น)
- ถ้าอาร์กิวเมนต์แรกเป็นตัวถูกดำเนินการในหน่วยความจำ และอาร์กิวเมนต์ที่สองเป็นตัวถูกดำเนินการในรีจิสเตอร์ ระบบจะใช้ดัชนีบิตในอาร์กิวเมนต์ที่สองทั้งหมด โดยจะถูกตีความว่าเป็นดัชนีบิตแบบมีเครื่องหมาย ซึ่งใช้ในการชดเชยที่อยู่หน่วยความจำที่จะใช้สำหรับการทดสอบบิต
- 1 2 3 คำ สั่ง
BTS,BTCและBTRยอมรับLOCK(F0) เมื่อใช้กับอาร์กิวเมนต์หน่วยความจำ – ซึ่งส่งผลให้คำสั่งทำงานแบบอะตอมิก - ↑หาก
F3ใช้คำนำหน้ากับ0F BC /rโอเปอเรเตอร์โค้ด คำสั่งจะทำงานบนTZCNTระบบที่รองรับส่วนขยาย BMI1TZCNTแตกต่างจากBSFตรงที่TZCNTแต่ไม่ใช่BSRถูกกำหนดให้ส่งคืนขนาดของตัวถูกดำเนินการหากตัวถูกดำเนินการต้นทางเป็นศูนย์ – สำหรับค่าตัวถูกดำเนินการต้นทางอื่นๆ จะให้ผลลัพธ์เดียวกัน (ยกเว้นแฟล็ก) - 1 2
BSFและBSRตั้งค่าแฟล็ก EFLAGS.ZF เป็น 1 หากอาร์กิวเมนต์ต้นทางเป็น 0 ทั้งหมด และเป็น 0 ในกรณีอื่น ๆหากอาร์กิวเมนต์ต้นทางเป็นศูนย์ทั้งหมด รีจิสเตอร์ปลายทางจะไม่มีการเปลี่ยนแปลงบนโปรเซสเซอร์ AMD [ 29 ]โดยปกติแล้วจะไม่มีการเปลี่ยนแปลงบนโปรเซสเซอร์ Intel เช่นกัน แต่มีข้อยกเว้นบางประการ:
- ใน โปรเซสเซอร์ Intel 64 รุ่นเก่าบางรุ่น รูปแบบ 32 บิตของ คำสั่ง
BSF/BSRจะใช้แหล่งที่มาเป็น 0 ทั้งหมด เพื่อไม่ให้ 32 บิตล่างของรีจิสเตอร์ปลายทางเปลี่ยนแปลง แต่จะล้าง 32 บิตบน[ 30 ] [ 31 ] - บนโปรเซสเซอร์ 386/486
BSF/BSRที่มีแหล่งที่มาเป็น 0 ทั้งหมดจะถูกบันทึกไว้ว่าส่งค่าที่ไม่กำหนดกลับเข้าไปในรีจิสเตอร์ปลายทาง — เวอร์ชัน 386/486 ส่วนใหญ่จะไม่เปลี่ยนแปลงรีจิสเตอร์ปลายทาง แต่ เวอร์ชัน Intel 486รุ่นแรกๆ บางเวอร์ชันเป็นที่ทราบกันว่ามีการแก้ไข รีจิสเตอร์ปลายทาง [ 32 ]
- ใน โปรเซสเซอร์ Intel 64 รุ่นเก่าบางรุ่น รูปแบบ 32 บิตของ คำสั่ง
- ↑หาก
F3ใช้คำนำหน้าพร้อมกับ0F BD /rโอเปอเรชันโค้ด คำสั่งจะทำงานLZCNTบนระบบที่รองรับส่วนขยาย ABM หรือ LZCNT ซึ่งLZCNTจะให้ผลลัพธ์ที่แตกต่างจากBSRสำหรับค่าอินพุตส่วนใหญ่ - 1 2สำหรับ
SHLDและSHRDจำนวนการเลื่อนจะถูกปิดบัง – บิต 5 บิตล่างสุดจะใช้สำหรับขนาดตัวดำเนินการ 16/32 บิต และ 6 บิตสำหรับขนาดตัวดำเนินการ 64 บิตSHLDและSHRDด้วยอาร์กิวเมนต์ 16 บิตและจำนวนการเลื่อนที่มากกว่า 16 จะให้ผลลัพธ์ที่ไม่แน่นอน (ผลลัพธ์ที่แท้จริงจะแตกต่างกันไปในซีพียู Intel ต่างๆ โดยมีพฤติกรรมที่แตกต่างกันอย่างน้อยสามแบบที่ทราบ [ 33 ] ) - 1 2รหัสเงื่อนไขที่รองรับสำหรับและ(รหัสปฏิบัติการและตามลำดับ โดยที่ ตัวเลข xระบุเงื่อนไข) มีดังนี้:
SETccJcc near0F 9x /00F 8xx ซีซี เงื่อนไข ( EFLAGS ) 0 โอ OF=1: "โอเวอร์โฟลว์" 1 เลขที่ OF=0: "ไม่เกิดการล้น" 2 ซี บี เอ็นเอ CF=1: "ทด", "ต่ำกว่า", "ไม่สูงกว่าหรือเท่ากับ" 3 เอ็นซี,เอ็นบี,เออี CF=0: "ไม่ทด" , "ไม่ต่ำกว่า" , "สูงกว่าหรือเท่ากับ" 4 ซี,อี ZF=1: "ศูนย์", "เท่ากับ" 5 นิวซีแลนด์, ตะวันออกเฉียงเหนือ ZF=0: "ไม่ใช่ศูนย์" , "ไม่เท่ากับ" 6 นา บีอี (CF=1 หรือ ZF=1): "ไม่สูงกว่า" , "ต่ำกว่าหรือเท่ากับ" 7 เอ,เอ็นบีอี (CF=0 และ ZF=0): "สูงกว่า", "ไม่ต่ำกว่าหรือเท่ากับ" 8 เอส SF=1: "เครื่องหมาย" 9 เอ็นเอส SF=0: "ไม่ต้องระบุเครื่องหมาย" เอ พี,พีอี PF=1: "พาริตี", "พาริตีคู่" บี NP,PO PF=0: "ไม่ใช่พาริตี" , "พาริตีคี่" ซี แอลเอ็นจีโอ SF≠OF: "น้อยกว่า", "ไม่มากกว่าหรือเท่ากับ" ดี NL,GE SF=OF: "ไม่น้อยกว่า" , "มากกว่าหรือเท่ากับ" อี เล,เอ็นจี (ZF=1 หรือ SF≠OF): "น้อยกว่าหรือเท่ากับ" , "ไม่มากกว่า" เอฟ เอ็นแอลอี,จี (ZF=0 และ SF=OF): "ไม่น้อยกว่าหรือเท่ากับ" , "มากกว่า" - ↑สำหรับ คำสั่ง `modR/M`
SETccนั้น โดยทั่วไปแล้วรหัสคำสั่งจะถูกระบุเป็น `/0` ซึ่งหมายความว่าบิตที่ 5:3 ของไบต์ ModR/M ของคำสั่งควรเป็น 000 แต่โปรเซสเซอร์ x86 รุ่นใหม่ๆ (Pentium และรุ่นต่อมา) จะไม่สนใจบิตที่ 5:3 และจะดำเนินการคำสั่งโดยไม่คำนึงถึงเนื้อหาของบิตเหล่านั้นSETcc - ↑สำหรับ
LFS,LGSและLSS, ขนาดของส่วนออฟเซ็ตของตัวชี้ระยะไกลจะกำหนดโดยขนาดของตัวถูกดำเนินการ – ขนาดของส่วนเซกเมนต์จะมีค่า 16 บิตเสมอ ในโหมด 64 บิต การใช้REX.Wคำนำหน้ากับคำสั่งเหล่านี้จะทำให้โหลดตัวชี้ระยะไกลด้วยออฟเซ็ต 64 บิตบนโปรเซสเซอร์ Intel แต่ไม่ใช่บนโปรเซสเซอร์ AMD - 1 2 3 4 5 6สำหรับ
MOVไปยัง/จากCRxรีDRxและTRxส่วน reg ของ ไบต์ ModR/Mใช้เพื่อระบุCRx/DRx/TRxรีจิสเตอร์ และส่วน r/m ใช้เพื่อระบุรีจิสเตอร์ทั่วไป สำหรับโอเปรเตอร์โค้ดนั้นMOV CRx/DRx/TRxบิตสองบิตบนสุดของ ไบต์ ModR/Mจะถูกละเว้น โอเปรเตอร์โค้ดเหล่านี้จะถูกถอดรหัสและดำเนินการราวกับว่าบิตสองบิตบนสุดของไบต์ ModR/M เป็นค่า11bว่าง - 1 2 3 4สำหรับการย้ายข้อมูลเข้า/ออกจาก
CRxและDRxขนาดของตัวดำเนินการจะมีขนาด 64 บิตเสมอในโหมด 64 บิต และ 32 บิตในกรณีอื่นๆ - ↑ในโปรเซสเซอร์ที่รองรับเพจส่วนกลาง (Pentium และรุ่นที่ใหม่กว่า) รายการในตารางเพจส่วนกลางจะไม่ถูกล้างด้วยคำ
MOVสั่งCR3− แต่สามารถล้างรายการเหล่านี้ได้โดยการสลับบิต CR4.PGE แทนในโปรเซสเซอร์ที่รองรับPCIDการเขียนข้อมูล
CR3ในขณะที่เปิดใช้งาน PCID จะทำการล้างเฉพาะรายการ TLB ที่เป็นของ PCID ที่ระบุไว้ในบิต 11:0 ของค่าที่เขียนลงไปเท่านั้นCR3การล้างเพจที่เป็นของ PCID อื่นๆ สามารถทำได้โดยการสลับบิต CR4.PGE การล้างบิต CR4.PCIDE หรือใช้INVPCIDคำสั่งในโหมด 64 บิต สามารถระงับการล้าง TLB ได้โดยการตั้งค่าบิตที่ 63 ของค่าที่เขียนลงไป
CR3เป็น 1 - ↑บนโปรเซสเซอร์ก่อน Pentiumการย้ายไปยัง
CR0จะไม่เรียงลำดับกระแสคำสั่ง – ด้วยเหตุนี้ จึงมักจำเป็นต้องทำการกระโดด (JMPหรือCALL) ทันทีหลังจากMOVไปยังCR0หากMOVใช้เพื่อเปิด/ปิดโหมดป้องกันและ/หรือการแบ่งหน้าหน่วยความจำ [ 34 ] นี่อาจเป็นการกระโดดใกล้หรือไกลก็ได้ – ทั้งสองแบบจะใช้ได้สำหรับการล้างคิวคำสั่ง แต่การกระโดดไกลจำเป็นสำหรับการอัปเดตสิทธิ์การเข้าถึงสำหรับเซกเมนต์ CS [ 35 ]เมื่อบิต CR0.PG ถูกสลับ (เปิดหรือปิดเพจจิ้ง) ผลกระทบต่อการดึงคำสั่งจะเกิดขึ้นทันทีบนโปรเซสเซอร์ Pentium Pro และรุ่นต่อมา อย่างไรก็ตาม บนโปรเซสเซอร์ 386/486/Pentium ผลกระทบจะล่าช้าอย่างน้อย 1 คำสั่ง — ความแตกต่างนี้เป็นที่ทราบกันดีว่าทำให้เกิดปัญหาความเข้ากันได้ เช่น กับSCO UNIX 3.2v4.0 [ 36 ]
MOVตามCR2สถาปัตยกรรมแล้วมีการระบุว่าเป็นแบบอนุกรม แต่มีรายงานว่าไม่ใช่แบบอนุกรมในโปรเซสเซอร์ Intel Core-i7 อย่างน้อยบางรุ่น[ 37 ]MOVฟังก์ชัน `to`CR8(ซึ่งถูกนำมาใช้กับสถาปัตยกรรม x86-64) จะทำงานบนโปรเซสเซอร์ AMD แต่ไม่ทำงานในโปรเซสเซอร์ Intel - 1 2คำ
MOV TRxสั่งดังกล่าวถูกยกเลิกตั้งแต่ Pentium เป็นต้นไป - ↑คำ
INT1/ICEBP(F1) มีอยู่ในโปรเซสเซอร์ Intel x86 ที่รู้จักทั้งหมดตั้งแต่ 80386 เป็นต้นไป [ 38 ]แต่มีการจัดทำเอกสารอย่างครบถ้วนสำหรับโปรเซสเซอร์ Intel ตั้งแต่การเผยแพร่ Intel SDM (rev 067) ในเดือนพฤษภาคม 2018 เป็นต้นไป [ 39 ]ก่อนการเผยแพร่นี้ การกล่าวถึงคำสั่งในเอกสารของ Intel เป็นไปอย่างประปราย เช่น AP-526 rev 001 [ 40 ]สำหรับโปรเซสเซอร์ AMD คำสั่งนี้ได้รับการจัดทำเอกสารมาตั้งแต่ปี 2002 [ 41 ] - ↑การทำงานของ
F1(ICEBP) แตกต่างจากการทำงานของโอเปรนด์การขัดจังหวะซอฟต์แวร์ทั่วไปCD 01ในหลายๆ ด้าน:- ในโหมดป้องกัน ระบบ
- ในโหมด virtual-8086
CD 01จะตรวจสอบ CPL กับ IOPL เพื่อตรวจสอบสิทธิ์การเข้าถึงด้วย ในขณะที่โหมดอื่นF1จะไม่ตรวจสอบ - ในโหมด virtual-8086 ที่เปิดใช้งาน VME การเปลี่ยนเส้นทางการขัดจังหวะจะได้รับการสนับสนุนสำหรับ
CD 01แต่ไม่ใช่F1สำหรับ
CD 01จะตรวจสอบ CPL กับฟิลด์ DPL ของตัวอธิบายการขัดจังหวะเพื่อตรวจสอบสิทธิ์การเข้าถึง ในขณะที่โหมดอื่นF1จะไม่ทำเช่นนั้น - ในโหมด virtual-8086
- ↑คำสั่ง UMOV มีอยู่ในโปรเซสเซอร์ 386 และ 486 เท่านั้น [ 38 ]
- 1 2คำ
XBTSและIBTSถูกยกเลิกในรุ่น B1 ของ 80386 คำสั่ง เหล่านี้ถูกใช้โดยซอฟต์แวร์เป็นหลักเพื่อตรวจจับข้อบกพร่อง [ 42 ] ใน รุ่น B0 ของ 80386 Microsoft Windows (เวอร์ชัน 2.01 และใหม่กว่า) จะพยายามเรียกใช้XBTSคำสั่งเป็นส่วนหนึ่งของการตรวจจับ CPU หากCPUIDไม่มีคำสั่งนี้อยู่ และจะปฏิเสธการบูตหากXBTSพบว่าคำสั่งนี้ทำงานอยู่ [ 43 ] - 1 2สำหรับ
XBTSและIBTSอาร์กิวเมนต์ r/m แทนข้อมูลที่จะดึง/แทรกบิตฟิลด์จาก/ไปยัง อาร์กิวเมนต์ reg แทนบิตฟิลด์ที่จะแทรก/ดึง AX/EAX แทนค่าออฟเซ็ตบิต และ CL แทนความยาวบิตฟิลด์ [ 44 ] - ↑ไม่มีเอกสาร เฉพาะ 80386 เท่านั้น [ 45 ]
เพิ่มด้วย80486
| คำแนะนำ | รหัสปฏิบัติการ | คำอธิบาย | แหวน |
|---|---|---|---|
BSWAP r32 | 0F C8+r | การสลับลำดับไบต์ (Byte Order Swap) โดยปกติใช้เพื่อแปลงระหว่าง การแสดงข้อมูล แบบ big-endian และ little-endianสำหรับรีจิสเตอร์ 32 บิต การดำเนินการที่ทำคือ:r = (r << 24) | ((r << 8) & 0x00FF0000) | ((r >> 8) & 0x0000FF00) | (r >> 24); การใช้งาน | 3 |
CMPXCHG r/m8,r8 | 0F B0 /r[ข] | เปรียบเทียบและแลกเปลี่ยนถ้าค่าสะสม (AL/AX/EAX/RAX) เท่ากับค่าตัวถูกดำเนินการตัวแรก[ c ]จะEFLAGS.ZFถูกตั้งค่าเป็น 1 และค่าตัวถูกดำเนินการตัวแรกจะถูกเขียนทับด้วยค่าตัวถูกดำเนินการตัวที่สอง มิฉะนั้นEFLAGS.ZFจะถูกตั้งค่าเป็น 0 และค่าตัวถูกดำเนินการตัวแรกจะถูกคัดลอกไปยังค่าสะสม คำสั่งนี้จะเป็นอะตอมิกก็ต่อเมื่อใช้ร่วมกับ | |
CMPXCHG r/m,r16CMPXCHG r/m,r32 | 0F B1 /r[ข] | ||
XADD r/m,r8 | 0F C0 /r | eXchange และ ADDสลับค่าตัวถูกดำเนินการตัวแรกกับค่าตัวถูกดำเนินการตัวที่สอง จากนั้นเก็บผลรวมของค่าทั้งสองลงในค่าตัวถูกดำเนินการปลายทาง คำสั่งนี้จะเป็นอะตอมิกก็ต่อเมื่อใช้ร่วมกับ | |
XADD r/m,r16XADD r/m,r32 | 0F C1 /r | ||
INVLPG m8 | 0F 01 /7 | ยกเลิก รายการ TLBที่จะใช้สำหรับตัวดำเนินการหน่วยความจำขนาด 1 ไบต์[ d ] คำสั่งกำลังเรียงลำดับ | 0 |
WBINVD | NFx 0F 09[ e ] | เขียนกลับและล้างแคช[ f ] [ g ]เขียนบรรทัดแคชที่แก้ไขทั้งหมดในแคชภายในของโปรเซสเซอร์กลับไปยังหน่วยความจำหลักและล้างแคชภายใน | |
INVD | 0F 08 | ยกเลิกแคชภายใน[ f ] [ g ]ข้อมูลที่แก้ไขในแคชจะไม่ถูกเขียนกลับไปยังหน่วยความจำ ซึ่งอาจทำให้ข้อมูลสูญหายได้ | 0 [ h ] |
- ↑การใช้งาน
BSWAPร่วมกับรีจิสเตอร์ 16 บิตไม่ได้ถูกห้ามโดยตัวมันเอง (มันจะทำงานโดยไม่ก่อให้เกิด #UD หรือข้อยกเว้นอื่นๆ) แต่มีเอกสารระบุว่าจะให้ผลลัพธ์ที่ไม่แน่นอน – มีรายงานว่าจะให้ผลลัพธ์ที่แตกต่างกันไปบน 486, [ 46 ] 586และ Bochs / QEMU [ 47 ] - 1 2บน Intel 80486 stepping A [ 48 ]คำ
CMPXCHGสั่งจะใช้การเข้ารหัสที่แตกต่างกัน -0F A6 /rสำหรับตัวแปร 8 บิต0F A7 /rสำหรับตัวแปร 16/32 บิต0F B0/B1การเข้ารหัสเหล่านี้ใช้ใน 80486 stepping B และรุ่นต่อมา [ 49 ] [ 50 ] - ↑ชุด
CMPXCHGคำสั่งEFLAGSในลักษณะเดียวกับCMPคำสั่งที่ใช้ตัวสะสม (AL/AX/EAX/RAX) เป็นอาร์กิวเมนต์ตัวแรก - ↑
INVLPGจะดำเนินการโดยไม่มีการทำงานใดๆ หากอาร์กิวเมนต์ m8 ไม่ถูกต้อง (เช่น หน้าที่ไม่ได้แมป หรือที่อยู่ที่ไม่เป็นไปตามแบบแผน)INVLPGสามารถใช้เพื่อยกเลิกรายการ TLB สำหรับแต่ละหน้าทั่วโลกได้ - ↑หาก
F3มีการใช้คำนำหน้าพร้อมกับ0F 09รหัสคำสั่ง คำสั่งนั้นจะถูกดำเนินการบนWBNOINVDโปรเซสเซอร์ที่รองรับส่วนขยาย WBNOINVD ซึ่งจะไม่ทำให้แคชไม่ถูกต้อง - 1 2 คำสั่ง `
INVDand` และ `WBINVDvailable` จะทำให้แคชไลน์ทั้งหมดในแคช L1 ของ CPU เป็นโมฆะ การทำให้เนื้อหาในแคช L2/L3 เป็นโมฆะด้วยหรือไม่นั้นขึ้นอยู่`INVDand` และ `WBINVDvailable` จะไม่ขัดขวางการดึง ข้อมูลแคช ล่วงหน้าในขณะที่คำสั่งกำลังทำงานอยู่ — หากจำเป็นต้องรับประกันว่าแคชว่างเปล่า จะต้องตั้งค่า `if`CR0.CDเป็น 1 ก่อนเรียกใช้คำสั่งใดคำสั่งหนึ่งเหล่านี้ (หากแคชถูกใช้ร่วมกันระหว่างโปรเซสเซอร์เชิงตรรกะหลายตัว การทำให้แคชว่างเปล่าจำเป็นต้องให้โปรเซสเซอร์เชิงตรรกะทั้งหมดที่ใช้แคชร่วมกันCR0.CDตั้งค่าบิต `if` เป็น 1 ก่อนINVDหรือ `WBINVDvailable`) - 1 2คำ
INVDเหล่านี้WBINVDเป็นการทำงานแบบเรียงลำดับ – ในบางโปรเซสเซอร์ คำสั่งเหล่านี้อาจบล็อกการขัดจังหวะจนกว่าจะเสร็จสมบูรณ์ - ↑มีหลายกรณีที่
INVDคำสั่งนี้ไม่สามารถดำเนินการได้แม้ภายใต้ ring 0:- บนโปรเซสเซอร์ที่รองรับIntel SGXหากมีการตั้งค่า PRM (Processor Reserved Memory) โดยใช้ PRMRRs (PRM range registers)
INVDคำสั่งดังกล่าวจะไม่ได้รับอนุญาตและจะทำให้เกิดข้อยกเว้น #GP(0) [ 51 ] - บนโปรเซสเซอร์ที่รองรับIntel TDXหากมีการตั้งค่า SEAM (SEcure Arbitration Mode) ไว้
INVDจะทำให้เกิด #GP(0) - ในโปรเซสเซอร์ Intel รุ่นใหม่บางรุ่น ( Meteor Lake / Arrow Lakeและรุ่นต่อมา) การพยายามเรียกใช้
INVDเมื่อบิตที่ 0 ของ MSR ถูกตั้งค่าจะส่งผลให้เกิดข้อผิดพลาด #GP(0) ซึ่งจะป้องกัน การใช้งานคำสั่งนี้ใน ส่วนที่ไม่ใช่ BIOSMSR_BIOS_DONEอย่างมีประสิทธิภาพ - ภายใต้ ระบบเวอร์ชวลไลเซชัน Intel VT-x คำสั่ง นี้
INVDจะทำให้เกิดการเรียกใช้ #VMEXIT โดยบังคับ
- บนโปรเซสเซอร์ที่รองรับIntel SGXหากมีการตั้งค่า PRM (Processor Reserved Memory) โดยใช้ PRMRRs (PRM range registers)
คำสั่งเกี่ยวกับจำนวนเต็ม/ระบบ ซึ่งไม่มีอยู่ในชุดคำสั่งพื้นฐานของ 80486 แต่ถูกเพิ่มเข้ามาในโปรเซสเซอร์ x86 ต่างๆ ก่อนการเปิดตัว SSE ( ไม่รวมคำสั่งที่เลิกใช้แล้ว )
| คำแนะนำ | รหัสปฏิบัติการ | คำอธิบาย | แหวน | เพิ่มใน |
|---|---|---|---|---|
RDMSR | 0F 32[ก] | อ่านรีจิสเตอร์เฉพาะรุ่น (Model-specific register ) MSR ที่จะอ่านนั้นระบุไว้ใน ECX จากนั้นค่าของ MSR จะถูกส่งกลับเป็นค่า 64 บิตใน EDX:EAX [ b ] [ c ] คำสั่งนี้ไม่ได้เรียงลำดับ[ d ] | 0 | IBM 386SLC , [ 60 ] Intel Pentium , AMD K5 , Cyrix 6x86MX , MediaGXm , IDT WinChip C6, Transmeta Crusoe , DM&P Vortex86 DX3 |
WRMSR | 0F 30[ก] | เขียนรีจิสเตอร์เฉพาะรุ่น MSR ที่จะเขียนระบุไว้ใน ECX และค่า 64 บิตที่จะเขียนระบุไว้ใน EDX:EAX [ e ] [ c ] โดยส่วนใหญ่แล้ว คำสั่งจะถูกเรียงลำดับ[ f ] | ||
RSM[ 68 ] | 0F AA | กลับมาทำงาน ต่อ จากโหมดการจัดการระบบ คำสั่งกำลังเรียงลำดับ | -2 (SMM) | Intel 386SL, [ 69 ] [ 70 ] 486SL , [ g ] Intel Pentium , AMD 5x86 , Cyrix 486SLC /e, [ 71 ] IDT WinChip C6, Transmeta Crusoe , Rise mP6 |
CPUID | 0F A2 | ข้อมูลการระบุตัวตนและคุณลักษณะของ CPU รับอินพุตเป็นดัชนีใบ CPUID ใน EAX และขึ้นอยู่กับใบนั้น ดัชนีย่อยใน ECX ผลลัพธ์จะถูกส่งคืนใน EAX, EBX, ECX, EDX [ h ] คำสั่งนี้ทำงานแบบเรียงลำดับ และทำให้เกิดการเรียกใช้ #VMEXIT โดยอัตโนมัติภายใต้ระบบเวอร์ชวลไลเซชัน
| โดยปกติ 3 [ i ] | Intel Pentium , [ j ] AMD 5x86 , [ j ] Cyrix 5x86 , [ k ] IDT WinChip C6, Transmeta Crusoe , Rise mP6 , NexGen Nx586 , [ l ] UMC Green CPU |
CMPXCHG8B m64 | 0F C7 /1 | เปรียบเทียบและแลกเปลี่ยนข้อมูล 8 ไบต์ เปรียบเทียบ EDX:EAX กับ m64 ถ้าเท่ากัน ให้ตั้งค่า ZF [ m ]และเก็บ ECX:EBX ลงใน m64 มิฉะนั้น ให้ล้าง ZF และโหลด m64 ลงใน EDX:EAX คำสั่งนี้เป็นอะตอมิกก็ต่อเมื่อใช้ร่วมกับ | 3 | Intel Pentium , AMD K5 , Cyrix 6x86L , MediaGXm , IDT WinChip C6, [ o ] Transmeta Crusoe , [ o ] Rise mP6 [ o ] , DM&P Vortex86 DX2 |
RDTSC | 0F 31 | อ่าน ค่าตัวนับเวลา (TSC) 64 บิตลงใน EDX:EAX [ p ] [ b ] [ q ] ในโปรเซสเซอร์รุ่นแรกๆ TSC เป็นตัวนับรอบการทำงาน โดยเพิ่มขึ้นทีละ 1 ในแต่ละรอบสัญญาณนาฬิกา (ซึ่งอาจทำให้อัตราการเพิ่มขึ้นเปลี่ยนแปลงไปในโปรเซสเซอร์ที่สามารถเปลี่ยนความเร็วสัญญาณนาฬิกาได้ในระหว่างการทำงาน) – ในโปรเซสเซอร์รุ่นหลังๆ TSC จะเพิ่มขึ้นในอัตราคงที่ซึ่งไม่จำเป็นต้องตรงกับความเร็วสัญญาณนาฬิกาของ CPU [ r ] | โดยปกติ 3 [วินาที] | Intel Pentium , AMD K5 , Cyrix 6x86MX , MediaGXm , IDT WinChip C6, Transmeta Crusoe , Rise mP6 , DM&P Vortex86 DX3 |
RDPMC | 0F 33[ก] | อ่านค่าตัวนับการตรวจสอบประสิทธิภาพตัวนับที่จะอ่านนั้นระบุโดย ECX และค่าของมันจะถูกส่งกลับมาใน EDX:EAX [ p ] [ b ] | โดยปกติ 3 [ t ] | Intel Pentium MMX , Intel Pentium Pro , AMD K7 , Cyrix 6x86MX , IDT WinChip C6, AMD Geode LX , VIA Nano [ u ] |
CMOVcc reg,r/m | 0F 4x /r[ v ] | การย้ายแบบมีเงื่อนไขไปยังรีจิสเตอร์ ตัวถูกดำเนินการต้นทางอาจเป็นรีจิสเตอร์หรือหน่วยความจำก็ได้[ w ] | 3 | Intel Pentium Pro , AMD K7 , Cyrix 6x86MX , MediaGXm , Transmeta Crusoe , VIA C3 "เนหะมีย์" , [ x ] DM&P Vortex86 DX3 |
NOP r/m,NOPL r/m | NFx 0F 1F /0[ y ] | NOP อย่างเป็นทางการ แบบ ยาว นอกเหนือจาก AMD K7/K8 แล้ว ยังไม่ได้รับการสนับสนุนอย่างกว้างขวางในโปรเซสเซอร์ที่ไม่ใช่ Intel ที่วางจำหน่ายก่อนปี 2548 [ z ] [ 91 ] | 3 | Intel Pentium Pro , [ aa ] AMD K7 , x86-64 , [ ab ] VIA C7 [ 96 ] |
UD2[ ac ] [ ad ]UD2A | 0F 0B | คำสั่งที่ไม่กำหนด – จะทำให้เกิด ข้อยกเว้น รหัสคำสั่งไม่ถูกต้อง (#UD) ในทุกโหมดการทำงาน[ ae ] คำสั่งเหล่านี้มีไว้สำหรับการทดสอบซอฟต์แวร์เพื่อสร้างโอเปอเรเตอร์โค้ดที่ไม่ถูกต้องโดยเฉพาะ โอเปอเรเตอร์โค้ดสำหรับคำสั่งเหล่านี้สงวนไว้เพื่อจุดประสงค์นี้ | (3) | ( 80186 ), [ af ] Intel Pentium [ 101 ] |
UD1 reg,r/m, [ ag ] UD2B reg,r/m[ ad ] | 0F B9, 0F B9 /r[ ah ] | |||
OIO, UD0, UD0 reg,r/m[ ai ] | 0F FF, 0F FF /r[ ah ] | ( 80186 ), [ af ] Cyrix 6x86 , [ 107 ] AMD K5 [ 109 ] | ||
SYSCALL | 0F 05 | การเรียกใช้ระบบอย่างรวดเร็ว | 3 [ aj ] | AMD K6 , [ ak ] x86-64 [อัล] [ am ] |
SYSRET | 0F 07[หนึ่ง] | ส่งคืนค่าอย่างรวดเร็วจากการเรียกใช้ระบบ ออกแบบมาเพื่อใช้งานร่วมกับSYSCALL. | 0 [ aj ] | |
SYSENTER | 0F 34 | การเรียกใช้ระบบอย่างรวดเร็ว | 3 [ aj ] | Intel Pentium II , [ ao ] AMD K7 , [ 115 ] [ ap ] Transmeta Crusoe , [ aq ] NatSemi Geode GX2 , VIA C3 "Nehemiah" , [ ar ] DM&P Vortex86 DX3 |
SYSEXIT | 0F 35[หนึ่ง] | ส่งคืนค่าอย่างรวดเร็วจากการเรียกใช้ระบบ ออกแบบมาเพื่อใช้งานร่วมกับSYSENTER. | 0 [ aj ] | |
- เอกสาร Intel 64 รุ่นแรก ๆระบุว่าสำหรับคำ,และในโหมด 64 บิต คำสั่งเหล่านี้สามารถเข้ารหัสด้วยคำนำหน้าเพื่อให้ตีความรีจิสเตอร์ RCX เป็นดัชนี MSR/PMC 64 บิตเต็ม [ 52 ] สิ่งนี้ถูก ลบออกจากเอกสาร Intel 64 รุ่นหลังๆ (SDM rev 023 [ 53 ] และรุ่นต่อ มา ) ซึ่งระบุว่าคำสั่งเหล่านี้จะละเว้น 32 บิตบนสุดของ RCX เสมอโดยไม่คำนึงถึงคำนำหน้า REX ใดๆ
RDMSRWRMSRRDPMCREX.Wในโปรเซสเซอร์ x86-64 ที่รู้จักทั้งหมด คำสั่งเหล่านี้จะยอมรับแต่จะไม่สนใจคำนำหน้า REX และจะไม่สนใจ 32 บิตบนสุดของ RCX
- 1 2 3ในโหมด 64 บิต คำสั่ง ,
RDMSRและRDTSCจะRDPMCตั้งค่า 32 บิตบนสุดของ RDX และ RAX ให้เป็นศูนย์ - 1 2สำหรับชุด CPU/MSR บางชุด
RDMSRและWRMSRอาจใช้รีจิสเตอร์อื่นนอกเหนือจาก ECX และ EDX:EAX ตัวอย่างที่ทราบกันดี ได้แก่ การใช้ EDI [ 54 ] [ 55 ]และ ESI [ 56 ]สำหรับรหัสผ่าน และ EBX [ 57 ]สำหรับที่อยู่หน่วยความจำทางกายภาพ - ↑การอ่าน MSR ที่ทำด้วย
RDMSRand สามารถ จัดลำดับใหม่ได้RDMSRLISTโดยทั่วไปเมื่อเทียบกับคำสั่งอื่นๆ รวมถึงการอ่าน MSR อื่นๆ — โดยมีข้อจำกัดดังต่อไปนี้: [ 58 ] [ 59 ]- การเข้าถึง MSR ไม่สามารถจัดลำดับใหม่ได้ระหว่างคำสั่งการจัดลำดับ (เช่น
CPUID,IRET) หรือคำสั่งการจัดลำดับการส่ง (เช่นLFENCE) - การอ่าน MSR จาก
IA32_BARRIERMSR (MSR2Fhซึ่งถูกนำมาใช้ในส่วนขยายชุดคำสั่ง MSRLIST) ไม่สามารถจัดลำดับใหม่ได้ระหว่างการอ่าน MSR อื่นๆ - การเข้าถึง MSR ของ x2APICไม่สามารถจัดลำดับใหม่ได้เมื่อเทียบกับการเข้าถึง MSR อื่นๆ
- การเข้าถึง MSR ไม่สามารถจัดลำดับใหม่ได้ระหว่างคำสั่งการจัดลำดับ (เช่น
- ↑บนซีพียู Intel, AMD และ VIA
WRMSRคำสั่งนี้ยังใช้เพื่ออัปเดตไมโครโค้ดของซีพียู ด้วย โดยจะทำโดยการเขียนที่อยู่เสมือนของไมโครโค้ดใหม่เพื่ออัปโหลดไปยัง MSRซีพียู79hIntel และ VIA [ 61 ] และ MSRC001_0020h[ 62 ]บนซีพียู AMD - ↑การเขียนไปยัง MSR ต่อไปนี้จะไม่เรียงลำดับ: [ 63 ] [ 64 ]
ตัวเลข ชื่อ 48hSPEC_CTRL 49hพรีด_ซีเอ็มดี 10Bhฟลัช_ซีเอ็มดี 122hทีเอสเอ็กซ์_ซีทีอาร์แอล 6E0hTSC_DEADLINE 6E1hพีเคอาร์เอส 774hHWP_REQUEST (จะไม่ทำการซีเรียลไลซ์เฉพาะในกรณีที่บิต FAST_IA32_HWP_REQUEST 802hถึง83Fh(x2APIC MSRs) 1B01hUARCH_MISC_CTL C001_0100hFS_BASE (ไม่เรียงลำดับบน AMD Zen 4และรุ่นต่อมา) [ 65 ] C001_0101hGS_BASE ( Zen 4และรุ่นที่ใหม่กว่า) C001_0102hKernelGSbase ( Zen 4และรุ่นที่ใหม่กว่า) C001_011Bhเครื่องบันทึกสัญญาณกริ่งประตู (สำหรับ AMD เท่านั้น) WRMSRโดยทั่วไปแล้ว ICR (Interrupt Command Register; MSR830h) ของ x2APIC จะใช้ในการสร้าง IPI ( Inter-processor interrupt ) บนซีพียู Intel [ 66 ]แต่ไม่ใช่ AMD [ 67 ]โดย IPI ดังกล่าวสามารถจัดลำดับใหม่ได้ก่อนการจัดเก็บหน่วยความจำแบบเก่า - ↑โหมดการจัดการระบบและ
RSMคำสั่งต่างๆ มีให้ใช้งานใน Intel 486 รุ่นที่ไม่ใช่ SL เท่านั้น หลังจากที่ Intel Pentium เปิดตัวครั้งแรกในปี 1993 - ↑ในโปรเซสเซอร์ 32 บิตรุ่นเก่าบางตัว การดำเนินการ
CPUIDด้วยดัชนีใบ (EAX) ที่มากกว่า 0 อาจทำให้ EBX และ ECX ไม่เปลี่ยนแปลง โดยคงค่าเดิมไว้ ด้วยเหตุนี้ จึงแนะนำให้ตั้งค่า EBX และ ECX เป็นศูนย์ก่อนดำเนินการCPUIDโปรเซสเซอร์ที่พบว่ามีพฤติกรรมนี้ ได้แก่ Cyrix MII [ 72 ]และ IDT WinChip 2 [ 73 ]ในโหมด 64 บิตCPUIDจะตั้งค่า 32 บิตบนสุดของ RAX, RBX, RCX และ RDX เป็นศูนย์ - ↑ในโปรเซสเซอร์ Intel บางรุ่นตั้งแต่ Ivy Bridge เป็นต้นไป มี MSR ที่สามารถใช้เพื่อจำกัด
CPUIDให้อยู่ใน ring 0 ได้ MSR ดังกล่าวได้รับการบันทึกไว้อย่างน้อยสำหรับ Ivy Bridge [ 74 ]และ Denverton [ 75 ]ความสามารถในการจำกัดให้อยู่CPUIDใน ring 0 ยังมีอยู่ในโปรเซสเซอร์ AMD ที่รองรับคุณสมบัติ "CpuidUserDis" ( Zen 4 "Raphael" และรุ่นต่อมา) [ 76 ] - 1 2
CPUIDยังมีให้ใช้งานในโปรเซสเซอร์ Intel และ AMD 486 บางรุ่นที่วางจำหน่ายหลังจาก Intel Pentium รุ่นแรกวางจำหน่าย - ↑บนซีพียู Cyrix 5x86 และ 6x86 ฟังก์ชันนี้
CPUIDไม่ได้เปิดใช้งานโดยค่าเริ่มต้น และต้องเปิดใช้งานผ่านรีจิสเตอร์การกำหนดค่าของ Cyrix - ↑บนซีพียู NexGen
CPUIDรองรับเฉพาะ BIOS ของระบบบางตัวเท่านั้น บนซีพียู NexGen บางตัวที่รองรับCPUIDEFLAGS.ID ไม่ได้รับการสนับสนุน แต่ EFLAGS.AC ได้รับการสนับสนุน ทำให้การตรวจจับซีพียูซับซ้อนขึ้น [ 77 ] - ↑ แตกต่างจาก คำสั่งเดิมคำสั่งนี้ไม่ได้แก้ไข บิต EFLAGS ใดๆ นอกเหนือจาก ZF
CMPXCHGCMPXCHG8B - การใช้ ↑
LOCK CMPXCHG8Bกับตัวดำเนินการรีจิสเตอร์ (ซึ่งเป็นการเข้ารหัสที่ไม่ถูกต้อง) จะ ทำให้ เครื่องค้างแทนที่จะแสดงข้อผิดพลาด #UD ตามที่คาดไว้ซีพียู Intel Pentium บางรุ่น ซึ่งเป็นที่รู้จักกันในชื่อบั๊ก Pentium F00F - 1 2 3บนโปรเซสเซอร์ IDT WinChip, Transmeta Crusoe และ Rise mP6
CMPXCHG8Bคำสั่งนี้ได้รับการสนับสนุนเสมอ อย่างไรก็ตาม บิต CPUID อาจหายไป นี่เป็นวิธีแก้ปัญหาสำหรับข้อบกพร่องใน Windows NT [ 78 ] - 1 2คำ
RDTSCและRDPMCไม่ได้เรียงลำดับตามคำสั่งอื่น และอาจสุ่มตัวอย่างตัวนับที่เกี่ยวข้องก่อนที่คำสั่งก่อนหน้าจะถูกดำเนินการหรือหลังจากที่คำสั่งถัดไปถูกดำเนินการ การเรียกใช้RDPMC(แต่ไม่ใช่RDTSC) อาจถูกจัดลำดับใหม่สัมพันธ์กันแม้กระทั่งสำหรับการอ่านตัวนับเดียวกันเพื่อกำหนดลำดับตามคำสั่งอื่นจำเป็นต้องLFENCEคำสั่งเรียงลำดับ (เช่น ) [ 79 ]CPUID - ↑บนโปรเซสเซอร์ x86 ทั้งหมดที่รองรับทั้ง
RDTSCและ TSCนั้น TSC จะพร้อมใช้งานในรูปแบบ MSR10hซึ่งสามารถอ่านและเขียนได้โดยใช้คำสั่งRDMSR/WRMSRในโปรเซสเซอร์รุ่นแรกๆ (เช่นP5 Pentium , AMD K5 ) รวมถึงโปรเซสเซอร์ทั้งหมดที่รองรับx86-64นั้น MSR สามารถอ่านและเขียนได้เหมือนกับรีจิสเตอร์ 64 บิตเต็มรูปแบบ อย่างไรก็ตาม ในโปรเซสเซอร์ที่ไม่ใช่ x86-64 บางตัว (เช่น Intel Pentium Pro , VIA C3 , Transmeta Efficeon ) การพยายามเขียนค่าของ MSR นี้อาจล้มเหลวหรือค่าที่มากกว่านั้นจะทำให้ค่าที่เขียนถูกดำเนินการ AND กับค่าอื่น
0xFFFFFFFFซึ่งจะล้าง 32 บิตบนสุดในโปรเซสเซอร์รุ่นใหม่หลายตัว (เริ่มตั้งแต่ Intel Haswell / Silvermont , Zhaoxin ZX-C และ AMD Zen 5 ) จะมี
TSC_ADJUSTMSR (MSR ) ให้ใช้งาน (ระบุโดย ) ในโปรเซสเซอร์ที่มี MSR นี้ จะมี TSC ทั่วทั้งระบบ/"จริง" ซึ่งใช้ร่วมกันหรือซิงโครไนซ์ระหว่างคอร์ CPU ทั้งหมด — การอ่าน TSC ด้วยหรือ MSR จะส่งคืนค่า TSC "จริง" บวกกับค่าของ; การพยายามเขียนไปยัง MSR จะทำให้ CPU คำนวณความแตกต่างระหว่างค่าที่เขียนที่ให้มากับ TSC "จริง" และเขียนความแตกต่างนั้นไปยัง; การซิงโครไนซ์ TSC ข้ามคอร์โปรเซสเซอร์สามารถทำได้โดยการเขียนค่าเดียวกันไปยังบนโปรเซสเซอร์เชิงตรรกะแต่ละตัว[ 80 ]3BhCPUID.(EAX=7,ECX=0):EBX[1]RDTSC10hTSC_ADJUST10hTSC_ADJUSTTSC_ADJUST - ↑การนำระบบ TSC อัตราคงที่มาใช้เป็นสองขั้นตอน:
- TSC คงที่
- TSC ทำงานที่อัตราคงที่ตราบใดที่แกนประมวลผลไม่ได้อยู่ในโหมดหลับลึก ( C2หรือลึกกว่านั้น) แต่ไม่ได้ซิงโครไนซ์ระหว่างแกน CPU นำมาใช้ใน Intel Prescott , YonahและBonnellนอกจากนี้ยังมีอยู่ใน CPU TransmetaและVIA Nano [ 81 ] ทั้งหมด รวมถึง AMD Geode LX [ 82 ] ไม่มีบิต CPUID
- TSC แบบไม่เปลี่ยนแปลง (TSC ต่อเนื่อง)
- TSC ทำงานที่อัตราคงที่และเพิ่มขึ้นในลักษณะที่ซิงโครไนซ์กันระหว่างคอร์ CPU ทั้งหมดในสถานะ P, C และ T ทั้งหมด (แต่ไม่จำเป็นต้องเป็นสถานะ S) มีอยู่ในAMD K10และรุ่นต่อมา; Intel Nehalem / Saltwell [ 83 ]และรุ่นต่อมา; Zhaoxin WuDaoKou [ 84 ]และรุ่นต่อมา ระบุด้วยบิต CPUID (ใบ
8000_0007:EDX[8])
- ↑
RDTSCสามารถรันนอก Ring 0 ได้เฉพาะในกรณีที่CR4.TSD=0.บน Intel Pentium และ AMD K5/K6RDTSCไม่สามารถรันในโหมด Virtual-8086 ได้ [ 86 ] [ 87 ]โปรเซสเซอร์รุ่นหลังๆ (Pentium Pro, Athlon 64) ได้ลบข้อจำกัดนี้ออกไป - ↑
RDPMCสามารถรันนอก Ring 0 ได้ก็ต่อเมื่อCR4.PCE=1. - ↑ คำสั่ง นี้
RDPMCไม่มีอยู่ในโปรเซสเซอร์ VIA รุ่นก่อน Nano - ↑รหัสเงื่อนไขที่รองรับสำหรับคำสั่ง (opcodeโดยที่ x nibble ระบุเงื่อนไข) มีดังนี้:
CMOVcc0F 4x /rx ซีซี เงื่อนไข ( EFLAGS ) 0 โอ OF=1: "โอเวอร์โฟลว์" 1 เลขที่ OF=0: "ไม่เกิดการล้น" 2 ซี บี เอ็นเอ CF=1: "ทด", "ต่ำกว่า", "ไม่สูงกว่าหรือเท่ากับ" 3 เอ็นซี,เอ็นบี,เออี CF=0: "ไม่ทด" , "ไม่ต่ำกว่า" , "สูงกว่าหรือเท่ากับ" 4 ซี,อี ZF=1: "ศูนย์", "เท่ากับ" 5 นิวซีแลนด์, ตะวันออกเฉียงเหนือ ZF=0: "ไม่ใช่ศูนย์" , "ไม่เท่ากับ" 6 นา บีอี (CF=1 หรือ ZF=1): "ไม่สูงกว่า" , "ต่ำกว่าหรือเท่ากับ" 7 เอ,เอ็นบีอี (CF=0 และ ZF=0): "สูงกว่า", "ไม่ต่ำกว่าหรือเท่ากับ" 8 เอส SF=1: "เครื่องหมาย" 9 เอ็นเอส SF=0: "ไม่ต้องระบุเครื่องหมาย" เอ พี,พีอี PF=1: "พาริตี", "พาริตีคู่" บี NP,PO PF=0: "ไม่ใช่พาริตี" , "พาริตีคี่" ซี แอลเอ็นจีโอ SF≠OF: "น้อยกว่า", "ไม่มากกว่าหรือเท่ากับ" ดี NL,GE SF=OF: "ไม่น้อยกว่า" , "มากกว่าหรือเท่ากับ" อี เล,เอ็นจี (ZF=1 หรือ SF≠OF): "น้อยกว่าหรือเท่ากับ" , "ไม่มากกว่า" เอฟ เอ็นแอลอี,จี (ZF=0 และ SF=OF): "ไม่น้อยกว่าหรือเท่ากับ" , "มากกว่า" - ↑ในโหมด 64 บิต
CMOVccหากใช้ขนาดตัวถูกดำเนินการ 32 บิต จะล้าง 32 บิตบนสุดของรีจิสเตอร์ปลายทาง แม้ว่าเงื่อนไขจะเป็นเท็จก็ตามสำหรับCMOVccการใช้ตัวถูกดำเนินการจากหน่วยความจำ ซีพียูจะอ่านตัวถูกดำเนินการจากหน่วยความจำเสมอ ซึ่งอาจทำให้เกิดข้อผิดพลาดเกี่ยวกับหน่วยความจำและการเติมแคชไลน์ แม้ว่าเงื่อนไขสำหรับการย้ายข้อมูลจะไม่เป็นไปตามที่กำหนดก็ตาม (ส่วนขยาย Intel APXกำหนดชุดของตัวแปรที่เข้ารหัส EVEXCMOVccใหม่ ที่จะระงับข้อผิดพลาดเกี่ยวกับหน่วยความจำหากเงื่อนไขเป็นเท็จ) - ↑ในตัวแปร VIA C3 ก่อนเนหะมีย์ ("ซามูเอล"/"เอซรา")มีรายงานว่ามีคำแนะนำอยู่
reg,regแต่ไม่ได้reg,[mem]ระบุรูปแบบ [ 88 ]CMOVcc - ↑การเข้ารหัสไบต์ที่ Intel แนะนำสำหรับ NOP หลายไบต์ที่มีความยาว 2 ถึง 9 ไบต์ในโหมด 32/64 บิตคือ (ในรูปแบบเลขฐานสิบหก): [ 89 ]
ในกรณีที่มีความจำเป็นต้องใช้พื้นที่เติม NOP มากกว่า 9 ไบต์ แนะนำให้ใช้ NOP หลายตัวความยาว ลำดับไบต์ 2 66 903 0F 1F 004 0F 1F 40 005 0F 1F 44 00 006 66 0F 1F 44 00 007 0F 1F 80 00 00 00 008 0F 1F 84 00 00 00 00 009 66 0F 1F 84 00 00 00 00 00 - ↑แตกต่างจากคำสั่งอื่นๆ ที่เพิ่มเข้ามาใน Pentium Proคำสั่ง long NOP ไม่มีบิตคุณลักษณะ CPUID
ณ เดือนเมษายน พ.ศ. 2569 Intel SDM ระบุว่า NOP แบบยาวมีให้ใช้งานบน CPU ตระกูล 6 และ 15 [ 85 ] — ซึ่งใช้ได้กับ CPU ของ Intel แต่ CPU ตระกูล 6 บางรุ่นจากผู้ผลิตที่ไม่ใช่ Intel (เช่นCyrix 6x86 MX และVIA C3 ) ไม่รองรับ
เคอร์เนล Linux (เวอร์ชัน 2.6.27 และเวอร์ชันที่ใหม่กว่า) ถือว่า NOP ที่ยาวไม่สามารถใช้งานได้ในโหมด 32 บิต เนื่องจากขาดวิธีการตรวจจับที่เชื่อถือได้[ 90 ]
- ↑
0F 1F /0เนื่องจาก long-NOP ถูกนำมาใช้ใน Pentium Pro แต่ยังคงไม่มีเอกสารจนกระทั่งปี 2006 [ 92 ]0F 18..1Fช่วงรหัสคำสั่ง ทั้งหมดNOPใน Pentium Pro อย่างไรก็ตาม ยกเว้น0F 1F /0Intel ไม่รับประกันว่ารหัสคำสั่งเหล่านี้จะยังคงอยู่NOPในโปรเซสเซอร์ในอนาคต และได้กำหนดรหัสคำสั่งบางส่วนเหล่านี้ให้กับคำสั่งอื่นในโปรเซสเซอร์อย่างน้อยบางตัว [ 93 ] [ 94 ] - ↑มีเอกสารสำหรับ AMD x86-64 ตั้งแต่ปี 2002 [ 95 ]
- ↑แม้ว่า
0F 0Bรหัสปฏิบัติการจะถูกสงวนไว้อย่างเป็นทางการให้เป็นรหัสปฏิบัติการที่ไม่ถูกต้องตั้งแต่ Pentium เป็นต้นไป แต่รหัสปฏิบัติการนี้ได้รับการกำหนดชื่อย่อUD2ตั้งแต่ Pentium Proเป็นต้นไป เท่านั้น [ 97 ] - 1 2 GNU Binutilsใช้
UD2AและUD2Bสำหรับ0F 0Bและ0F B9ตั้งแต่เวอร์ชัน 2.7 [ 98 ]เดิมทีทั้งUD2Aและไม่UD2Bได้รองรับอาร์กิวเมนต์ใดๆ -UD2Bต่อมาได้รับการแก้ไขให้ยอมรับ ไบต์ ModR/Mใน Binutils เวอร์ชัน 2.30 [ 99 ] - ↑คำ
UD2(0F 0B) จะหยุดการถอดรหัสไบต์ถัดไปเป็นคำสั่งเพิ่มเติม แม้กระทั่งการคาดเดา ด้วยเหตุนี้ หากคำสั่งกระโดดแบบอ้อมตามด้วยสิ่งที่ไม่ใช่โค้ด ขอแนะนำให้วางUD2คำสั่งไว้หลังคำสั่งกระโดดแบบอ้อม [ 100 ] - 1 2โอเปรนด์ UD0/1/2 -
0F 0B,0F B9และ0F FF- จะทำให้เกิดข้อยกเว้น #UD บนโปรเซสเซอร์ x86 ทั้งหมดตั้งแต่ 80186เป็นต้นไป (ยกเว้น โปรเซสเซอร์ NEC V-series ) แต่ไม่ได้ถูกสงวนไว้สำหรับวัตถุประสงค์นี้โดยเฉพาะจนกระทั่งโปรเซสเซอร์ระดับ P5 - ↑แม้ว่า
0F B9รหัสคำสั่งจะถูกสงวนไว้อย่างเป็นทางการให้เป็นรหัสคำสั่งที่ไม่ถูกต้องตั้งแต่ Pentium เป็นต้นไป แต่ก็ได้รับการกำหนดชื่อย่อUD1ในภายหลัง – AMD APM เริ่มแสดงรายการUD1ในแผนที่รหัสคำสั่งตั้งแต่เวอร์ชัน 3.17 เป็นต้นไป [ 102 ]ในขณะที่ Intel SDM เริ่มแสดงรายการตั้งแต่เวอร์ชัน 061 เป็นต้นไป [ 103 ] - 1 2สำหรับทั้ง opcode
0F B9และ0F FFopcode การใช้งาน x86 ที่แตกต่างกันนั้นทราบกันดีว่ามีความแตกต่างกันในเรื่องที่ว่า opcode ยอมรับไบต์ ModR/M หรือไม่ [ 104 ] [ 105 ] [ 106 ] - ↑สำหรับ
0F FFโอเปอเรเตอร์โค้ดOIOCyrix เป็นผู้แนะนำตัวย่อ [ 107 ]ในขณะที่UD0AMD และ Intel แนะนำตัวย่อ (โดยไม่มีอาร์กิวเมนต์) ในเวลาเดียวกันกับUD1ตัวย่อสำหรับ0F B9[ 102 ] [ 103 ]ต่อมาเอกสารของ Intel (แต่ไม่ใช่ AMD) ได้แก้ไขคำอธิบายของเพื่อเพิ่ม ไบต์ ModR/Mและรับอาร์กิวเมนต์สองตัว[ 108 ]UD0 - 1 2 3 4คำ
SYSRET,SYSENTERและSYSEXITไม่สามารถใช้งานได้ในโหมด Realอย่างไรก็ตามSYSENTERสามารถใช้งานได้ในโหมด Virtual 8086ในโปรเซสเซอร์ AMD
SYSCALLคำสั่งนี้สามารถใช้งานได้ในโหมดการทำงานทั้งหมด รวมถึงโหมด Real Mode ด้วยหากเปิดใช้งาน FRED (Flexible Return and Event Delivery) จะไม่สามารถดูคำแนะนำ
SYSRETต่างๆ ได้SYSEXIT - ↑บน K6
SYSCALL/SYSRETมีให้ใช้งานในรุ่น 7 (250nm "Little Foot") และรุ่นต่อมา แต่ไม่มีในรุ่น 6 รุ่นก่อนหน้า [ 110 ] - ↑
SYSCALLและSYSRETถูกรวมเข้าเป็นส่วนหนึ่งของ x86-64 อย่างสมบูรณ์ – ส่งผลให้คำสั่งเหล่านี้สามารถใช้งานได้ในโหมด 64 บิตบนโปรเซสเซอร์ x86-64 ทั้งหมดจาก AMD, Intel, VIA และ Zhaoxinส่วนในโหมดอื่นนอกเหนือจาก 64 บิต คำสั่งเหล่านี้จะใช้งานได้เฉพาะบนโปรเซสเซอร์ AMD เท่านั้น - ↑ความหมายที่แท้จริงของ
SYSRETแตกต่างกันเล็กน้อยระหว่างโปรเซสเซอร์ AMD และ Intel: ที่อยู่ส่งคืนที่ไม่เป็นไปตามแบบแผนทำให้เกิดข้อยกเว้น #GP ใน Ring 3 บน CPU AMD แต่ใน Ring 0 บน CPU Intel ซึ่งเป็นที่ทราบกันดีว่าก่อให้เกิดปัญหาด้านความปลอดภัย [ 111 ] - 1 2สำหรับ
SYSRETและSYSEXITภายใต้ x86-64 จำเป็นต้องเพิ่มREX.Wคำนำหน้าสำหรับตัวแปรที่จะกลับไปใช้โค้ดโหมดผู้ใช้ 64 บิตการเข้ารหัสคำสั่งเหล่านี้โดยไม่มี
REX.Wคำนำหน้าจะใช้เพื่อกลับไปยังโค้ดโหมดผู้ใช้ 32 บิต (คำสั่งทั้งสองนี้ไม่สามารถใช้เพื่อกลับไปยังโค้ดโหมดผู้ใช้ 16 บิตได้ หากต้องการกลับไปยังโค้ด 16 บิตควรใช้IRET/IRETD/ แทน)IRETQสำหรับรูปแบบต่างๆ ของคำสั่ง
SYSRETและSYSEXITคำสั่งที่เข้ารหัสด้วยREX.Wคำนำหน้า แอสเซมเบลอร์บางตัว (เช่นFASM [ 112 ]และGNU Binutils ) รองรับตัวย่อSYSRETQและSYSEXITQอย่างไรก็ตาม ตัวย่อเหล่านี้ไม่ได้ใช้ในเอกสารของ Intel/AMD - ↑ธง
CPUIDที่บ่งชี้การสนับสนุนสำหรับSYSENTER/SYSEXITถูกตั้งค่าไว้ใน Pentium Pro แม้ว่าโปรเซสเซอร์จะไม่รองรับคำสั่งเหล่านี้อย่างเป็นทางการก็ตาม [ 113 ]การทดสอบจากบุคคลที่สามระบุว่ารหัสคำสั่งมีอยู่ใน Pentium Pro แต่มีข้อบกพร่องมากเกินไปจนใช้งานไม่ได้ [ 114 ] - ↑บนซีพียู AMD
SYSENTERและSYSEXITจะไม่สามารถใช้งานได้ในโหมด x86-64 แบบยาว (#UD) - ↑บนซีพียู Transmeta
SYSENTERและSYSEXITจะใช้งานได้เฉพาะกับซอฟต์แวร์ Transmeta Code Morphing เวอร์ชัน 4.2 หรือสูงกว่าเท่านั้น [ 116 ] - ↑ในเนเฮมิยาห์
SYSENTERและSYSEXITมีให้ใช้เฉพาะในขั้นตอนที่ 8 และหลังจากนั้น [ 117 ]
เพิ่มเป็นส่วนขยายชุดคำสั่ง
เพิ่มด้วยx86-64
คำสั่งเหล่านี้สามารถเข้ารหัสได้เฉพาะในโหมด 64 บิตเท่านั้น โดยแบ่งออกเป็นสี่กลุ่ม:
- คำสั่งดั้งเดิมที่นำรหัสปฏิบัติการที่มีอยู่มาใช้ซ้ำเพื่อวัตถุประสงค์ที่แตกต่างกัน (
MOVSXDแทนที่ARPL) - คำสั่งเดิมพร้อมรหัสคำสั่งใหม่ (
SWAPGS) - คำสั่งที่มีอยู่ได้รับการขยายให้มีขนาดแอดเดรส 64 บิต (
JRCXZ) - คำสั่งที่มีอยู่ได้รับการขยายให้มีขนาดตัวดำเนินการ 64 บิต (คำสั่งที่เหลือ)
คำสั่งส่วนใหญ่ที่มีขนาดตัวถูกดำเนินการ 64 บิตจะเข้ารหัสโดยใช้REX.Wคำนำหน้า หากไม่มีREX.Wคำนำหน้า คำสั่งที่สอดคล้องกันซึ่งมีขนาดตัวถูกดำเนินการ 32 บิตจะถูกเข้ารหัส กลไกนี้ยังใช้กับคำสั่งอื่นๆ ส่วนใหญ่ที่มีขนาดตัวถูกดำเนินการ 32 บิตด้วย คำสั่งเหล่านั้นไม่ได้ระบุไว้ในที่นี้ เนื่องจากคำสั่งเหล่านั้นไม่มีตัวย่อใหม่ในไวยากรณ์ของ Intel เมื่อใช้กับขนาดตัวถูกดำเนินการ 64 บิต
| คำแนะนำ | การเข้ารหัส | ความหมาย | แหวน |
|---|---|---|---|
CDQE | REX.W 98 | ขยายสัญญาณ EAX ไปยัง RAX | 3 |
CQO | REX.W 99 | ป้ายขยาย RAX เป็น RDX:RAX | |
CMPSQ | REX.W A7 | เปรียบเทียบสตริงควอดเวิร์ด | |
CMPXCHG16B m128[ก] [ข] | REX.W 0F C7 /1 | เปรียบเทียบและแลกเปลี่ยน 16 ไบต์ ใช้งานแบบอะตอมิกได้เฉพาะเมื่อใช้ร่วมกับคำนำหน้า LOCK เท่านั้น | |
IRETQ | REX.W CF | 64 บิต คืนค่าจากการขัดจังหวะ | |
JRCXZ rel8 | E3 cb | กระโดดหาก RCX เป็นศูนย์ | |
LODSQ | REX.W AD | โหลดสตริงควอดเวิร์ด | |
MOVSXD r64,r/m32 | REX.W 63 /r[ค] | การแปลงคำสั่ง MOV พร้อมขยายเครื่องหมายจาก 32 บิตเป็น 64 บิต | |
MOVSQ | REX.W A5 | ย้ายสตริงควอดเวิร์ด | |
POPFQ | 9D | ทะเบียน POP RFLAGS | |
PUSHFQ | 9C | ลงทะเบียน PUSH RFLAGS | |
SCASQ | REX.W AF | สตริง SCAn ควอดเวิร์ด | |
STOSQ | REX.W AB | STOre String Quadword | |
SWAPGS | 0F 01 F8 | แลกเปลี่ยนฐาน GS กับ KernelGSBase MSR | 0 |
UDB | D6 | คำสั่งที่ไม่นิยาม — จะทำให้เกิด ข้อยกเว้น รหัสคำสั่งไม่ถูกต้อง (#UD) ในโหมด 64 บิต[ d ] | (3) |
- ↑ตัวดำเนินการหน่วยความจำ
CMPXCHG16Bต้องจัดเรียงให้ตรงกับ 16 ไบต์ - ↑ คำสั่ง นี้
CMPXCHG16Bไม่มีอยู่ในโปรเซสเซอร์ Intel/AMD x86-64 รุ่นแรกๆ บางรุ่น ในโปรเซสเซอร์ Intel คำสั่งนี้ไม่มีอยู่ใน Xeon "Nocona"รุ่น D [ 118 ]แต่ถูกเพิ่มเข้ามาในรุ่น E [ 119 ]ใน โปรเซสเซอร์ตระกูล AMD K8คำสั่งนี้ถูกเพิ่มเข้ามาในรุ่น F พร้อมกับการเปิดตัวการสนับสนุน DDR2 [ 120 ]ด้วยเหตุนี้ จึงCMPXCHG16Bมีแฟล็ก CPUID ของตัวเองแยกต่างหากจากส่วนที่เหลือของ x86-64 - ↑การเข้ารหัสที่
MOVSXDไม่มีคำนำหน้า REX.W ได้รับอนุญาตแต่ไม่แนะนำ [ 121 ] – การเข้ารหัสดังกล่าวทำงานเหมือนกับ 16/32 บิตMOV(8B /r) - ↑รหัส
UDBคำสั่ง -D6- จะทำให้เกิดข้อยกเว้น #UD (คำสั่งไม่ถูกต้อง) ในโหมด 64 บิตบนโปรเซสเซอร์ x86-64 ที่รู้จักทั้งหมด แต่ได้รับการสงวนไว้เพื่อจุดประสงค์นี้โดยเฉพาะและกำหนดUDBตัวย่อในปี 2025 [ 122 ]รหัสD6คำสั่งจะทำให้เกิด #UD ในโหมด 64 บิตเท่านั้น - ในโหมด 16 บิตและ 32 บิต (แบบดั้งเดิมและแบบเข้ากันได้) บนโปรเซสเซอร์ x86 ส่วนใหญ่ จะดำเนินการเป็นSALCคำสั่ง
ส่วนขยายการจัดการบิต
คำสั่งการจัดการบิต สำหรับคำสั่ง ที่เข้ารหัส VEXทั้งหมดที่กำหนดโดย BMI1 และ BMI2 ขนาดของตัวถูกดำเนินการอาจเป็น 32 หรือ 64 บิต ซึ่งควบคุมโดยบิต VEX.W – ไม่มีคำสั่งใดในเวอร์ชัน 16 บิต คำสั่งที่เข้ารหัส VEX ไม่สามารถใช้งานได้ในโหมด Real Mode และ Virtual-8086 Mode – นอกเหนือจากนั้น คำสั่งการจัดการบิตสามารถใช้งานได้ในทุกโหมดการทำงานบนซีพียูที่รองรับ
| ส่วนขยายการจัดการบิต | ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ | คำอธิบายคำแนะนำ | เพิ่มใน |
|---|---|---|---|---|
POPCNT r16,r/m16POPCNT r32,r/m32 | F3 0F B8 /r | จำนวนประชากรนับจำนวนบิตที่มีค่าเป็น 1 ในอาร์กิวเมนต์ต้นทาง | K10 , บ็อบแคท , ฮาสเวลล์ , จางเจียง , เกรซมอนต์ | |
POPCNT r64,r/m64 | F3 REX.W 0F B8 /r | |||
LZCNT r16,r/m16LZCNT r32,r/m32 | F3 0F BD /r | นับเลขศูนย์นำหน้า[ b ]ถ้าตัวถูกดำเนินการต้นทางเป็นศูนย์ทั้งหมดLZCNTจะส่งคืนขนาดตัวถูกดำเนินการเป็นบิต (16/32/64) และตั้งค่า CF=1 | ||
LZCNT r64,r/m64 | F3 REX.W 0F BD /r | |||
| TZCNT r16,r/m16TZCNT r32,r/m32 | F3 0F BC /r | นับจำนวนศูนย์ต่อท้าย[ c ]หากตัวถูกดำเนินการต้นทางเป็นศูนย์ทั้งหมด ระบบTZCNTจะส่งคืนขนาดตัวถูกดำเนินการเป็นบิต (16/32/64) และตั้งค่า CF=1 | แฮสเวลล์ , ไพล์ไดรเวอร์ , จา กัวร์, จางเจียง,เกรซมอนต์ |
TZCNT r64,r/m64 | F3 REX.W 0F BC /r | |||
ANDN ra,rb,r/m | VEX.LZ.0F38 F2 /r | การดำเนินการ AND-NOT แบบบิตไวส์:ra = r/m AND NOT(rb) | ||
BEXTR ra,r/m,rb | VEX.LZ.0F38 F7 /r | การดึงบิตฟิลด์ ตำแหน่งเริ่มต้นของบิตฟิลด์ระบุเป็นบิต [7:0] ของrbความยาวเป็นบิต [15:8] ของ จากนั้นrbบิตฟิลด์จะถูกดึงออกมาจากr/mค่าที่มีส่วนขยายศูนย์ แล้วเก็บไว้ในraเทียบเท่ากับ[ d ]mask = (1 << rb[15:8]) - 1 ra = (r/m >> rb[7:0]) และ mask | ||
BLSI reg,r/m | VEX.LZ.0F38 F3 /3 | ดึงค่าบิตต่ำสุดในอาร์กิวเมนต์ต้นทาง ส่งคืนค่า 0 หากอาร์กิวเมนต์ต้นทางเป็น 0 เทียบเท่ากับdst = (-src) AND src | ||
BLSMSK reg,r/m | VEX.LZ.0F38 F3 /2 | สร้างบิตมาสก์ที่มีค่าเป็น 1 ทั้งหมด ตั้งแต่บิตแรกจนถึงตำแหน่งบิตต่ำสุดที่มีค่าเป็น 1 ในอาร์กิวเมนต์ต้นทาง ส่งคืนค่า 1 ทั้งหมดหากอาร์กิวเมนต์ต้นทางเป็น 0 เทียบเท่ากับdst = (src-1) XOR src | ||
BLSR reg,r/m | VEX.LZ.0F38 F3 /1 | คัดลอกบิตทั้งหมดของอาร์กิวเมนต์ต้นทาง จากนั้นล้างบิตที่ตั้งค่าไว้ต่ำสุด เทียบเท่ากับdst = (src-1) AND src | ||
| BZHI ra,r/m,rb | VEX.LZ.0F38 F5 /r | ตั้งค่าบิตลำดับสูงเป็นศูนย์ โดยr/mเริ่มจากตำแหน่งบิตที่ระบุในrbจากนั้นเขียนผลลัพธ์ลงในrdเทียบเท่ากับra = r/m AND NOT(-1 << rb[7:0]) | Haswell , Excavator , [ e ] ZhangJiang , Gracemont |
MULX ra,rb,r/m | VEX.LZ.F2.0F38 F6 /r | การขยายการคูณจำนวนเต็มที่ไม่มีเครื่องหมายโดยไม่ต้องตั้งค่าแฟล็ก คูณ EDX/RDX ด้วยr/mจากนั้นเก็บครึ่งล่างของผลลัพธ์การคูณไว้ในraและครึ่งบนไว้ในrbหากraและrbระบุรีจิสเตอร์เดียวกัน จะเก็บเฉพาะครึ่งบนของผลลัพธ์เท่านั้น | ||
PDEP ra,rb,r/m | VEX.LZ.F2.0F38 F5 /r | การฝากบิตแบบขนาน กระจายบิตที่ต่อเนื่องจากไปrbยังตำแหน่งบิตที่ตั้งไว้ในr/mจากนั้นจัดเก็บผลลัพธ์ลงในraการดำเนินการที่ทำคือ:ra=0; k=0; mask=r/m สำหรับ i=0 ถึง opsize-1 ทำ ถ้า (mask[i] == 1) แล้ว ra[i]=rb[k]; k=k+1 | ||
PEXT ra,rb,r/m | VEX.LZ.F3.0F38 F5 /r | การดึงบิตแบบขนาน (Parallel Bit Extract) ใช้r/mพารามิเตอร์เป็นบิตมาสก์เพื่อเลือกบิตในrbจากนั้นบีบอัดบิตที่เลือกเหล่านั้นลงในเวกเตอร์บิตที่ต่อเนื่องกัน การดำเนินการที่ทำคือ:ra=0; k=0; mask=r/m สำหรับ i=0 ถึง opsize-1 ทำ ถ้า (mask[i] == 1) แล้ว ra[k]=rb[i]; k=k+1 | ||
RORX reg,r/m,imm8 | VEX.LZ.F2.0F3A F0 /r ib | หมุนไปทางขวาทันทีโดยไม่กระทบกับธง | ||
SARX ra,r/m,rb | VEX.LZ.F3.0F38 F7 /r | การเลื่อนบิตเลขคณิตไปทางขวาโดยไม่ปรับปรุงแฟล็กสำหรับSARX, SHRXและSHLX, จำนวนการเลื่อนที่ระบุในrbจะถูกมาสก์ไว้ที่ 5 บิตสำหรับขนาดตัวถูกดำเนินการ 32 บิต และ 6 บิตสำหรับขนาดตัวถูกดำเนินการ 64 บิต | ||
SHRX ra,r/m,rb | VEX.LZ.F2.0F38 F7 /r | เลื่อนไปทางขวาแบบตรรกะโดยไม่ปรับปรุงค่าสถานะ | ||
SHLX ra,r/m,rb | VEX.LZ.66.0F38 F7 /r | เลื่อนไปทางซ้ายโดยไม่เปลี่ยนแปลงสถานะ | ||
- ↑บนซีพียู AMD ส่วนขยาย "ABM" ให้ทั้ง
POPCNTและLZCNTในขณะที่ซีพียู Intel บิต CPUID สำหรับ "ABM" นั้นระบุไว้เพียงเพื่อบ่งชี้การมีอยู่ของLZCNTคำสั่ง และแสดงเป็น "LZCNT" ในขณะที่POPCNTมีบิตคุณลักษณะ CPUID แยกต่างหากอย่างไรก็ตาม โปรเซสเซอร์ที่รู้จักทั้งหมดที่ใช้งานส่วนขยาย "ABM"/"LZCNT" ก็ใช้งานPOPCNTและตั้งค่าบิตคุณลักษณะ CPUID สำหรับ POPCNT ด้วย ดังนั้นความแตกต่างจึงเป็นเพียงทฤษฎีเท่านั้น(ในทางกลับกันนั้นไม่เป็นความจริง – มีโปรเซสเซอร์ที่รองรับPOPCNTแต่ไม่รองรับ ABM เช่น Intel Nehalemและ VIA Nano 3000) - ↑ คำสั่ง นี้
LZCNTจะทำงานBSRบนระบบที่ไม่รองรับส่วนขยาย LZCNT หรือ ABM โดยBSRจะคำนวณดัชนีของบิตที่ตั้งค่าสูงสุดในตัวถูกดำเนินการต้นทาง ซึ่งจะให้ผลลัพธ์ที่แตกต่างจากLZCNTสำหรับค่าอินพุตส่วนใหญ่ - ↑ คำสั่ง นี้
TZCNTจะทำงานBSFบนระบบที่ไม่รองรับส่วนขยาย BMI1 โดยBSFจะให้ผลลัพธ์เหมือนกันTZCNTสำหรับค่าตัวถูกดำเนินการทั้งหมด ยกเว้นศูนย์ ซึ่งTZCNTจะคืนค่าขนาดของตัวถูกดำเนินการ แต่BSFจะทำให้เกิดพฤติกรรมที่ไม่แน่นอน (โดยที่ปลายทางจะไม่เปลี่ยนแปลงบนซีพียูรุ่นใหม่ส่วนใหญ่) - ↑สำหรับ
BEXTRตำแหน่งเริ่มต้นและความยาวจะไม่ถูกปิดบัง และสามารถรับค่าได้ตั้งแต่ 0 ถึง 255 หากบิตที่เลือกขยายเกินกว่าส่วนท้ายของr/mอาร์กิวเมนต์ (ซึ่งมีขนาดตัวดำเนินการ 32/64 บิตตามปกติ) บิตที่อยู่นอกขอบเขตจะถูกอ่านออกมาเป็น 0 - ↑บนโปรเซสเซอร์ AMD ก่อน Zen 3
PEXTและPDEPค่อนข้างช้า [ 123 ]และแสดงให้เห็นถึงจังหวะเวลาที่ขึ้นอยู่กับข้อมูลเนื่องจากการใช้การใช้งานไมโครโค้ด (ประมาณ 18 ถึง 300 รอบ ขึ้นอยู่กับจำนวนบิตที่ตั้งค่าในอาร์กิวเมนต์มาสก์) ส่งผลให้การใช้ลำดับคำสั่งอื่นบนโปรเซสเซอร์เหล่านี้มักจะเร็วกว่า [ 124 ] [ 125 ]
เพิ่มด้วย Intel TSX
| ชุดย่อย TSX | คำแนะนำ | รหัสปฏิบัติการ | คำอธิบาย | เพิ่มใน |
|---|---|---|---|---|
| XBEGIN rel16XBEGIN rel32 | C7 F8 cwC7 F8 cd | เริ่มการทำธุรกรรม หากการทำธุรกรรมล้มเหลว ให้ทำการกระโดดไปยังออฟเซ็ตสัมพัทธ์ที่กำหนด | Haswell (เลิกใช้แล้วในซีพียูเดสก์ท็อป/แล็ปท็อปตั้งแต่รุ่นที่ 10 ขึ้นไป ( Ice Lake , Comet Lake ) แต่ยังคงมีจำหน่ายใน ชิ้นส่วนเซิร์ฟเวอร์แบรนด์ Xeon (เช่นIce Lake-SP , Sapphire Rapids )) |
XABORT imm8 | C6 F8 ib | ยกเลิกธุรกรรมโดยใช้ค่าคงที่ 8 บิตเป็นรหัสข้อผิดพลาด | ||
XEND | NP 0F 01 D5 | สิ้นสุดการทำธุรกรรม | ||
XTEST | NP 0F 01 D6 | ตรวจสอบว่าอยู่ในระหว่างการดำเนินการแบบธุรกรรมหรือไม่ ตั้งค่าEFLAGS.ZFเป็น 0 หากดำเนินการภายในธุรกรรม (RTM หรือ HLE) และตั้งค่าเป็น 1 ในกรณีอื่น ๆ | ||
| XACQUIRE | F2 | คำนำหน้าคำสั่งเพื่อระบุจุดเริ่มต้นของการละเว้นการล็อกฮาร์ดแวร์ ใช้เฉพาะกับคำสั่งอะตอมิกหน่วยความจำเท่านั้น (สำหรับคำสั่งอื่นๆF2คำนำหน้าอาจมีความหมายอื่น) เมื่อใช้กับคำสั่งดังกล่าว อาจเริ่มต้นธุรกรรมแทนที่จะดำเนินการอะตอมิกหน่วยความจำ | Haswell (เลิกผลิตแล้ว – โปรเซสเซอร์รุ่นสุดท้ายที่รองรับ HLE คือCoffee LakeและCascade Lake ) |
XRELEASE | F3 | คำนำหน้าคำสั่งเพื่อระบุจุดสิ้นสุดของการละเว้นการล็อกฮาร์ดแวร์ ใช้เฉพาะกับคำสั่งอะตอมิก/จัดเก็บข้อมูลในหน่วยความจำเท่านั้น (สำหรับคำสั่งอื่นๆF3คำนำหน้าอาจมีความหมายอื่น) เมื่อใช้กับคำสั่งดังกล่าวในระหว่างการละเว้นการล็อกฮาร์ดแวร์ จะเป็นการยุติธุรกรรมที่เกี่ยวข้องแทนที่จะดำเนินการจัดเก็บ/อะตอมิก | ||
| XSUSLDTRK | F2 0F 01 E8 | ระงับการติดตามที่อยู่โหลด | แซฟไฟร์ แรพิดส์ |
XRESLDTRK | F2 0F 01 E9 | การติดตามประวัติการโหลดที่อยู่ | ||
เพิ่มด้วยIntel CET
เทคโนโลยี Intel CET (Control-Flow Enforcement Technology) เพิ่มคุณสมบัติที่แตกต่างกันสองประการเพื่อช่วยป้องกันการโจมตีทางด้านความปลอดภัย เช่นการเขียนโปรแกรมแบบ return-oriented programming ได้แก่ shadow stack (CET_SS) และindirect branch tracking (CET_IBT)
| ชุดย่อย CET | คำแนะนำ | รหัสปฏิบัติการ | คำอธิบาย | แหวน | เพิ่มใน |
|---|---|---|---|---|---|
| INCSSPD r32 | F3 0F AE /5 | เพิ่มค่าตัวชี้สแต็กเงา | 3 | ไทเกอร์เลค , เซน 3 |
INCSSPQ r64 | F3 REX.W 0F AE /5 | ||||
RDSSPD r32 | F3 0F 1E /1 | อ่านค่าตัวชี้สแต็กเงาลงในรีจิสเตอร์ (32 บิตล่าง) [ a ] | |||
RDSSPQ r64 | F3 REX.W 0F 1E /1 | อ่านค่าตัวชี้สแต็กเงาลงในรีจิสเตอร์ (64 บิตเต็ม) [ a ] | |||
SAVEPREVSSP | F3 0F 01 EA | บันทึกตัวชี้สแต็กเงาก่อนหน้า | |||
RSTORSSP m64 | F3 0F 01 /5 | กู้คืนตัวชี้สแต็กเงาที่บันทึกไว้ | |||
WRSSD m32,r32 | NP 0F 38 F6 /r | เขียนข้อมูล 4 ไบต์ลงในสแต็กเงา | |||
WRSSQ m64,r64 | NP REX.W 0F 38 F6 /r | เขียนข้อมูล 8 ไบต์ลงในสแต็กเงา | |||
WRUSSD m32,r32 | 66 0F 38 F5 /r | เขียนข้อมูล 4 ไบต์ลงในสแต็กเงาของผู้ใช้ | 0 | ||
WRUSSQ m64,r64 | 66 REX.W 0F 38 F5 /r | เขียนข้อมูล 8 ไบต์ลงในสแต็กเงาของผู้ใช้ | |||
SETSSBSY | F3 0F 01 E8 | ทำเครื่องหมายว่ากำลังยุ่งอยู่กับสแต็กเงา | |||
CLRSSBSY m64 | F3 0F AE /6 | ล้างสถานะการทำงานที่ไม่ว่างของสแต็กเงา | |||
| ENDBR32 | F3 0F 1E FB | ยุติสาขาทางอ้อมในโหมด 32 บิต[ b ] | 3 | ทะเลสาบไทเกอร์ |
ENDBR64 | F3 0F 1E FA | ยุติสาขาทางอ้อมในโหมด 64 บิต[ b ] | |||
NOTRACK | 3E[ค] | คำนำหน้าใช้กับคำสั่งทางอ้อมCALL/ JMPใกล้เคียง (opcode FF /2และFF /4) เพื่อระบุว่าเป้าหมายการกระโดดไม่จำเป็นต้องเริ่มต้นด้วยENDBR32/64คำสั่ง คำนำหน้านี้จะใช้ได้ก็ต่อเมื่อตั้งค่าแฟล็ก NO_TRACK_EN เท่านั้น | |||
- 1 2คำ
RDSSPDandRDSSPQทำหน้าที่เป็น NOP บนโปรเซสเซอร์ที่ปิดใช้งาน shadow stack หรือไม่รองรับ CET - 1 2
ENDBR32และENDBR64ทำหน้าที่เป็น NOP บนโปรเซสเซอร์ที่ไม่รองรับ CET_IBT หรือในกรณีที่ IBT ถูกปิดใช้งาน - ↑คำนำหน้านี้มีการเข้ารหัสเหมือนกับ DS: คำนำหน้าการแทนที่เซกเมนต์ – ณ เดือนเมษายน 2022 เอกสารของ Intel ดูเหมือนจะไม่ได้ระบุว่าคำนำหน้านี้ยังคงรักษาฟังก์ชันการแทนที่เซกเมนต์แบบเก่าไว้หรือไม่เมื่อใช้เป็นคำนำหน้าแบบไม่มีแทร็ก และไม่ได้ให้ตัวช่วยจำอย่างเป็นทางการสำหรับคำนำหน้านี้ [ 126 ] [ 127 ] (GNU binutils ใช้ "notrack" [ 128 ] )
เพิ่มด้วย XSAVE
ส่วนขยายชุดคำสั่ง XSAVE ถูกออกแบบมาเพื่อบันทึก/เรียกคืนสถานะเพิ่มเติมของ CPU (โดยทั่วไปเพื่อวัตถุประสงค์ในการสลับบริบท ) ในลักษณะที่สามารถขยายให้ครอบคลุมส่วนขยายชุดคำสั่งใหม่ได้โดยที่โค้ดการสลับบริบทของระบบปฏิบัติการไม่จำเป็นต้องเข้าใจรายละเอียดเฉพาะของส่วนขยายใหม่เหล่านั้น ทำได้โดยการกำหนดส่วนประกอบสถานะ หลาย ชุด แต่ละชุดมีขนาดและออฟเซ็ตภายในพื้นที่บันทึกที่กำหนด และแต่ละชุดสอดคล้องกับส่วนย่อยของสถานะที่จำเป็นสำหรับส่วนขยาย CPU หนึ่งหรืออีกส่วนขยายหนึ่ง ส่วนย่อย EAX=0DhCPUIDใช้เพื่อระบุข้อมูลเกี่ยวกับส่วนประกอบสถานะที่ CPU รองรับและขนาด/ออฟเซ็ตของส่วนประกอบเหล่านั้น เพื่อให้ระบบปฏิบัติการสามารถสำรองพื้นที่ที่เหมาะสมและตั้งค่าบิตเปิดใช้งานที่เกี่ยวข้องได้
| ส่วนขยาย XSAVE | ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ[ a ] | คำอธิบายคำแนะนำ | แหวน | เพิ่มใน |
|---|---|---|---|---|---|
| XSAVE memXSAVE64 mem | NP 0F AE /4NP REX.W 0F AE /4 | บันทึกส่วนประกอบสถานะที่ระบุโดยบิตแมปใน EDX:EAX ลงในหน่วยความจำ | 3 | เพนริน , [ b ]รถดันดิน , จากัวร์ , โกลด์มอนต์ , จางเจียง |
XRSTOR memXRSTOR64 mem | NP 0F AE /5NP REX.W 0F AE /5 | กู้คืนส่วนประกอบสถานะที่ระบุโดย EDX:EAX จากหน่วยความจำ | |||
XGETBV | NP 0F 01 D0 | รับค่าของรีจิสเตอร์ควบคุมเพิ่มเติมอ่านค่า XCR ที่ระบุโดย ECX ลงใน EDX:EAX [ c ] | |||
XSETBV | NP 0F 01 D1 | ตั้งค่ารีจิสเตอร์ควบคุมเพิ่มเติม[ d ]เขียนค่าใน EDX:EAX ไปยัง XCR ที่ระบุโดย ECX | 0 | ||
| XSAVEOPT memXSAVEOPT64 mem | NP 0F AE /6NP REX.W 0F AE /6 | บันทึกส่วนประกอบสถานะที่ระบุโดย EDX:EAX ลงในหน่วยความจำ แตกต่างจาก คำสั่งเดิมอาจงดเว้นการเขียนรายการสถานะของโปรเซสเซอร์ลงในหน่วยความจำเมื่อ CPU สามารถตรวจสอบได้ว่ารายการเหล่านั้นไม่ได้ถูกแก้ไขนับตั้งแต่การแก้ไขครั้งล่าสุดที่เกี่ยวข้องXSAVEXSAVEOPTXRSTOR | 3 | แซนดี้บริดจ์ , สตีมโรลเลอร์ ,พูม่า ,โกลด์มอนต์ ,จางเจียง |
| XSAVEC memXSAVEC64 mem | NP 0F C7 /4NP REX.W 0F C7 /4 | บันทึกส่วนประกอบสถานะขยายของโปรเซสเซอร์ที่ระบุโดย EDX:EAX ลงในหน่วยความจำด้วยการบีบอัดข้อมูล | 3 | สกายเลค , โกลด์มอนท์ , เซน 1 , ชิจิดาดาว[ e ] |
| XSAVES memXSAVES64 mem | NP 0F C7 /5NP REX.W 0F C7 /5 | บันทึกส่วนประกอบสถานะขยายของโปรเซสเซอร์ที่ระบุโดย EDX:EAX ลงในหน่วยความจำโดยใช้การบีบอัดและการเพิ่มประสิทธิภาพหากเป็นไปได้ | 0 | สกายเลค , โกลด์มอนท์ , เซน 1 , ชิจิดาดาว[ e ] |
XRSTORS memXRSTORS64 mem | NP 0F C7 /3NP REX.W 0F C7 /3 | กู้คืนส่วนประกอบสถานะที่ระบุโดย EDX:EAX จากหน่วยความจำ | |||
- ↑ภายใต้ Intel APX
XSAVE*และXRSTOR*ไม่สามารถเข้ารหัสด้วยคำนำหน้า REX2 ได้ - ↑ฟังก์ชัน XSAVE ถูกเพิ่มเข้ามาในเวอร์ชัน E0/R0 ของ Penryn และไม่มีในเวอร์ชันก่อนหน้านั้น
- ↑ในโปรเซสเซอร์บางตัว (เริ่มตั้งแต่ Skylake , Goldmont , Zen 1และ Shijidadao v2)
XGETBVอนุญาตให้ดำเนินการด้วย ECX=1 ได้ – ซึ่งจะไม่ส่งค่าคืนXCR1(เนื่องจากไม่มีรีจิสเตอร์ดังกล่าว) แต่จะส่งXCR0ค่าคืนด้วยการดำเนินการ AND แบบบิตกับค่าปัจจุบันของบิตแมปส่วนประกอบสถานะ "XINUSE" (บิตแมปของส่วนประกอบสถานะ XSAVE ที่ไม่ทราบว่าอยู่ในสถานะเริ่มต้น)การมีฟังก์ชันนี้XGETBVจะแสดงโดย CPUID .(EAX=0Dh,ECX=1):EAX[bit 2] - ↑ คำสั่ง นี้
XSETBVจะทำให้เกิดการเรียกใช้ #VMEXIT โดยอัตโนมัติ หากดำเนินการภายใต้ระบบเวอร์ชวลไลเซชัน Intel VT-x - 1 2 XSAVEC และ XSAVES ถูกเพิ่มในการแก้ไข v2 ของ Zhaoxin Shijidadao และไม่มีในการแก้ไข v1 [ 129 ]
เพิ่มส่วนขยายข้ามผู้จำหน่ายอื่นๆ
| ส่วนขยายชุดคำสั่ง | ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ | คำอธิบายคำแนะนำ | แหวน | เพิ่มใน |
|---|---|---|---|---|---|
PREFETCHNTA m8 | 0F 18 /0 | การดึงข้อมูลล่วงหน้าด้วยการเข้าถึงแบบไม่ขึ้นกับเวลา ดึงข้อมูลล่วงหน้าโดยสมมติว่าข้อมูลจะถูกใช้เพียงครั้งเดียว และพยายามลดการปนเปื้อนของแคชจากข้อมูลดังกล่าว วิธีการที่ใช้ในการลดการปนเปื้อนของแคชนั้นขึ้นอยู่กับการใช้งาน[ b ] | 3 | เพนเทียม III , ( K7 ), [ a ] ( Geode GX2 ), [ a ] เนเฮมิยาห์ , เอฟฟิเซียน | |
PREFETCHT0 m8 | 0F 18 /1 | ดึงข้อมูลล่วงหน้าไปยังทุกระดับของลำดับชั้นแคช[ b ] | |||
PREFETCHT1 m8 | 0F 18 /2 | ดึงข้อมูลล่วงหน้าไปยังทุกระดับของลำดับชั้นแคช ยกเว้นแคช L1 [ b ] | |||
PREFETCHT2 m8 | 0F 18 /3 | ดึงข้อมูลล่วงหน้าไปยังแคชทุกระดับ ยกเว้นแคช L1 และ L2 [ b ] | |||
SFENCE | NP 0F AE F8+x[ค] | รั้วร้านค้า[ d ] | |||
| LFENCE | NP 0F AE E8+x[ค] | การกำหนดลำดับการโหลดและการจัดส่ง[ e ] | 3 | เพนเทียม 4 , เพนเทียม เอ็ม , K8 , เอฟฟิเซียน , C7 เอสเธอร์ |
MFENCE | NP 0F AE F0+x[ค] | รั้วแห่งความทรงจำ[ f ] | |||
MOVNTI m32,r32MOVNTI m64,r64 | NP 0F C3 /rNP REX.W 0F C3 /r | หน่วยเก็บข้อมูลที่ไม่ขึ้นกับเวลา | |||
PAUSE | F3 90[ g ] | หยุดการทำงานของเธรด CPU ชั่วคราวเป็นระยะเวลาสั้นๆ[ h ]ออกแบบมาเพื่อใช้ใน spinlock [ i ] | |||
| CLFLUSH m8 | NP 0F AE /7 | ล้างแคชไลน์หนึ่งไปยังหน่วยความจำในระบบที่มีแคช หลาย ระดับและ/หรือโปรเซสเซอร์หลายตัว แต่ละตัวมีแคชของตนเอง แคชไลน์นั้นจะถูกล้างจากทุกแคชไลน์ | 3 | (SSE2), Geode LX |
| MONITOR[ l ]MONITOR EAX,ECX,EDX | NP 0F 01 C8 | เริ่มตรวจสอบตำแหน่งหน่วยความจำสำหรับการเขียนหน่วยความจำ ที่อยู่หน่วยความจำที่จะตรวจสอบจะระบุโดย DS:AX/EAX/RAX [ m ] ECX และ EDX สงวนไว้สำหรับแฟล็กส่วนขยายเพิ่มเติมและแฟล็กคำแนะนำตามลำดับ[ n ] | โดยปกติ 0 [ o ] | เพรสคอตต์ , โยนาห์ , บอนเนลล์ , เค10 , นาโน |
MWAIT[ l ]MWAIT EAX,ECX | NP 0F 01 C9 | รอการเขียนไปยังตำแหน่งหน่วยความจำที่ตรวจสอบซึ่งระบุไว้ก่อนหน้านี้ด้วยMONITOR. [ p ] ECX และ EAX ใช้เพื่อจัดเตรียมแฟล็กส่วนขยายเพิ่มเติม[ q ]และคำแนะนำ[ r ]ตามลำดับMWAITคำแนะนำมักใช้สำหรับการจัดการพลังงาน CPU | |||
| GETSEC | NP 0F 37[ s ] | ดำเนินการฟังก์ชัน SMX ฟังก์ชันปลายทางที่จะดำเนินการจะระบุไว้ใน EAX [ t ]ขึ้นอยู่กับฟังก์ชันปลายทาง คำสั่งอาจรับอาร์กิวเมนต์เพิ่มเติมใน RBX, ECX และ EDX | โดยปกติ 0 [ u ] | Conroe / Merom , WuDaoKou , [ 144 ] Tremont |
| RDTSCP | 0F 01 F9 | อ่านค่าตัวนับเวลาและรหัสแกนประมวลผล[ v ]ค่า TSC จะถูกเก็บไว้ใน EDX:EAX และรหัสแกนประมวลผลจะถูกเก็บไว้ใน ECX [ w ] | โดยปกติ 3 [ x ] | K8 , [ y ]เนเฮเลม , ซิลเวอร์มอนต์ , นาโน |
POPCNT r16,r/m16POPCNT r32,r/m32 | F3 0F B8 /r | นับจำนวนบิตที่มีค่าเป็น 1 ในอาร์กิวเมนต์ต้นทาง | 3 | K10 , เนฮาเล็ม , นาโน 3000 , เกรซมอนต์ | |
POPCNT r64,r/m64 | F3 REX.W 0F B8 /r | ||||
| CRC32 r32,r/m8 | F2 0F 38 F0 /r | คำนวณ ค่า CRCโดยใช้พหุนาม CRC-32C (Castagnoli) 0x11EDC6F41 (รูปแบบปกติ 0x1EDC6F41) ซึ่งเป็นพหุนามที่ใช้ใน iSCSI แตกต่างจากพหุนามที่นิยมใช้ใน Ethernet ตรงที่พาริตีของพหุนามนี้เป็นเลขคู่ จึงสามารถตรวจจับข้อผิดพลาดที่มีจำนวนบิตเปลี่ยนแปลงเป็นเลขคี่ได้ | 3 | เนฮาเล็ม , รถดันดิน , จากัวร์ , จางเจียง |
CRC32 r32,r/m16CRC32 r32,r/m32 | F2 0F 38 F1 /r | ||||
CRC32 r64,r/m64 | F2 REX.W 0F 38 F1 /r | ||||
| RDFSBASE r32RDFSBASE r64 | F3 0F AE /0F3 REX.W 0F AE /0 | อ่านที่อยู่ฐานของเซ็กเมนต์ FS: | 3 | ไอวี่บริดจ์ , สตีมโรลเลอร์ , โกลด์มอนต์ , จางเจียง |
RDGSBASE r32RDGSBASE r64 | F3 0F AE /1F3 REX.W 0F AE /1 | อ่านที่อยู่ฐานของเซ็กเมนต์ GS: | |||
WRFSBASE r32WRFSBASE r64 | F3 0F AE /2F3 REX.W 0F AE /2 | เขียนที่อยู่ฐานของเซ็กเมนต์ FS: | |||
WRGSBASE r32WRGSBASE r64 | F3 0F AE /3F3 REX.W 0F AE /3 | เขียนที่อยู่ฐานของเซ็กเมนต์ GS: | |||
| MOVBE r16,m16MOVBE r32,m32 | NFx 0F 38 F0 /r | โหลดข้อมูลจากหน่วยความจำไปยังรีจิสเตอร์โดยสลับลำดับไบต์ | 3 | บอนเนลล์ , แฮสเวลล์ , จากัวร์ , สตีมโรลเลอร์ , จางเจียง |
MOVBE r64,m64 | NP REX.W 0F 38 F0 /r[ aa ] | ||||
MOVBE m16,r16MOVBE m32,r32 | NFx 0F 38 F1 /r | บันทึกข้อมูลจากรีจิสเตอร์ลงหน่วยความจำโดยสลับลำดับไบต์ | |||
MOVBE m64,r64 | NP REX.W 0F 38 F1 /r[ aa ] | ||||
| INVPCID reg,m128 | 66 0F 38 82 /r | ยกเลิกรายการใน TLB และแคชโครงสร้างเพจจิ้งตามประเภทการยกเลิกในรีจิสเตอร์[ ab ]และตัวอธิบายใน m128 ตัวอธิบายประกอบด้วยที่อยู่หน่วยความจำและ PCID [ ac ] คำสั่งจะถูกเรียงลำดับบนซีพียู AMD แต่ไม่ใช่บนซีพียู Intel | 0 | แฮสเวลล์ , จางเจียง , เซน 3 , เกรซมอนต์ |
| PREFETCHW m8 | 0F 0D /1 | ดึงแคชไลน์ล่วงหน้าโดยมีเจตนาที่จะเขียน[ b ] | 3 | K6-2 , ( Cedar Mill ), [ ae ] Silvermont , Broadwell , ZhangJiang |
PREFETCH m8[ af ] | 0F 0D /0 | แคชไลน์พรีเฟตช์[ b ] | |||
| ADCX r32,r/m32ADCX r64,r/m64 | 66 0F 38 F6 /r66 REX.W 0F 38 F6 /r | การบวกแบบมีตัวทด (Add-with-carry) แตกต่างจากคำสั่งเดิม ตรงที่คำสั่งนี้จะ ไม่เปลี่ยนแปลงADCค่าแฟล็กอื่นๆEFLAGS.CF | 3 | บรอดเวลล์ , เซน 1 , จางเจียง , เกรซมอนต์ |
ADOX r32,r/m32ADOX r64,r/m64 | F3 0F 38 F6 /rF3 REX.W 0F 38 F6 /r | การบวกแบบมีตัวทด โดยใช้แฟล็ก overflow EFLAGS.OFเป็นตัวรับและส่งออกค่าตัวทด ส่วนแฟล็กอื่นๆ คงเดิม | |||
| CLAC | NP 0F 01 CA | ชัดเจนEFLAGS.AC. | 0 | Broadwell , Goldmont , Zen 1 , LuJiaZui [ ag ] |
STAC | NP 0F 01 CB | ชุดEFLAGS.AC. | |||
| CLFLUSHOPT m8 | NFx 66 0F AE /7 | ล้างแคชไลน์ คำ สั่ง นี้แตกต่างจากCLFLUSHคำสั่งเดิมตรงที่มีกฎการจัดลำดับที่ยืดหยุ่นกว่าในส่วนของการจัดเก็บข้อมูลในหน่วยความจำและการล้างแคชไลน์อื่นๆ ซึ่งช่วยให้ประสิทธิภาพดีขึ้น | 3 | สกายเลค , โกลด์มอนต์ , เซน 1 |
| PREFETCHWT1 m8 | 0F 0D /2 | ดึงข้อมูลล่วงหน้าด้วยคำแนะนำตำแหน่งที่ตั้ง T1 (ดึงข้อมูลลงในแคช L2 แต่ไม่ใช่แคช L1) และคำแนะนำความตั้งใจที่จะเขียน[ b ] | 3 | อัศวินแลนดิง , หยงเฟิง |
| RDPKRU | NP 0F 01 EE | อ่านค่า User Page Key ลงใน EAX | 3 | Skylake-X , Comet Lake , Gracemont , Zen 3 , LuJiaZui [ ag ] |
WRPKRU | NP 0F 01 EF | เขียนข้อมูลจาก EAX ลงใน User Page Key Register และทำการ Memory Fence | |||
| CLWB m8 | NFx 66 0F AE /6 | เขียนข้อมูลหนึ่งแคชไลน์กลับไปยังหน่วยความจำโดยไม่ทำให้แคชไลน์นั้นไม่ถูกต้อง | 3 | Skylake-X , Zen 2 , Tiger Lake , Tremont |
| RDPID r32 | F3 0F C7 /7 | อ่านรหัสแกนประมวลผลลงในรีจิสเตอร์[ v ] | 3 [ ah ] | Goldmont Plus , Zen 2 ,ทะเลสาบน้ำแข็ง , LuJiaZui [ ag ] |
| MOVDIRI m32,r32MOVDIRI m64,r64 | NP 0F 38 F9 /rNP REX.W 0F 38 F9 /r | บันทึกข้อมูลลงในหน่วยความจำโดยใช้ Direct Store (หน่วยความจำที่ไม่ใช้แคชหรือรวมการเขียนกับหน่วยความจำอื่น) | 3 | ไทเกอร์เลค , เทรมอนต์ , เซน 5 |
| MOVDIR64B reg,m512 | 66 0F 38 F8 /r | ย้ายข้อมูลขนาด 64 ไบต์จาก m512 ไปยังแอดเดรสที่กำหนดโดย ES:reg การเขียนข้อมูลขนาด 64 ไบต์นี้ทำแบบอะตอมิกด้วย Direct Store [ ai ] | 3 | ไทเกอร์เลค , เทรมอนต์ , เซน 5 |
| WBNOINVD | F3 0F 09 | เขียนแคชไลน์ที่สกปรกทั้งหมดกลับไปยังหน่วยความจำโดยไม่ต้องทำให้ไม่ถูกต้อง[ aj ]คำสั่งกำลังเรียงลำดับ | 0 | Zen 2 , Ice Lake-SP |
| PREFETCHIT0 m8 | 0F 18 /7 | ดึงโค้ดล่วงหน้าไปยังทุกระดับของลำดับชั้นแคช[ ak ] | 3 | เซน 5 , แกรนิต แรพิดส์ |
PREFETCHIT1 m8 | 0F 18 /6 | ดึงโค้ดล่วงหน้าไปยังทุกระดับของลำดับชั้นแคช ยกเว้นแคชระดับแรก[ ak ] | |||
- โปรเซสเซอร์ AMD Athlon 1 2 3 รุ่นก่อน Athlon XP ไม่รองรับ SSE เต็มรูปแบบ แต่ได้แนะนำคำสั่งที่ไม่ใช่ SIMD ของ SSE เป็นส่วนหนึ่งของ "MMX Extensions" [ 130 ] ส่วนขยายเหล่านี้ (โดยไม่มี SSE เต็มรูปแบบ) ยังมีอยู่ใน โปรเซสเซอร์ Geode GX2และ Geode รุ่นต่อมา
- 1 2 3 4 5 6 7 คำสั่ง ทั้งหมด
PREFETCH*เป็นคำสั่งแนะนำที่มีผลต่อประสิทธิภาพเท่านั้น ไม่มีผลต่อความหมายของโปรแกรม การระบุที่อยู่ที่ไม่ถูกต้อง (เช่น ที่อยู่ของเพจที่ไม่ได้แมป หรือที่อยู่ที่ไม่เป็นไปตามแบบแผน) จะทำให้คำสั่งนั้นทำงานเหมือนคำสั่ง NOP โดยไม่มีการสร้างข้อยกเว้นใดๆ - 1 2 3บนโปรเซสเซอร์ Intel [ 131 ]เช่นเดียวกับโปรเซสเซอร์ AMD64 [ 132 ]โปรเซสเซอร์จะไม่สนใจฟิลด์ r/m ของ ไบต์ ModR/Mสำหรับ
SFENCE,LFENCEและMFENCE— ค่า x ใดๆ ในช่วง 0..7 จะส่งผลให้เป็นคำสั่งที่ถูกต้อง (ไม่ทราบว่ากรณีนี้เกิดขึ้นกับโปรเซสเซอร์อื่นๆ ที่รองรับคำสั่งเหล่านี้หรือไม่ ดังนั้นจึงแนะนำให้เข้ารหัสด้วย x=0) - ↑ คำสั่ง นี้
SFENCEรับประกันว่าการจัดเก็บหน่วยความจำทั้งหมดหลังจากSFENCEคำสั่งนี้จะสามารถสังเกตได้ทั่วโลกหลังจากการจัดเก็บหน่วยความจำทั้งหมดก่อนหน้าSFENCEคำสั่งนี้ ซึ่งจะกำหนดลำดับในการจัดเก็บที่สามารถจัดลำดับใหม่ได้ เช่น การจัดเก็บที่ไม่ใช่ชั่วคราวและการจัดเก็บไปยังพื้นที่หน่วยความจำ WC (Write-Combining) [ 133 ]บนซีพียู Intel รวมถึงซีพียู AMD ตั้งแต่ Zen1 เป็นต้นไป (แต่ไม่ใช่ซีพียู AMD รุ่นเก่า)SFENCEยังทำหน้าที่เป็นตัวกั้นการจัดลำดับใหม่ในการล้างแคช/เขียนกลับที่ดำเนินการด้วยCLFLUSHคำCLFLUSHOPTและCLWB(ซีพียู AMD รุ่นเก่าจำเป็นต้องMFENCEจัดลำดับCLFLUSH)SFENCEไม่มีการจัดลำดับโดยสัมพันธ์กับLFENCEและSFENCE+LFENCEลำดับไม่เพียงพอที่จะป้องกันไม่ให้การโหลดถูกจัดลำดับใหม่เกินกว่าการจัดเก็บก่อนหน้า [ 134 ]เพื่อป้องกันการจัดลำดับใหม่ดังกล่าว จำเป็นต้องดำเนินการMFENCEหรือLOCKคำสั่งการจัดลำดับแบบอนุกรม - ↑ คำสั่ง นี้
LFENCEรับประกันว่าการโหลดหน่วยความจำทั้งหมดหลังจากLFENCEคำสั่งนี้จะสามารถสังเกตได้ทั่วโลกหลังจากโหลดหน่วยความจำทั้งหมดก่อนหน้านั้นLFENCEบนซีพียู Intel ทั้งหมดที่รองรับ SSE2LFENCEคำสั่งนี้ให้การรับประกันลำดับที่แข็งแกร่งกว่า: [ 135 ]มันเป็นการจัดลำดับแบบส่ง คำสั่ง ซึ่งหมายความว่าคำสั่งหลังจากLFENCEคำสั่งนี้จะได้รับอนุญาตให้เริ่มทำงานได้ก็ต่อเมื่อคำสั่งทั้งหมดก่อนหน้านั้นเสร็จสิ้นแล้ว (ซึ่งจะทำให้มั่นใจได้ว่าการโหลดก่อนหน้าทั้งหมด แต่ไม่จำเป็นต้องเป็นการจัดเก็บข้อมูล ได้เสร็จสมบูรณ์แล้ว) ผลของการจัดลำดับแบบส่งคำสั่งคือ คำสั่งนี้LFENCEยังทำหน้าที่เป็น ตัวกั้น การคาดการณ์และตัวกั้นการจัดลำดับใหม่สำหรับการเข้าถึงทรัพยากรที่ไม่ใช่หน่วยความจำ เช่น ตัวนับประสิทธิภาพ (เข้าถึงผ่าน เช่นRDTSCหรือRDPMC) และ x2apic MSRบนซีพียู AMDLFENCEคำสั่งนี้ไม่จำเป็นต้องจัดลำดับแบบส่งคำสั่งโดยค่าเริ่มต้น อย่างไรก็ตาม บนซีพียู AMD ทั้งหมดที่รองรับรูปแบบใดๆ ของการไม่จัดลำดับแบบส่งคำสั่ง คำสั่งLFENCEนี้สามารถทำให้จัดลำดับแบบส่งคำสั่งได้โดยการตั้งค่าบิตที่ 1 ของC001_1029MSR [ 136 ] - ↑ คำสั่ง นี้
MFENCEรับประกันว่าการโหลด การจัดเก็บ และการล้างแคชไลน์ของหน่วยความจำทั้งหมดหลังจากMFENCEคำสั่งนี้จะสามารถสังเกตได้ทั่วโลกหลังจากโหลด การจัดเก็บ และการล้างแคชไลน์ของหน่วยความจำทั้งหมดก่อนหน้านั้นMFENCEบนซีพียู IntelMFENCEนี้ไม่ได้ทำการเรียงลำดับแบบส่งคำสั่ง ดังนั้นจึงไม่สามารถใช้เพียงอย่างเดียวเพื่อบังคับลำดับการเข้าถึงทรัพยากรที่ไม่ใช่หน่วยความจำ เช่น ตัวนับประสิทธิภาพและ x2apic MSR ได้MFENCEคำสั่งนี้ยังคงเรียงลำดับตามLFENCEดังนั้นหากจำเป็นต้องบังคับลำดับระหว่างการจัดเก็บหน่วยความจำและการเข้าถึงที่ไม่ใช่หน่วยความจำที่ตามมา ลำดับดังกล่าวสามารถทำได้โดยการออกคำสั่งMFENCEตามด้วยคำสั่งLFENCE[ 79 ] [ 137 ] บนซีพียู AMDMFENCEได้ทำการเรียงลำดับแบบส่ง - ↑การทำงานของ
PAUSEคำสั่งในโหมด 64 บิตนั้นNOPไม่ได้รับผลกระทบจากการมีอยู่ของREX.Rคำนำหน้า ซึ่งแตกต่างจากคำสั่งอื่น ๆ ทั้งคำสั่งNOPจะไม่PAUSEได้รับผลกระทบจากบิตอื่น ๆ ของREXคำนำหน้า ตัวอย่างบางส่วนของการที่โอเปอเรเตอร์โค้ด90ทำงานร่วมกับคำนำหน้าต่าง ๆ ในโหมด 64 บิต มีดังนี้:90เป็นNOP41 90เป็นXCHG R8D,EAX4E 90เป็นNOP49 90เป็นXCHG R8,RAXF3 90เป็นPAUSEF3 41 90เป็นPAUSEF3 4F 90เป็นPAUSE
- ↑ระยะเวลาหยุดชั่วคราวที่
PAUSEคำสั่งนี้ดำเนินการนั้นขึ้นอยู่กับการใช้งานของระบบ ในระบบที่ไม่มี SSE2 คำสั่งนี้PAUSEจะดำเนินการเหมือนกับคำสั่ง NOP - ↑ภายใต้การจำลองเสมือน VT-x หรือ AMD-V การเรียกใช้งาน
PAUSEหลายครั้งในช่วงเวลาสั้นๆ อาจทำให้เกิด #VMEXIT จำนวนครั้งในPAUSEการเรียกใช้งานและความยาวของช่วงเวลาที่สามารถกระตุ้นให้เกิด #VMEXIT นั้นขึ้นอยู่กับแพลตฟอร์ม - ↑แม้ว่า
CLFLUSHคำสั่งนี้จะถูกนำมาใช้พร้อมกับ SSE2 แต่ก็มีแฟล็ก CPUID ของตัวเอง และอาจมีอยู่ในโปรเซสเซอร์ที่ไม่รองรับ SSE2 และ/หรืออาจไม่มีอยู่ในโปรเซสเซอร์ที่รองรับ SSE2 (เช่น AMD Geode LXรองรับCLFLUSHแต่ไม่รองรับ SSE2) - ↑แม้ว่า
MONITOR`MWAITจะถูกนำมาใช้พร้อมกับ SSE3 แต่ก็มีแฟล็ก CPUID ของตัวเองที่ต้องตรวจสอบแยกต่างหากจากแฟล็ก CPUID ของ SSE3 (เช่น Athlon 64 X2และ VIA C7รองรับ SSE3 แต่ไม่รองรับ MONITOR) - 1 2สำหรับ
MONITORandMWAITเอกสารเก่าของ Intel [ 138 ]แสดงรายการคำสั่งย่อพร้อมตัวถูกดำเนินการที่ระบุอย่างชัดเจน (MONITOR EAX,ECX,EDXandMWAIT EAX,ECX) ในขณะที่เอกสารใหม่จะละเว้นตัวถูกดำเนินการเหล่านี้ โปรแกรมประกอบ/โปรแกรมแยกส่วนอาจรองรับรูปแบบใดรูปแบบหนึ่งหรือทั้งสองรูปแบบนี้ [ 139 ] - ↑สำหรับ
MONITORDS: เซ็กเมนต์สามารถถูกแทนที่ได้ด้วยคำนำหน้าเซ็กเมนต์พื้นที่หน่วยความจำที่จะถูกตรวจสอบจะไม่ใช่แค่ไบต์เดียวที่ระบุโดย DS:rAX แต่จะเป็นพื้นที่หน่วยความจำเชิงเส้นที่ประกอบด้วยไบต์นั้น ขนาดและการจัดเรียงของพื้นที่หน่วยความจำนี้ขึ้นอยู่กับการใช้งาน และสามารถสอบถามได้ผ่าน CPUIDตำแหน่งหน่วยความจำที่จะตรวจสอบควรมีประเภทหน่วยความจำ WB (write-back cacheable) มิฉะนั้นการตรวจสอบอาจล้มเหลว - ↑ณ เดือนเมษายน 2567 ยังไม่มีการกำหนดส่วนขยายหรือคำแนะนำใดๆ สำหรับ
MONITORคำสั่งนี้ ดังนั้น คำสั่งนี้จึงต้องการ ECX=0 และไม่สนใจ EDX - ↑ในโปรเซสเซอร์บางตัว เช่น Intel Xeon Phi x200 [ 140 ]และ AMD K10 [ 141 ]และรุ่นต่อมา มี MSR ที่ได้รับการบันทึกไว้ซึ่งสามารถใช้เพื่อเปิดใช้งาน
MONITORและMWAITเรียกใช้ใน Ring 3 ได้ - ↑การรอที่ดำเนินการโดย
MWAITอาจสิ้นสุดลงด้วยเหตุการณ์ของระบบอื่นๆ นอกเหนือจากการเขียนหน่วยความจำ (เช่น การล้างแคชไลน์ การขัดจังหวะ) – ชุดเหตุการณ์ที่แน่นอนที่สามารถทำให้การรอสิ้นสุดลงนั้นขึ้นอยู่กับการใช้งานเฉพาะไม่ว่าการรอจะสิ้นสุดลงด้วยการเขียนหน่วยความจำหรือเหตุการณ์อื่นๆ การตรวจสอบจะสิ้นสุดลงแล้ว และจำเป็นต้องตั้งค่าการตรวจสอบใหม่อีกครั้งMONITORก่อนที่จะใช้MWAITเพื่อรอการเขียนหน่วยความจำอีกครั้ง - ↑ตัวเลือกการขยายที่มีให้ใช้งาน
MWAITในรีจิสเตอร์ ECX มีดังนี้:บิต ส่วนขยาย MWAIT 0 ถือว่าการขัดจังหวะเป็นเหตุการณ์หยุด แม้ว่าจะถูกปิดกั้นไว้ ( EFLAGS .IF=0) ก็ตาม (ใช้งานได้ในทุกการใช้งาน ที่ไม่ใช่ NetBurst MWAIT)1 MWAIT แบบกำหนดเวลา: สิ้นสุดการรอเมื่อTSCถึงหรือเกินค่าใน EDX:EBX (ไม่มีเอกสาร รายงานว่ามีอยู่ในโปรเซสเซอร์ Intel Skylakeและโปรเซสเซอร์ Intel รุ่นต่อมา) [ 142 ] 2 MWAIT ที่ไม่มีจอภาพ[ 143 ] 31:3 หากไม่ได้ใช้งาน ต้องตั้งค่าเป็นศูนย์ - ↑ตัวเลือกคำแนะนำที่มีให้ใช้งาน
MWAITในรีจิสเตอร์ EAX มีดังนี้:
สถานะ C คือสถานะพลังงานเฉพาะของโปรเซสเซอร์ ซึ่งไม่จำเป็นต้องตรงกับสถานะ C ของ ACPI แบบ 1:1 เสมอ ไปบิต คำใบ้ MWAIT 3:0 สถานะย่อยภายในสถานะ C (ดูบิต 7:4) (เฉพาะโปรเซสเซอร์ Intel) 7:4 สถานะ C ของพลังงาน CPUเป้าหมายระหว่างการรอ ลบ 1 (เช่น 0000b สำหรับ C1, 0001b สำหรับ C2, 1111b สำหรับ C0) 31:8 ไม่ได้ใช้งาน - ↑สำหรับ
GETSECคำสั่งนี้REX.Wคำนำหน้าจะเปิดใช้งานที่อยู่ 64 บิตสำหรับฟังก์ชัน EXITAC เท่านั้น - อนุญาตให้ใช้คำนำหน้า REX ได้ แต่จะถูกละเว้นสำหรับคำสั่งนี้ - ↑ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับ
GETSEC(เลือกโดย EAX) มีดังนี้:
ค่าใดๆ ที่ไม่รองรับใน EAX จะทำให้เกิดข้อผิดพลาด #UDอีเอเอ็กซ์ การทำงาน 0 (ความสามารถ) รายงานความสามารถของ SMX 2 (ทางเข้า) เข้าสู่การดำเนินการของโมดูลรหัสที่ตรวจสอบสิทธิ์แล้ว 3 (ทางออก) ออกจากการทำงานของโมดูลรหัสที่ตรวจสอบสิทธิ์แล้ว 4 (ศูนย์กลาง) เข้าสู่สภาพแวดล้อมที่วัดได้ 5 (SEXIT) ออกจากสภาพแวดล้อมที่วัดได้ 6 (พารามิเตอร์) รายงานพารามิเตอร์ SMX 7 (SMCTRL) การควบคุมโหมด SMX 8 (ตื่นนอน) ปลุกโปรเซสเซอร์ที่กำลังหลับอยู่ในสภาพแวดล้อมที่มีการวัดค่า - ↑สำหรับ
GETSECกรณีนี้ ฟังก์ชันระดับใบส่วนใหญ่จะถูกจำกัดไว้ที่ Ring 0 แต่ฟังก์ชันระดับใบ CAPABILITIES (EAX=0) และ PARAMETERS (EAX=6) นั้นมีอยู่ใน Ring 3 - 1 2ค่า "core ID" ที่อ่านได้นั้น
RDTSCPแล้วRDPIDคือTSC_AUXMSR (MSRC000_0103h) ส่วนค่านี้จะตรงกับรหัสโปรเซสเซอร์หรือไม่นั้น ขึ้นอยู่กับธรรมเนียมปฏิบัติของระบบปฏิบัติการ - ↑ แตกต่างจาก คำสั่งเดิมนี้จะหน่วงเวลาการอ่าน TSC จนกว่าคำสั่งก่อนหน้าทั้งหมดจะเสร็จสิ้น ซึ่งรับประกันลำดับที่สัมพันธ์กับการโหลดหน่วยความจำก่อนหน้า (แต่ไม่ใช่การจัดเก็บ)อย่างไรก็ตาม ลำดับจะไม่สัมพันธ์กับคำสั่งถัดไป
RDTSCRDTSCPRDTSCP - ↑
RDTSCPสามารถรันนอก Ring 0 ได้ก็ต่อเมื่อCR4.TSD=0. - ↑ฟังก์ชันนี้
RDTSCPถูกเพิ่มเข้ามาในรุ่น F ของ AMD K8 และไม่มีในรุ่นก่อนหน้า - ↑แม้ว่า
POPCNTคำสั่งนี้จะถูกนำมาใช้พร้อมกับ SSE4.2 แต่ก็ไม่ได้ถือว่าเป็นส่วนหนึ่งของ SSE4.2 แต่เป็นส่วนขยายแยกต่างหากที่มีแฟล็ก CPUID ของตัวเองบนโปรเซสเซอร์ AMD คำสั่งนี้ถือว่าเป็นส่วนหนึ่งของส่วนขยาย ABM แต่ก็ยังคงมีแฟล็ก CPUID ของตัวเองอยู่ - 1 2สำหรับ
MOVBEคำสั่ง การเข้ารหัสที่ใช้ทั้ง66hคำนำหน้าและREX.Wคำนำหน้าจะทำให้เกิด #UD บนโปรเซสเซอร์บางตัว (เช่น Haswell [ 145 ] ) และควรหลีกเลี่ยง - ↑ประเภทการทำให้เป็นโมฆะที่กำหนดไว้สำหรับ
INVPCID(เลือกโดยอาร์กิวเมนต์รีจิสเตอร์) มีดังนี้:
ค่าใดๆ ที่ไม่รองรับในอาร์กิวเมนต์ register จะทำให้เกิดข้อยกเว้น #GPค่า การทำงาน 0 ยกเลิกรายการ TLB ที่ตรงกับ PCID และที่อยู่หน่วยความจำเสมือนในตัวอธิบาย โดยไม่รวมรายการส่วนกลาง 1 ยกเลิกรายการ TLB ที่ตรงกับ PCID ในตัวอธิบาย โดยไม่รวมรายการส่วนกลาง 2 ยกเลิกรายการ TLB ทั้งหมด รวมถึงรายการส่วนกลางด้วย 3 ยกเลิกรายการ TLB ทั้งหมด ยกเว้นรายการส่วนกลาง - ↑ แตกต่างจาก คำสั่งเดิมจะทำให้เกิดข้อยกเว้น #GP หากที่อยู่หน่วยความจำที่ให้มาไม่ใช่ที่อยู่แบบมาตรฐาน ความไม่สอดคล้องกันนี้เป็นที่ทราบกันดีว่าก่อให้เกิดปัญหาด้านความปลอดภัย [ 146 ]
INVLPGINVPCID - ↑ คำสั่ง `
PREFETCHand` และ `or`PREFETCHWเป็นส่วนประกอบที่จำเป็นของ ส่วนขยายชุดคำสั่ง 3DNow!แต่ก็มีให้ใช้งานเป็นส่วนขยายแบบสแตนด์อโลนบนระบบที่ไม่รองรับ 3DNow! ด้วย - ↑รหัสคำสั่งสำหรับ
PREFETCHและPREFETCHW(0F 0D /r) จะทำงานเป็น NOP บนซีพียู Intel ตั้งแต่ Cedar Mill ( Pentium 4 ขนาด 65 นาโนเมตร ) เป็นต้นไป โดยจะPREFETCHWได้รับฟังก์ชันการดึงข้อมูลล่วงหน้าตั้งแต่ Broadwell เป็นต้นไป - ↑คำ
PREFETCH(0F 0D /0) เป็น คำสั่ง 3DNow!ซึ่งมีอยู่ในโปรเซสเซอร์ทั้งหมดที่มี 3DNow! แต่ไม่จำเป็นต้องมีในโปรเซสเซอร์ที่มีส่วนขยาย PREFETCHWบน CPU AMD ที่มี PREFETCHW ทั้ง opcode0F 0D /0และ opcode0F 0D /2../7ต่างได้รับการบันทึกไว้ว่าทำการ prefetchบนโปรเซสเซอร์ Intel ที่มี PREFETCHW opcode เหล่านี้ได้รับการบันทึกไว้ว่าทำการ reserved-NOPs [ 147 ] (ยกเว้นใน0F 0D /2Xeon Phiเท่านั้น) – การทดสอบจากบุคคลที่สาม [ 148 ]บ่งชี้ว่า opcode บางส่วนหรือทั้งหมดเหล่านี้อาจทำการ prefetch บน CPU Intel Core อย่างน้อยบางรุ่นPREFETCHWT1 m8 - 1 2 3ส่วนขยายชุดคำสั่ง SMAP, PKU และ RDPID ได้รับการสนับสนุนในขั้นตอนที่ 2 [ 149 ] และขั้นตอนที่ใหม่กว่าของ Zhaoxin LuJiaZui แต่ไม่ใช่ในขั้นตอนก่อนหน้า
- ↑แตกต่างจากคำสั่งเดิม
RDTSCPที่สามารถใช้อ่านรหัสโปรเซสเซอร์ได้ โหมดผู้ใช้RDPIDจะไม่ถูกปิดใช้งานโดยCR4.TSD=1. - ↑สำหรับ
MOVDIR64ES:reg ที่อยู่ปลายทางที่ระบุโดย ES:reg ต้องจัดเรียงให้ตรงกับ 64 ไบต์ขนาดของตัวดำเนินการสำหรับอาร์กิวเมนต์รีจิสเตอร์จะกำหนดโดยขนาดของที่อยู่ ซึ่งอาจถูกแทนที่ด้วย67hคำนำหน้า อาร์กิวเมนต์แหล่งข้อมูลหน่วยความจำขนาด 64 ไบต์ไม่จำเป็นต้องจัดเรียงให้ตรงกับ 64 ไบต์ และไม่รับประกันว่าจะถูกอ่านแบบอะตอมิก - ↑ คำสั่ง นี้
WBNOINVDจะทำงานเสมือนว่าWBINVDรันบนระบบที่ไม่รองรับส่วนขยาย WBNOINVD ซึ่งWBINVDแตกต่างจากWBNOINVDคำสั่งWBINVDที่ลบล้างแคชทั้งหมดหลังจากเขียนกลับ (writeback) - 1 2ในการใช้งานเบื้องต้น
PREFETCHIT0`and`PREFETCHIT1จะทำการดึงโค้ดล่วงหน้าเฉพาะเมื่อใช้โหมดการกำหนดแอดเดรสแบบ RIP-relative เท่านั้น และจะทำงานเป็นคำสั่ง NOP ในกรณีอื่นๆคำสั่ง `PREFETCHI` เป็นเพียงคำสั่งแนะนำเท่านั้น หากพยายามดึงแอดเดรสที่ไม่ถูกต้อง คำสั่งเหล่านี้จะทำงานเป็นคำสั่ง NOP โดยไม่มีการสร้างข้อยกเว้นใดๆ บนโปรเซสเซอร์ที่รองรับ Long-NOP แต่ไม่รองรับคำสั่ง `PREFETCHI` คำสั่งเหล่านี้จะทำงานเป็นคำสั่ง NOP เสมอ
เพิ่มส่วนขยายเฉพาะของ Intel อื่นๆ เข้าไปด้วย
| ส่วนขยายชุดคำสั่ง | ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ | คำอธิบายคำแนะนำ | แหวน | เพิ่มใน |
|---|---|---|---|---|---|
| HWNT, hint-not-taken, ( ,pn) [ a ] | 2E[ข] | คำนำหน้าคำสั่ง: คำแนะนำสาขาแบบอ่อนไม่ได้ถูกนำไปใช้ | 3 | เพนเทียม 4 , [ c ]ทะเลสาบเมเทอร์[ 154 ] |
HST, hint-taken, ( ,pt) [ a ] | 3E[ข] | คำนำหน้าคำสั่ง: มีการนำคำแนะนำการแยกสาขามาใช้อย่างชัดเจน | |||
| ENCLS | NP 0F 01 CF | ดำเนินการฟังก์ชัน SGX Supervisor ฟังก์ชันที่จะดำเนินการจะระบุไว้ใน EAX [ d ] — ขึ้นอยู่กับฟังก์ชัน คำสั่งอาจรับตัวดำเนินการอินพุตเพิ่มเติมใน RBX, RCX และ RDX ขึ้นอยู่กับฟังก์ชัน คำสั่งอาจส่งคืนข้อมูลในรูปแบบ RBX และ/หรือรหัสข้อผิดพลาดในรูปแบบ EAX | 0 |
|
ENCLU | NP 0F 01 D7 | ดำเนินการฟังก์ชันผู้ใช้ SGX ฟังก์ชันที่จะดำเนินการจะระบุไว้ใน EAX [ g ] — ขึ้นอยู่กับฟังก์ชัน คำสั่งอาจรับตัวถูกดำเนินการเพิ่มเติมใน RBX, RCX และ RDX คำสั่งดังกล่าวอาจส่งคืนข้อมูล/สถานะในรูปแบบ EAX และ/หรือ RCX ขึ้นอยู่กับฟังก์ชันการทำงาน | 3 [ h ] | ||
ENCLV | NP 0F 01 C0 | ดำเนินการฟังก์ชันการจำลองเสมือน SGX ฟังก์ชันที่จะดำเนินการจะระบุไว้ใน EAX [ i ] — ขึ้นอยู่กับฟังก์ชัน คำสั่งอาจรับตัวถูกดำเนินการเพิ่มเติมใน RBX, RCX และ RDX คำสั่งนี้จะส่งคืนข้อมูลสถานะใน EAX | 0 [ j ] | ||
| PTWRITE r/m32PTWRITE r/m64 | F3 0F AE /4F3 REX.W 0F AE /4 | อ่านข้อมูลจากรีจิสเตอร์หรือหน่วยความจำเพื่อเข้ารหัสลงในแพ็กเก็ต PTW [ k ] | 3 | คาบีเลค , โกลด์มอนต์พลัส |
| PCONFIG | NP 0F 01 C5 | ดำเนินการฟังก์ชันการกำหนดค่าคุณสมบัติแพลตฟอร์ม ฟังก์ชันที่จะดำเนินการนั้นระบุไว้ใน EAX [ l ] - ขึ้นอยู่กับฟังก์ชัน คำสั่งอาจรับตัวดำเนินการอินพุตเพิ่มเติมใน RBX, RCX และ RDX หากคำสั่งล้มเหลว ระบบจะตั้งค่า EFLAGS.ZF=1 และส่งคืนรหัสข้อผิดพลาดใน EAX หากสำเร็จ ระบบจะตั้งค่า EFLAGS.ZF=0 และ EAX=0 | 0 | ทะเลสาบน้ำแข็ง-SP |
| CLDEMOTE m8 | NP 0F 1C /0 | ย้ายแคชไลน์ที่มี m8 จากแคช L1 ของ CPU ไปยังระดับแคชที่ไกลออกไป[ m ] | 3 | ( เทรมอนต์ ), ( ทะเลสาบอัลเดอร์ ), แซฟไฟร์แรพิดส์[ n ] |
| UMONITOR r16/32/64 | F3 0F AE /6 | เริ่มตรวจสอบตำแหน่งหน่วยความจำสำหรับการเขียนข้อมูลลงหน่วยความจำ ที่อยู่หน่วยความจำที่จะตรวจสอบจะระบุโดยอาร์กิวเมนต์ register [ o ] | 3 | เทรมอนต์ , อัลเดอร์เลค |
UMWAIT r32UMWAIT r32,EDX,EAX | F2 0F AE /6 | การรอแบบมีกำหนดเวลาสำหรับการเขียนไปยังตำแหน่งหน่วยความจำที่ถูกตรวจสอบซึ่งระบุไว้ก่อนหน้านี้ด้วยUMONITOR. ในกรณีที่ไม่มีการเขียนหน่วยความจำ การรอจะสิ้นสุดลงเมื่อ TSC ถึงค่าที่ระบุโดย EDX:EAX หรือการรอได้ดำเนินไปตามระยะเวลาสูงสุดที่ระบบปฏิบัติการควบคุมไว้[ p ] | โดยปกติ 3 [ q ] | ||
TPAUSE r32TPAUSE r32,EDX,EAX | 66 0F AE /6 | รอจนกว่าตัวนับเวลาจะถึงค่าที่ระบุใน EDX:EAX [ p ] อาร์กิวเมนต์รีจิสเตอร์ของ คำสั่ง | |||
| SERIALIZE | NP 0F 01 E8 | เรียงลำดับการดึงคำสั่งและการดำเนินการ[ s ] | 3 | ทะเลสาบอัลเดอร์ |
| HRESET imm8 | F3 0F 3A F0 C0 ib | ร้องขอให้โปรเซสเซอร์รีเซ็ตส่วนประกอบที่เลือกของประวัติการคาดการณ์ที่เก็บรักษาโดยฮาร์ดแวร์ บิตแมปของส่วนประกอบในประวัติการคาดการณ์ของ CPU ที่จะรีเซ็ตนั้นแสดงอยู่ใน EAX (อาร์กิวเมนต์ imm8 จะถูกละเว้น) [ t ] | 0 | ทะเลสาบอัลเดอร์ |
| IBHF | F3 REX.W 0F 1E F8 | รั้วประวัติสาขาทางอ้อม[ 166 ] การดำเนินการนี้ | (0) [ u ] | ทะเลสาบอัลเดอร์[ v ] |
| SENDUIPI reg | F3 0F C7 /6 | ส่งข้อความขัดจังหวะผู้ใช้ระหว่างโปรเซสเซอร์[ w ] | 3 | แซฟไฟร์ แรพิดส์ |
UIRET | F3 0F 01 EC | การขัดจังหวะของผู้ใช้ (User Interrupt Return) | |||
TESTUI | F3 0F 01 ED | ทดสอบแฟล็กการขัดจังหวะผู้ใช้คัดลอก UIF ไปยังEFLAGS .CF | |||
CLUI | F3 0F 01 EE | ล้างสถานะการขัดจังหวะของผู้ใช้ | |||
STUI | F3 0F 01 EF | ตั้งค่าแฟล็กการขัดจังหวะผู้ใช้ | |||
| ENQCMD reg,m512 | F2 0F 38 F8 /r | คำสั่ง Enqueue อ่านโครงสร้าง "ข้อมูลคำสั่ง" ขนาด 64 ไบต์จากหน่วยความจำ (อาร์กิวเมนต์ m512) และเขียนแบบอะตอมิกไปยังอุปกรณ์ Enqueue Store ที่แมปกับหน่วยความจำ (อาร์กิวเมนต์ register ระบุที่อยู่หน่วยความจำของอุปกรณ์นี้ โดยใช้เซ็กเมนต์ ES และต้องการการจัดเรียง 64 ไบต์[ y ] ) ตั้งค่า ZF=0 เพื่อระบุว่าอุปกรณ์ยอมรับคำสั่ง หรือ ZF=1 เพื่อระบุว่าไม่ยอมรับคำสั่ง (เช่น คิวเต็มหรือตำแหน่งหน่วยความจำไม่ใช่อุปกรณ์ Enqueue Store) | 3 | แซฟไฟร์ แรพิดส์ |
ENQCMDS reg,m512 | F3 0F 38 F8 /r | ตัวควบคุมการจัดคิวคำสั่ง แตกต่างจากENQCMDตัวอื่นตรงที่สามารถใส่ PASID (ตัวระบุพื้นที่ที่อยู่ของกระบวนการ) และบิตสิทธิ์ลงใน "ข้อมูลคำสั่ง" ที่จะจัดคิวได้ | 0 | ||
| WRMSRNS | NP 0F 01 C6 | เขียนข้อมูลลงในรีจิสเตอร์เฉพาะรุ่น (Model-specific register หรือ MSR) โดย MSR ที่ต้องการเขียนจะระบุไว้ใน ECX และข้อมูลที่ต้องการเขียนจะระบุไว้ใน EDX:EAX คำสั่งนี้แตกต่างจาก | 0 | ป่าเซียร์รา |
| RDMSRLIST | F2 0F 01 C6 | อ่าน MSR หลายรายการ RSI ชี้ไปยังตารางดัชนี MSR สูงสุด 64 รายการที่จะอ่าน (แต่ละรายการมีขนาด 64 บิต) RDI ชี้ไปยังตารางรายการข้อมูลสูงสุด 64 รายการที่จะเขียนผลลัพธ์การอ่าน MSR ลงไป (แต่ละรายการมีขนาด 64 บิต) และ RCX จะให้บิตแมป 64 รายการเพื่อระบุว่ารายการใดในตารางที่จะทำการอ่าน MSR จริงๆ[ z ] | 0 | ป่าเซียร์รา |
WRMSRLIST | F3 0F 01 C6 | เขียน MSR หลายรายการ RSI ชี้ไปยังตารางดัชนี MSR สูงสุด 64 รายการที่จะเขียน (แต่ละรายการมีขนาด 64 บิต) RDI ชี้ไปยังตารางรายการข้อมูลสูงสุด 64 รายการที่จะเขียนลงใน MSR (แต่ละรายการมีขนาด 64 บิต) และ RCX จัดเตรียมบิตแมป 64 รายการเพื่อระบุว่ารายการใดในตารางที่จะทำการเขียน MSR จริงๆ[ z ] MSR จะถูกเขียนตามลำดับในตาราง คำสั่งนี้ไม่ได้ทำการเรียงลำดับตามลำดับ | |||
| CMPccXADD m32,r32,r32CMPccXADD m64,r64,r64 | VEX.128.66.0F38.W0 Ex /rVEX.128.66.0F38.W1 Ex /r[ aa ] [ ab ] | อ่านค่าจากหน่วยความจำ จากนั้นเปรียบเทียบกับค่าตัวถูกดำเนินการตัวแรกในรีจิสเตอร์ หากการเปรียบเทียบผ่าน ให้บวกค่าตัวถูกดำเนินการตัวที่สองในรีจิสเตอร์เข้ากับค่าในหน่วยความจำ คำสั่งนี้ทำงานแบบอะตอมิกโดยรวมการทำงานของ คำสั่งนี้ CMPccXADD [mem],reg1,reg2คือ:tmpmem := [mem] EFLAGS := CMP tmpmem, reg1 // ตั้งค่า EFLAGS เหมือนกับการเปรียบเทียบปกติ reg1 := tmpmem ถ้า (เงื่อนไข) [mem] := tmpmem + reg2 | 3 | ป่าเซียร์รา , ทะเลสาบลูนาร์ |
| PBNDKB | NP 0F 01 C7 | ผูกข้อมูลเข้ากับแพลตฟอร์มโดยการเข้ารหัสด้วยคีย์ห่อหุ้มเฉพาะแพลตฟอร์ม คำสั่งนี้รับอินพุตเป็นที่อยู่ของ "โครงสร้างการผูก" สองโครงสร้างที่จัดเรียงตาม 256 ไบต์ใน RBX และ RCX อ่านโครงสร้างที่ชี้โดย RBX และเขียนโครงสร้างที่แก้ไขแล้วไปยังที่อยู่ที่กำหนดใน RCX หากคำสั่งล้มเหลว ระบบจะตั้งค่า EFLAGS.ZF=1 และส่งคืนรหัสข้อผิดพลาดใน EAX หากสำเร็จ ระบบจะตั้งค่า EFLAGS.ZF=0 และ EAX=0 | 0 | ทะเลสาบจันทรา[ 169 ] |
| ERETS | F2 0F 01 CA | ส่งรายงานกิจกรรมกลับไปยังหัวหน้างาน ส่งคืนค่าจากตัวจัดการเหตุการณ์ FRED สำหรับเหตุการณ์/การเรียกใช้ระบบที่เกิดขึ้นใน Ring 0 | 0 | ทะเลสาบแพนเทอร์ |
ERETU | F3 0F 01 CA | เหตุการณ์ส่งกลับไปยังผู้ใช้ การส่งกลับจากตัวจัดการเหตุการณ์ FRED สำหรับเหตุการณ์/การเรียกใช้ระบบที่เกิดขึ้นใน Ring 3 จะทำให้เกิดการเปลี่ยนจาก Ring 0 ไปยัง Ring 3 | |||
LKGS r/m16 | F2 0F 00 /6 | โหลด Kernel GS Base โหลด | |||
- 1 2คำช่วยจำสำหรับคำแนะนำสาขา
HWNTและHSTรายการต่างๆ อยู่ในเอกสาร Willamette รุ่นแรกเท่านั้น [ 150 ] - เอกสาร Intel รุ่นหลังแสดงรายการคำนำหน้าคำแนะนำสาขาโดยไม่ได้กำหนดคำช่วยจำให้ [ 151 ]Intel XED ใช้ตัวย่อ
hint-takenและhint-not-takenคำแนะนำสาขาเหล่านี้[ 152 ]GNU Binutils 2.12 และเวอร์ชันต่อมาอนุญาตให้ระบุคำแนะนำการแยกสาขา SSE2 เป็นอาร์กิวเมนต์ที่สองของ
Jccคำสั่งแอสเซมบลี: ",pt" สำหรับคำนำหน้าแบบคาดการณ์ว่าจะถูกเลือก และ ",pn" สำหรับคำนำหน้าแบบคาดการณ์ว่าจะไม่ถูกเลือก[ 153 ] - 1 2คำนำ
2Eand` และ `3Eor` จะถูกตีความว่าเป็นคำแนะนำการกระโดด (branch hints) เฉพาะเมื่อใช้กับJccคำสั่งการกระโดดแบบมีเงื่อนไข (opcodes `70..7Fand`0F 80..8F) เท่านั้น - เมื่อใช้กับ opcodes อื่นๆ คำนำหน้าเหล่านี้อาจมีความหมายอื่นๆ (เช่น สำหรับคำสั่งที่มีตัวถูกดำเนินการในหน่วยความจำนอกโหมด 64 บิต คำนำหน้าเหล่านี้จะทำงานเป็นคำนำหน้าการแทนที่เซกเมนต์ (segment-override prefixes) `CS:และDS:`or` ตามลำดับ) บนโปรเซสเซอร์ที่ไม่รองรับคำแนะนำการกระโดด คำนำหน้าเหล่านี้จะได้รับการยอมรับแต่จะถูกละเลยเมื่อใช้ร่วมกับJcc`or` - ↑ฟังก์ชัน Branch hints รองรับการใช้งานบน โปรเซสเซอร์ NetBurst (ตระกูล Pentium 4) ทุกรุ่น แต่ไม่รองรับบนโปรเซสเซอร์รุ่นอื่นใดที่ทราบมาก่อนที่จะมีการนำกลับมาใช้ใหม่ในซีพียู "Redwood Cove" ซึ่งเริ่มต้นด้วย "Meteor Lake" ในปี 2023
- ↑ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับ
ENCLS(เลือกโดย EAX) มีดังนี้:
ค่าใดๆ ที่ไม่ได้รับการสนับสนุนใน EAX จะทำให้เกิดข้อผิดพลาด #GPอีเอเอ็กซ์ การทำงาน 0 (สร้าง) สร้างพื้นที่ปิดล้อม 1 (EADD) เพิ่มหน้า 2 (EINIT) เริ่มต้นใช้งานเอนเคลฟ 3 (EREMOVE) ลบหน้าเว็บออกจาก EPC (Enclave Page Cache) 4 (EDBGRD) อ่านข้อมูลโดยใช้ดีบักเกอร์ 5 (EDBGWR) เขียนข้อมูลโดยใช้ดีบักเกอร์ 6 (ขยาย) ขยายการวัดหน้า EPC 7 (ELDB) โหลดหน้า EPC ที่ถูกบล็อกไว้ 8 (ELDU) โหลดหน้า EPC โดยไม่ถูกบล็อก 9 (บล็อก) บล็อกหน้า EPC เอ (EPA) เพิ่มอาร์เรย์เวอร์ชัน บี (อีดับบลิวบี) เขียนกลับ/ยกเลิกหน้า EPC ซี (อีแทร็ก) เปิดใช้งานการตรวจสอบ EBLOCK เพิ่มด้วย SGX2 ด (สิงหาคม) เพิ่มหน้าไปยังเอนเคลฟที่เริ่มต้นใช้งานแล้ว อี (อีโมดีพีอาร์) จำกัดสิทธิ์การเข้าถึงหน้า EPC เอฟ (อีโมดท์) เปลี่ยนประเภทของหน้า EPC เพิ่มด้วย OVERSUB [ 155 ] 10 (ERDINFO) อ่านข้อมูลประเภท/สถานะของหน้า EPC 11 (ETRACKC) เปิดใช้งานการตรวจสอบ EBLOCK 12 (ELDBC) โหลดหน้า EPC ที่ถูกบล็อกพร้อมการรายงานข้อผิดพลาดขั้นสูง 13 (ELDUC) โหลดหน้า EPC ในฐานะที่ไม่ถูกบล็อก พร้อมการรายงานข้อผิดพลาดที่ได้รับการปรับปรุง อื่น 18 (EUPDATESVN) อัปเดต SVN (หมายเลขเวอร์ชันความปลอดภัย) หลังจากการอัปเดตไมโครโค้ดแบบสด[ 156 ] - ↑ SGX ถูกยกเลิกการใช้งานในโปรเซสเซอร์เดสก์ท็อป/แล็ปท็อปตั้งแต่รุ่นที่ 11 เป็นต้นไป ( Rocket Lake , Tiger Lake ) [ 157 ]แต่ยังคงมีให้บริการในชิ้นส่วนเซิร์ฟเวอร์ที่ใช้แบรนด์ Xeon
- ↑เอกสารของ Intel ระบุว่า Ice Lake-SP และ Tremont เป็นโปรเซสเซอร์ที่มีการนำ SGX oversubscription มาใช้ [ 159 ]อย่างไรก็ตาม ณ เดือนกุมภาพันธ์ 2026 ยังไม่พบว่า Ice Lake-SP หรือ Tremont รุ่นใดมีการตั้งค่าบิตคุณลักษณะ CPUID ของส่วนขยาย SGX oversubscription ในขณะที่หลายรุ่นมีการล้างบิตเหล่านั้นออกไป — โปรเซสเซอร์เพียงรุ่นเดียวที่พบว่ามีการตั้งค่าบิตคุณลักษณะเหล่านี้คือ Ice Lake-U บางรุ่น [ 160 ]
- ↑ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับ
ENCLU(เลือกโดย EAX) มีดังนี้:
ค่าใดๆ ที่ไม่รองรับใน EAX จะทำให้เกิดข้อยกเว้น #GP ฟังก์ชันอีเอเอ็กซ์ การทำงาน 0 (รายงานฉุกเฉิน) สร้างรายงานการเข้ารหัสลับ 1 (EGETKEY) สร้างคีย์เข้ารหัสลับ 2 (ชั้นสอง) เข้าสู่เขตหวงห้าม 3 (ประวัติย่อ) กลับเข้าไปในพื้นที่ปิดล้อมอีกครั้ง 4 (ทางออก) ออกจากเขตหวงห้าม เพิ่มด้วย SGX2 5 (ยอมรับ) ยอมรับการเปลี่ยนแปลงในหน้า EPC 6 (EMODPE) ขยายสิทธิ์การเข้าถึงหน้า EPC 7 (ยอมรับสำเนา) เริ่มต้นหน้าเว็บที่รอการดำเนินการ เพิ่มด้วย TDX [ 161 ] 8 (EVERIFYREPORT2) ตรวจสอบรายงานการเข้ารหัสของโดเมนที่เชื่อถือได้ เพิ่มด้วย AEX-Notify [ 162 ] 9 (EDECCSSA) ลดค่า TCS.CSSA เพิ่มด้วย 256BITSGX [ 163 ] ( EREPORT2) สร้างรายงานการเข้ารหัสที่ประกอบด้วยค่าการวัด SHA384 บี (EGETKEY256) สร้างคีย์เข้ารหัสลับ 256 บิต EENTERและERESUMEไม่สามารถเรียกใช้ภายใน SGX enclave ได้ – ฟังก์ชันอื่นๆ สามารถเรียกใช้ได้เฉพาะภายใน enclave เท่านั้น - คำสั่ง ↑
ENCLUสามารถดำเนินการได้เฉพาะในวงแหวนที่ 3 เท่านั้น ไม่สามารถดำเนินการในวงแหวนที่ 0/1/2 ได้ - ↑ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับ
ENCLV(เลือกโดย EAX) มีดังนี้:
ค่าใดๆ ที่ไม่ได้รับการสนับสนุนใน EAX จะทำให้เกิดข้อยกเว้น #GP คำสั่ง นี้อีเอเอ็กซ์ การทำงาน เพิ่มด้วย OVERSUB [ 155 ] 0 (EDECVIRTCHILD) ลดค่า VIRTCHILDCNT ในหน่วย SECS 1 (EINCVIRTCHILD) เพิ่มค่า VIRTCHILDCNT ใน SECS 2 (ESETCONTEXT) ตั้งค่าฟิลด์ ENCLAVECONTEXT ใน SECS ENCLVมีอยู่เฉพาะในระบบที่รองรับส่วนขยาย EPC Oversubscription Extensions to SGX ("OVERSUB") เท่านั้น - ↑
ENCLVจะใช้งานได้ก็ต่อเมื่อเปิดใช้งานการทำงานของ Intel VMX ด้วยVMXONและหากไม่เช่นนั้นจะแสดงข้อความ #UD - ↑สำหรับกรณีนี้
PTWRITEการเขียนข้อมูลลงใน Processor Trace Packet จะเกิดขึ้นก็ต่อเมื่อบิตเปิดใช้งานชุดหนึ่ง (บิต "TriggerEn", "ContextEn", "FilterEn" ของRTIT_STATUSMSR และบิต "PTWEn" ของRTIT_CTLMSR) ถูกตั้งค่าเป็น 1 ทั้งหมดนี้PTWRITEระบุไว้ใน SDM ว่าจะทำให้เกิดข้อยกเว้น #UD หากใช้คำนำหน้าคำสั่ง 66h โดยไม่คำนึงถึงคำนำหน้าอื่นๆ - ↑ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับ
PCONFIG(เลือกโดย EAX) มีดังนี้:
ค่าใดๆ ที่ไม่รองรับใน EAX จะทำให้เกิดข้อยกเว้น #GP(0)อีเอเอ็กซ์ การทำงาน 0 MKTME_KEY_PROGRAM: โปรแกรมรหัสและโหมดการเข้ารหัสที่จะใช้กับรหัส TME-MK Key ID เพิ่มด้วย TSE 1 TSE_KEY_PROGRAM: การเขียนโปรแกรมคีย์โดยตรงสำหรับ TSE 2 TSE_KEY_PROGRAM_WRAPPED: การตั้งโปรแกรมคีย์แบบ Wrapped สำหรับ TSE - ↑สำหรับ
CLDEMOTEคำสั่งนี้ ระดับแคชที่จะลดระดับบรรทัดแคชลงไปนั้นขึ้นอยู่กับการใช้งานของระบบเนื่องจากคำสั่งนี้ถือเป็นคำแนะนำ ดังนั้นมันจะทำงานเป็น NOP โดยไม่มีข้อยกเว้นใดๆ หากที่อยู่หน่วยความจำที่ให้มาไม่ถูกต้องหรือไม่อยู่ในแคช L1 นอกจากนี้ยังอาจทำงานเป็น NOP ในสถานการณ์อื่นๆ ที่ขึ้นอยู่กับการใช้งานของระบบด้วยเช่นกันในระบบที่ไม่รองรับส่วนขยาย CLDEMOTE มันจะทำงานเป็น NOP - ↑เอกสารของ Intel ระบุว่า Tremont และ Alder Lake เป็นโปรเซสเซอร์ที่มีการนำ CLDEMOTE มาใช้ [ 159 ]อย่างไรก็ตาม ณ เดือนพฤษภาคม 2022 ยังไม่พบว่ารุ่น Tremont หรือ Alder Lake รุ่นใดมีการตั้งค่าบิตคุณลักษณะ CPUID สำหรับ CLDEMOTE ในขณะที่หลายรุ่นมีบิต CPUID ถูกล้าง [ 164 ]ณ เดือนเมษายน 2023 พบว่าบิตคุณลักษณะ CPUID สำหรับ CLDEMOTE ถูกตั้งค่าสำหรับ Sapphire Rapids แล้ว [ 165 ]
- ↑สำหรับกรณีนี้
UMONITORขนาดของตัวถูกดำเนินการของอาร์กิวเมนต์ที่อยู่จะกำหนดโดยขนาดของที่อยู่ ซึ่งสามารถแทนที่ได้ด้วย67hคำนำหน้า เซ็กเมนต์เริ่มต้นที่ใช้คือ DS: ซึ่งสามารถแทนที่ได้ด้วยคำนำหน้าเซ็กเมนต์ - 1 2สำหรับ
UMWAITและTPAUSEระบบปฏิบัติการสามารถใช้IA32_UMWAIT_CONTROLMSR เพื่อจำกัดระยะเวลาสูงสุดที่UMWAIT/TPAUSEสามารถรอได้ คำUMWAITและTPAUSEจะตั้งค่าRFLAGS.CFเป็น 1 หากถึงIA32_UMWAIT_CONTROLขีดจำกัดเวลาที่กำหนดไว้ และเป็น 0 ในกรณีอื่น ๆ - ↑
TPAUSEและUMWAITสามารถรันนอกวงแหวนที่ 0 ได้ก็ต่อเมื่อCR4.TSD=0. - ↑สำหรับอาร์กิวเมนต์รีจิสเตอร์ของ
UMWAITandTPAUSEนั้น รองรับบิตแฟล็กต่อไปนี้:บิต การใช้งาน 0 สถานะการปรับแต่งที่ต้องการ - 0 = C0.2 (การปลุกช้าลง ปรับปรุงประสิทธิภาพของเธรด SMT อื่นๆ บนคอร์เดียวกัน)
- 1 = C0.1 (ปลุกเร็วขึ้น)
31:1 (ที่สงวนไว้) - ↑แม้ว่าการจัดลำดับการทำงาน (serialization) สามารถทำได้ด้วยคำสั่งเก่าๆ เช่น eg
CPUIDและIRETแต่คำสั่งเหล่านี้จะทำหน้าที่เพิ่มเติม ทำให้เกิดผลข้างเคียงและลดประสิทธิภาพเมื่อต้องการการจัดลำดับการทำงานของคำสั่งแบบแยกต่างหาก (CPUIDนอกจากนี้ ยังมีปัญหาที่ว่ามันทำให้เกิด #VMEXIT ที่จำเป็นเมื่อทำงานภายใต้การจำลองเสมือน ซึ่งทำให้เกิดค่าใช้จ่ายเพิ่มเติมจำนวนมาก)SERIALIZEคำสั่งนี้ทำการจัดลำดับการทำงานเท่านั้น จึงหลีกเลี่ยงค่าใช้จ่ายเพิ่มเติมเหล่านี้ได้ - ↑แผนภาพบิตของส่วนประกอบประวัติ CPU ที่สามารถรีเซ็ตได้นั้น
HRESETแสดงโดย CPUID.(EAX=20h,ECX=0):EBXณ เดือนกรกฎาคม 2023 บิตต่อไปนี้ได้รับการกำหนดไว้:นิดหน่อย การใช้งาน 0 ประวัติของ Intel Thread Director 31:1 (ที่สงวนไว้) - ↑ คำสั่ง นี้
IBHFมีผลเฉพาะใน Ring 0 เท่านั้น การดำเนินการIBHFคำสั่งใน ring 1/2/3 ได้รับอนุญาต [ 167 ]แต่จะดำเนินการโดยNOPไม่มีฟังก์ชันรั้วประวัติสาขาในโปรเซสเซอร์ที่ไม่รองรับ IBHF คำสั่งจะทำงานตามปกติโดย
NOPไม่คำนึงถึงวงแหวน (ring) - ↑ คำสั่ง นี้
IBHFถูกเพิ่มเข้าไปในโปรเซสเซอร์ Alder Lake และโปรเซสเซอร์ Intel รุ่นต่อมา พร้อมกับการอัปเดตไมโครโค้ดในเดือนพฤษภาคม 2025 - ↑อาร์กิวเมนต์ register เป็น
SENDUIPIดัชนีสำหรับเลือกรายการจาก UITT (User-Interrupt Target Table ซึ่งเป็นตารางที่ระบุโดย MSRUINTR_TTรุ่น)UINT_MISC - ↑บนโปรเซสเซอร์ Sapphire Rapids
UIRETคำสั่งนี้จะตั้งค่า UIF (User Interrupt Flag) เป็น 1 เสมอ บน โปรเซสเซอร์ Sierra Forestและรุ่นที่ใหม่กว่าUIRETจะตั้งค่า UIF เป็นค่าของบิตที่ 1 ของค่าที่ดึงออกจากสแต็กสำหรับ RFLAGS - ฟังก์ชันนี้แสดงด้วยCPUID.(EAX=7,ECX=1):EDX[17]. - ↑สำหรับ
ENQCMDและEMQCMDSขนาดตัวถูกดำเนินการของอาร์กิวเมนต์รีจิสเตอร์จะกำหนดโดยขนาดที่อยู่ปัจจุบัน ซึ่งสามารถแทนที่ได้ด้วย67hคำนำหน้า - 1 2สำหรับ
RDMSRLISTและWRMSRLISTที่อยู่ที่ระบุในรีจิสเตอร์ RSI และ RDI ต้องจัดเรียงให้ตรงกับ 8 ไบต์ - ↑รหัสเงื่อนไขที่รองรับสำหรับคำสั่ง (opcodeที่มี x nibble ระบุเงื่อนไข) มีดังนี้:
CMPccXADDVEX.128.66.0F38 Ex /rx ซีซี เงื่อนไข ( EFLAGS ) 0 โอ OF=1: "โอเวอร์โฟลว์" 1 เลขที่ OF=0: "ไม่เกิดการล้น" 2 บี CF=1: "ด้านล่าง" 3 หมายเหตุ CF=0: "ไม่ต่ำกว่า" 4 ซ ZF=1: "ศูนย์" 5 นิวซีแลนด์ ZF=0: "ไม่ใช่ศูนย์" 6 เป็น (CF=1 หรือ ZF=1): "ต่ำกว่าหรือเท่ากับ" 7 เอ็นบีอี (CF=0 และ ZF=0): "ไม่ต่ำกว่าหรือเท่ากับ" 8 เอส SF=1: "เครื่องหมาย" 9 เอ็นเอส SF=0: "ไม่ต้องระบุเครื่องหมาย" เอ พี PF=1: "ความเท่าเทียมกัน" บี NP PF=0: "ไม่ใช่พาริตี" ซี แอล SF≠OF: "น้อยกว่า" ดี เอ็นแอล SF=OF: "ไม่น้อยกว่า" อี แอลอี (ZF=1 หรือ SF≠OF): "น้อยกว่าหรือเท่ากับ" เอฟ เอ็นแอลอี (ZF=0 และ SF=OF): "ไม่น้อยกว่าหรือเท่ากับ" - ↑แม้ว่า
CMPccXADDคำสั่งจะดำเนินการกับหน่วยความจำที่ถูกล็อก แต่ก็ไม่ต้องการหรือยอมรับLOCK(F0h) - การพยายามใช้คำนำหน้านี้จะส่งผลให้เกิดข้อผิดพลาด #UD
เพิ่มส่วนขยายเฉพาะของ AMD อื่นๆ เข้าไปด้วย
| ส่วนขยายชุดคำสั่ง | ตัวช่วยจำคำแนะนำ | รหัสปฏิบัติการ | คำอธิบายคำแนะนำ | แหวน | เพิ่มใน |
|---|---|---|---|---|---|
| MOV reg,CR8 | F0 0F 20 /0[ข] | อ่านข้อมูลในทะเบียน CR8 | 0 | K8 [ c ] |
MOV CR8,reg | F0 0F 22 /0[ข] | เขียนข้อมูลลงในรีจิสเตอร์ CR8 | |||
| MONITORX | NP 0F 01 FA | เริ่มตรวจสอบการเขียนข้อมูลลงในตำแหน่งหน่วยความจำ คล้ายกับฟังก์ชันรุ่นเก่าMONITORแต่ใช้งานได้ในโหมดผู้ใช้ | 3 | รถขุด |
MWAITX | NP 0F 01 FB | รอการเขียนไปยังตำแหน่งหน่วยความจำที่ตรวจสอบซึ่งระบุไว้ก่อนหน้านี้ด้วยMONITORX. MWAITXแตกต่างจากMWAITคำสั่งเดิมส่วนใหญ่ตรงที่ทำงานในโหมดผู้ใช้และสามารถรับอาร์กิวเมนต์หมดเวลาที่เป็นตัวเลือก (ระบุเป็นหน่วยเวลา TSC) ใน EBX (เปิดใช้งานโดยการตั้งค่าบิต[1] ของ ECX เป็น 1) | |||
| CLZERO rAX | NP 0F 01 FC | เขียนค่าศูนย์ลงในทุกไบต์ในพื้นที่หน่วยความจำที่มีขนาดและการจัดเรียงเหมือนกับแคชไลน์ของซีพียู และมีไบต์ที่ระบุโดย DS:rAX อยู่[ d ] | 3 | เซน 1 |
| RDPRU | NP 0F 01 FD | อ่านค่า MSR ที่เลือก (ส่วนใหญ่เป็นตัวนับประสิทธิภาพ) ในโหมดผู้ใช้ ECX ระบุว่าต้องอ่านค่ารีจิสเตอร์ใด[ e ] ค่าของ MSR จะถูกส่งกลับในรูปแบบ EDX:EAX | โดยปกติ 3 [ f ] | เซน 2 |
| MCOMMIT | F3 0F 01 FA | ตรวจสอบให้แน่ใจว่าคำสั่ง `store` ก่อนหน้าทั้งหมดในเธรดได้รับการบันทึกในหน่วยความจำแล้ว และข้อผิดพลาดใดๆ ที่เกิดขึ้นในคำสั่ง `store` เหล่านั้นได้รับการแจ้งไปยังแหล่งข้อมูลการบันทึกข้อผิดพลาดที่เกี่ยวข้องแล้ว ชุดของข้อผิดพลาดที่สามารถรายงานได้และกลไกการบันทึกนั้นขึ้นอยู่กับแพลตฟอร์มตั้งค่าEFLAGS.CFเป็น 0 หากเกิดข้อผิดพลาด และ 1 หากไม่มีข้อผิดพลาด | 3 | เซน 2 |
| INVLPGB | NP 0F 01 FE | ยกเลิกรายการ TLB สำหรับช่วงของหน้าหน่วยความจำ พร้อมกับการกระจายสัญญาณ การยกเลิกจะดำเนินการบนโปรเซสเซอร์ที่กำลังประมวลผลคำสั่ง และยังกระจายสัญญาณไปยังโปรเซสเซอร์อื่นๆ ทั้งหมดในระบบด้วยrAX รับค่าที่อยู่เสมือนที่จะยกเลิกและแฟล็กเพิ่มเติมบางส่วน ECX รับค่าจำนวนหน้าหน่วยความจำที่จะยกเลิก และ EDX ระบุ ASID และ PCID ที่จะทำการยกเลิก TLB | 0 | เซน 3 |
TLBSYNC | NP 0F 01 FF | ซิงโครไนซ์การแจ้งยกเลิก TLB รอจนกว่าการแจ้งยกเลิก TLB ทั้งหมดที่ส่งสัญญาณโดยการเรียกใช้INVLPGBคำสั่งก่อนหน้าบนโปรเซสเซอร์เชิงตรรกะเดียวกันจะได้รับการตอบสนองจากโปรเซสเซอร์ทั้งหมดในระบบ คำสั่งนี้กำลังดำเนินการตามลำดับ | |||
- ↑วิธีมาตรฐานในการเข้าถึงรีจิสเตอร์ CR8 คือการใช้การเข้ารหัสที่ใช้
REX.Rคำนำหน้า เช่น44 0F 20 07(MOV RDI,CR8) อย่างไรก็ตามREX.Rคำนำหน้าดังกล่าวมีให้ใช้งานเฉพาะในโหมด 64 บิตเท่านั้นส่วนขยาย AltMovCr8 เพิ่มวิธีการเพิ่มเติมในการเข้าถึง CR8 โดยใช้F0(LOCK) แทนREX.R– ซึ่งช่วยให้สามารถเข้าถึง CR8 นอกโหมด 64 บิตได้ - 1 2เช่นเดียวกับคำสั่ง MOV รูปแบบอื่นๆ ที่ใช้กับรีจิสเตอร์ CRx การเข้ารหัส AltMovCr8 จะไม่สนใจบิต 2 บิตบนสุดของไบต์ ModR/M ของคำสั่ง และจะดำเนินการเสมือนว่าบิตทั้งสองนี้ถูกตั้งค่าเป็น null
11bการเข้ารหัส AltMovCr8 สามารถใช้งานได้ในโหมด 64 บิต อย่างไรก็ตาม การรวมLOCKคำนำหน้ากับREX.Rคำนำหน้าอื่นๆ ไม่ได้รับอนุญาต และจะทำให้เกิดข้อยกเว้น #UD - ↑การรองรับ AltMovCR8 ถูกเพิ่มเข้ามาในรุ่น F ของ AMD K8 และไม่มีในรุ่นก่อนหน้า
- ↑สำหรับ
CLZEROขนาดที่อยู่และคำนำหน้า 67h จะควบคุมว่าจะใช้ AX, EAX หรือ RAX เป็นที่อยู่หรือไม่ เซ็กเมนต์เริ่มต้น DS: สามารถถูกแทนที่ได้ด้วยคำนำหน้าเซ็กเมนต์โอเวอร์ไรด์ ที่อยู่ที่ให้มาไม่จำเป็นต้องจัดเรียง – ฮาร์ดแวร์จะจัดเรียงตามความจำเป็นนี้CLZEROมีจุดประสงค์เพื่อกู้คืนจากข้อผิดพลาด Machine Check ที่ร้ายแรง คำสั่งนี้ไม่สามารถแคชได้ ไม่สามารถใช้เพื่อจัดสรรแคชไลน์โดยไม่ต้องเข้าถึงหน่วยความจำ และไม่ควรใช้สำหรับการล้างหน่วยความจำอย่างรวดเร็ว [ 170 ] - ↑หมายเลขรีจิสเตอร์ที่ใช้โดย
RDPRUอาจไม่ตรงกับของRDMSR/รีจิสเตอร์ที่รองรับโดยณ เดือนธันวาคม 2022 มีดังนี้WRMSR:RDPRU
ค่าที่ไม่รองรับใน ECX จะส่งคืนค่า 0อีซีเอ็กซ์ ลงทะเบียน 0 MPERF (MSR 0E7h: จำนวนสัญญาณนาฬิกาความถี่ประสิทธิภาพสูงสุด) 1 APERF (MSR 0E8h: จำนวนนาฬิกาความถี่ประสิทธิภาพจริง) - ↑ถ้า
CR4.TSD=1เป็นเช่นนั้นRDPRUคำสั่งจะทำงานได้เฉพาะในวงแหวนที่ 0 เท่านั้น
คำสั่งจุดลอยตัว x87
ตัว ประมวลผลร่วม x87หากมีอยู่ จะให้การสนับสนุนสำหรับการคำนวณเลขทศนิยม ตัวประมวลผลร่วมนี้มีรีจิสเตอร์ข้อมูลแปดตัว แต่ละตัวเก็บค่าเลขทศนิยม 80 บิตหนึ่งค่า (1 บิตเครื่องหมาย 15 บิตเลขชี้กำลัง 64 บิตแมนทิสซา) – รีจิสเตอร์เหล่านี้จัดเรียงเป็นสแต็ก โดยรีจิสเตอร์บนสุดของสแต็กเรียกว่า "st" หรือ "st(0)" และรีจิสเตอร์อื่นๆ เรียกว่า st(1), st(2), ...st(7) นอกจากนี้ ยังมีรีจิสเตอร์ควบคุมและสถานะจำนวนหนึ่ง รวมถึง "PC" (การควบคุมความแม่นยำ เพื่อควบคุมว่าการคำนวณเลขทศนิยมควรปัดเศษเป็น 24, 53 หรือ 64 บิตแมนทิสซา) และ "RC" (การควบคุมการปัดเศษ เพื่อเลือกโหมดการปัดเศษ: ปัดเป็นศูนย์ ปัดเป็นอนันต์บวก ปัดเป็นอนันต์ลบ ปัดเป็นเลขคู่ที่ใกล้ที่สุด) และรีจิสเตอร์รหัสเงื่อนไข 4 บิต "CC" ซึ่งแต่ละบิตเรียกว่า C0, C1, C2 และ C3 ตามลำดับ คำสั่งทางคณิตศาสตร์ทั้งหมดที่ x87 มีให้ ไม่ได้ปฏิบัติตาม PC และ RC ทั้งหมด
คำแนะนำดั้งเดิมสำหรับรุ่น8087
| คำอธิบายคำแนะนำ | ตัวช่วยจำ | รหัสปฏิบัติการ | รายการเพิ่มเติม | |
|---|---|---|---|---|
| คำสั่งควบคุม FPU แบบไม่รอ x87 [ a ] | ตัวช่วยจำการรอคอย[ b ] | |||
| เริ่มต้นใช้งาน x87 FPU [ c ] [ d ] | FNINIT | DB E3 | FINIT | |
| โหลดคำควบคุม x87 | FLDCW m16 | D9 /5 | (ไม่มี) | |
| คำสั่งควบคุม x87 ของร้านค้า | FNSTCW m16[ e ] | D9 /7 | FSTCW | |
| ร้านค้า x87 สถานะคำ | FNSTSW m16[ f ] [ e ] | DD /7 | FSTSW | |
| ล้างแฟล็กข้อยกเว้น x87 | FNCLEX | DB E2 | FCLEX | |
| โหลดสภาพแวดล้อม FPU x87 | FLDENV m112/m224[ g ] | D9 /4 | (ไม่มี) | |
| บันทึกสภาพแวดล้อม FPU x87 จากนั้นปิดบังข้อยกเว้น x87 ทั้งหมด | FNSTENV m112/m224[ g ] | D9 /6 | FSTENV | |
| บันทึกสถานะ FPU x87 จากนั้นเริ่มต้น FPU x87 [ c ] | FNSAVE m752/m864[ g ] | DD /6 | FSAVE | |
| กู้คืนสถานะ FPU x87 | FRSTOR m752/m864[ g ] | DD /4 | (ไม่มี) | |
| เปิดใช้งานการขัดจังหวะ (เฉพาะ 8087) [ h ] | FNENI | DB E0 | FENI | |
| ปิดใช้งานการขัดจังหวะ (เฉพาะ 8087) [ h ] | FNDISI | DB E1 | FDISI | |
| คำสั่งโหลด/จัดเก็บ/ย้ายข้อมูลแบบจุดลอยตัว x87 | การควบคุมที่แม่นยำ | การควบคุมการปัดเศษ | ||
| โหลดค่าทศนิยมลงบนสแต็ก | FLD m32 | D9 /0 | เลขที่ | ไม่มีข้อมูล |
FLD m64 | DD /0 | |||
FLD m80 | DB /5 | |||
FLD st(i) | D9 C0+i | |||
| เก็บค่าทศนิยมที่อยู่บนสุดของสแต็กไว้ในหน่วยความจำหรือรีจิสเตอร์สแต็ก | FST m32 | D9 /2 | เลขที่ | ใช่ |
FST m64 | DD /2 | |||
FST st(i)[ฉัน] | DD D0+i | เลขที่ | ไม่มีข้อมูล | |
| เก็บค่าทศนิยมที่อยู่บนสุดของสแต็กไว้ในหน่วยความจำหรือรีจิสเตอร์สแต็ก จากนั้นจึงดึงค่าดังกล่าวออกมา | FSTP m32 | D9 /3 | เลขที่ | ใช่ |
FSTP m64 | DD /3 | |||
FSTP m80[ฉัน] | DB /7 | เลขที่ | ไม่มีข้อมูล | |
FSTP st(i)[ i ] [ j ] | DD D8+i | |||
| DF D0+i [ k ] | ||||
| DF D8+i [ k ] | ||||
| ผลัก +0.0 ลงบนสแต็ก | FLDZ | D9 EE | เลขที่ | ไม่มีข้อมูล |
| เพิ่ม +1.0 ลงในกอง | FLD1 | D9 E8 | ||
| ผลักค่าπ (ประมาณ 3.14159) ลงบนสแต็ก | FLDPI | D9 EB | เลขที่ | 387 [ l ] |
| ดัน(ประมาณ 3.32193) ลงบนสแต็ก | FLDL2T | D9 E9 | ||
| ดัน(ประมาณ 1.44269) ลงบนสแต็ก | FLDL2E | D9 EA | ||
| ดัน(ประมาณ 0.30103) ลงบนสแต็ก | FLDLG2 | D9 EC | ||
| ดัน(ประมาณ 0.69315) ลงบนสแต็ก | FLDLN2 | D9 ED | ||
| สลับรีจิสเตอร์บนสุดของสแต็กกับรีจิสเตอร์สแต็กอื่น | FXCH st(i)[ม] [น] | D9 C8+i | เลขที่ | ไม่มีข้อมูล |
| DD C8+i [ k ] | ||||
| DF C8+i [ k ] | ||||
| คำสั่งโหลด/จัดเก็บจำนวนเต็ม x87 | การควบคุมที่แม่นยำ | การควบคุมการปัดเศษ | ||
| โหลดค่าจำนวนเต็มที่มีเครื่องหมายจากหน่วยความจำลงบนสแต็ก พร้อมแปลงเป็นค่าทศนิยม | FILD m16 | DF /0 | เลขที่ | ไม่มีข้อมูล |
FILD m32 | DB /0 | |||
FILD m64[ o ] | DF /5 | |||
| เก็บค่าบนสุดของสแต็กไว้ในหน่วยความจำ พร้อมแปลงเป็นจำนวนเต็มที่มีเครื่องหมาย[ p ] | FIST m16 | DF /2 | เลขที่ | ใช่ |
FIST m32 | DB /2 | |||
| เก็บค่าบนสุดของสแต็กไว้ในหน่วยความจำ โดยแปลงเป็นจำนวนเต็มที่มีเครื่องหมาย จากนั้นจึงดึงค่าออกจากสแต็ก[ p ] | FISTP m16 | DF /3 | เลขที่ | ใช่ |
FISTP m32 | DB /3 | |||
FISTP m64[ o ] | DF /7 | |||
| โหลดค่าจำนวนเต็มเลขฐานสองแบบเข้ารหัสทศนิยม 18 หลักลงบนสแต็กจากหน่วยความจำ พร้อมแปลงเป็นเลขทศนิยม[ q ] | FBLD m80 | DF /4 | เลขที่ | ไม่มีข้อมูล |
| เก็บค่าบนสุดของสแต็กไว้ในหน่วยความจำ โดยแปลงเป็นจำนวนเต็มเลขฐานสอง 18 หลัก จากนั้นจึงดึงค่าออกจากสแต็ก[ r ] | FBSTP m80 | DF /6 | เลขที่ | 387 [ l ] |
| คำสั่งคำนวณเลขคณิตพื้นฐาน x87 | การควบคุมที่แม่นยำ | การควบคุมการปัดเศษ | ||
การบวกเลขทศนิยม
| FADD m32 | D8 /0 | ใช่ | ใช่ |
FADD m64 | DC /0 | |||
FADD st,st(i) | D8 C0+i | |||
FADD st(i),st | DC C0+i | |||
การคูณจุดลอยตัว
| FMUL m32 | D8 /1 | ใช่ | ใช่ |
FMUL m64 | DC /1 | |||
FMUL st,st(i) | D8 C8+i | |||
FMUL st(i),st | DC C8+i | |||
การลบเลขทศนิยม
| FSUB m32 | D8 /4 | ใช่ | ใช่ |
FSUB m64 | DC /4 | |||
FSUB st,st(i) | D8 E0+i | |||
FSUB st(i),st | DC E8+i | |||
การลบแบบย้อนกลับของจุดลอยตัว
| FSUBR m32 | D8 /5 | ใช่ | ใช่ |
FSUBR m64 | DC /5 | |||
FSUBR st,st(i) | D8 E8+i | |||
FSUBR st(i),st | DC E0+i | |||
การหารจุดลอยตัว[ s ]
| FDIV m32 | D8 /6 | ใช่ | ใช่ |
FDIV m64 | DC /6 | |||
FDIV st,st(i) | D8 F0+i | |||
FDIV st(i),st | DC F8+i | |||
การหารแบบย้อนกลับของจุดลอยตัว[ s ]
| FDIVR m32 | D8 /7 | ใช่ | ใช่ |
FDIVR m64 | DC /7 | |||
FDIVR st,st(i) | D8 F8+i | |||
FDIVR st(i),st | DC F0+i | |||
การเปรียบเทียบจุดลอยตัว
| FCOM m32 | D8 /2 | เลขที่ | ไม่มีข้อมูล |
FCOM m64 | DC /2 | |||
FCOM st(i)[ม] | D8 D0+i | |||
| DC D0+i [ k ] | ||||
| คำสั่งคำนวณเลขคณิตพื้นฐาน x87 พร้อมการดึงข้อมูลออกจากสแต็ก | การควบคุมที่แม่นยำ | การควบคุมการปัดเศษ | ||
| การบวกและการลบเลขทศนิยม | FADDP st(i),st[ม] | DE C0+i | ใช่ | ใช่ |
| การคูณและการลบเลขทศนิยม | FMULP st(i),st[ม] | DE C8+i | ใช่ | ใช่ |
| การลบและป๊อปแบบจุดลอยตัว | FSUBP st(i),st[ม] | DE E8+i | ใช่ | ใช่ |
| การลบแบบย้อนกลับของจุดลอยตัวและป๊อปออก | FSUBRP st(i),st[ม] | DE E0+i | ใช่ | ใช่ |
| การหารและการแยกจุดลอยตัว | FDIVP st(i),st[ม] | DE F8+i | ใช่ | ใช่ |
| การหารกลับและป๊อปค่าจุดลอยตัว | FDIVRP st(i),st[ม] | DE F0+i | ใช่ | ใช่ |
| เปรียบเทียบและแยกจุดลอยตัว | FCOMP m32 | D8 /3 | เลขที่ | ไม่มีข้อมูล |
FCOMP m64 | DC /3 | |||
FCOMP st(i)[ม] | D8 D8+i | |||
| DC D8+i [ k ] | ||||
| DE D0+i [ k ] | ||||
| เปรียบเทียบจุดลอยตัวกับ st(1) จากนั้นป๊อปสองครั้ง | FCOMPP | DE D9 | เลขที่ | ไม่มีข้อมูล |
| คำสั่งคำนวณเลขคณิตพื้นฐาน x87 พร้อมอาร์กิวเมนต์แหล่งที่มาเป็นจำนวนเต็ม | การควบคุมที่แม่นยำ | การควบคุมการปัดเศษ | ||
| การบวกเลขทศนิยมด้วยจำนวนเต็ม | FIADD m16 | DA /0 | ใช่ | ใช่ |
FIADD m32 | DE /0 | |||
| การคูณเลขทศนิยมด้วยจำนวนเต็ม | FIMUL m16 | DA /1 | ใช่ | ใช่ |
FIMUL m32 | DE /1 | |||
| การลบเลขทศนิยมด้วยเลขจำนวนเต็ม | FISUB m16 | DA /4 | ใช่ | ใช่ |
FISUB m32 | DE /4 | |||
| การลบแบบย้อนกลับด้วยจำนวนเต็มแบบจุดลอยตัว | FISUBR m16 | DA /5 | ใช่ | ใช่ |
FISUBR m32 | DE /5 | |||
| การหารเลขทศนิยมด้วยจำนวนเต็ม | FIDIV m16 | DA /6 | ใช่ | ใช่ |
FIDIV m32 | DE /6 | |||
| การหารกลับแบบจุดลอยตัวด้วยจำนวนเต็ม | FIDIVR m16 | DA /7 | ใช่ | ใช่ |
FIDIVR m32 | DE /7 | |||
| เปรียบเทียบเลขทศนิยมกับจำนวนเต็ม | FICOM m16 | DA /2 | เลขที่ | ไม่มีข้อมูล |
FICOM m32 | DE /2 | |||
| เปรียบเทียบเลขทศนิยมกับจำนวนเต็ม แล้วดึงข้อมูลออกจากสแต็ก | FICOMP m16 | DA /3 | เลขที่ | ไม่มีข้อมูล |
FICOMP m32 | DE /3 | |||
| คำสั่งคำนวณทางคณิตศาสตร์เพิ่มเติม x87 | การควบคุมที่แม่นยำ | การควบคุมการปัดเศษ | ||
| เครื่องหมายการเปลี่ยนแปลงจุดลอยตัว | FCHS | D9 E0 | เลขที่ | ไม่มีข้อมูล |
| ค่าสัมบูรณ์ของจุดลอยตัว | FABS | D9 E1 | เลขที่ | ไม่มีข้อมูล |
| เปรียบเทียบค่าจุดลอยตัวที่อยู่บนสุดของสแต็กกับ 0 | FTST | D9 E4 | เลขที่ | ไม่มีข้อมูล |
| จำแนกค่ารีจิสเตอร์ st(0) บนสุดของสแต็กผลลัพธ์การจำแนกจะถูกเก็บไว้ในรีจิสเตอร์ x87 CC [ t ] | FXAM | D9 E5 | เลขที่ | ไม่มีข้อมูล |
| แยกค่า st(0) ออกเป็นสองค่า คือEและMซึ่งแทนเลขชี้กำลังและแมนทิสซาของ st(0) การแยกจะทำดังนี้โดยที่Eเป็นจำนวนเต็ม และMเป็นจำนวนที่มีค่าสัมบูรณ์อยู่ในช่วง. [ u ] st(0) จะถูกแทนที่ด้วยEหลังจากนั้นMจะถูกผลักลงบนสแต็ก | FXTRACT | D9 F4 | เลขที่ | ไม่มีข้อมูล |
| เศษเหลือจากการหาร ทศนิยมแบบบางส่วน[ v ] (ไม่เป็นไป ตามมาตรฐาน IEEE 754 ): | FPREM | D9 F8 | เลขที่ | ไม่มีข้อมูล[ w ] |
| รากที่สองของเลขทศนิยม | FSQRT | D9 FA | ใช่ | ใช่ |
| ปัดเศษทศนิยมเป็นจำนวนเต็ม | FRNDINT | D9 FC | เลขที่ | ใช่ |
| การปรับขนาดเลขทศนิยมกำลัง 2 ปัดเศษค่าของ st(1) ให้เป็นจำนวนเต็มโดยปัดเศษเป็นศูนย์ จากนั้นใช้เป็นตัวคูณปรับขนาดสำหรับ st(0): [ x ] | FSCALE | D9 FD | เลขที่ | ใช่[ y ] |
| คำสั่งเหนือธรรมชาติ x87 [ z ] | ข้อจำกัดช่วงตัวดำเนินการแหล่งที่มา | |||
| เลขชี้กำลังฐาน 2 ลบ 1 พร้อมความแม่นยำเพิ่มเติมสำหรับ st(0) ที่ใกล้เคียงกับ 0: | F2XM1 | D9 F0 | 8087: 80387: | |
| ลอการิทึมฐาน 2 และคูณ: [ aa ]ตามด้วย Stack Pop | FYL2X | D9 F1 | ไม่มีข้อจำกัด | |
| แทนเจนต์บางส่วน: คำนวณจาก st(0) คู่ค่าXและYโดยที่ค่าYจะเข้ามาแทนที่ค่าบนสุดของสแต็ก จากนั้นจึงผลักค่า X เข้าไปในสแต็ก ในโปรเซสเซอร์ 80387 และ x87 รุ่นต่อมา แต่ไม่ใช่ 8087 รุ่นแรกค่า Xจะเป็น 1.0 เสมอ | FPTAN | D9 F2 | 8087: 80387: | |
| ฟังก์ชัน arctangent สองอาร์กิวเมนต์พร้อมการปรับควอดแรนต์: [ ab ]ตามด้วย Stack Pop | FPATAN | D9 F3 | 8087: 80387: ไม่มีข้อจำกัด | |
| ลอการิทึมฐาน 2 บวก 1 ด้วยความแม่นยำพิเศษสำหรับ st(0) ที่ใกล้เคียงกับ 0 ตามด้วยการคูณ: [ aa ]ตามด้วย Stack Pop | FYL2XP1 | D9 F9 | อินเทล: เอดีเอ็ม: | |
| คำแนะนำอื่นๆ สำหรับ x87 | ||||
| ไม่มีการดำเนินการ[ ac ] | FNOP | D9 D0 | ||
| ลดค่าตัวชี้สแต็กของรีจิสเตอร์ FPU x87 | FDECSTP | D9 F6 | ||
| เพิ่มค่าตัวชี้สแต็กของรีจิสเตอร์ FPU x87 | FINCSTP | D9 F7 | ||
| ลงทะเบียน FPU x87 ฟรี | FFREE st(i) | DD C0+i | ||
| ตรวจสอบและจัดการข้อยกเว้น x87 FPU ที่ค้างอยู่ซึ่งไม่ได้ถูกปิดบัง[โฆษณา] | WAIT,FWAIT | 9B | ||
| การจัดเก็บและดึงข้อมูลแบบจุดลอยตัว โดยไม่มีข้อยกเว้นเรื่องสแต็กอันเดอร์โฟลว์[ ae ] | FSTPNCE st(i) | D9 D8+i [ k ] | ||
| ลงทะเบียน x87 ฟรี จากนั้นเรียงซ้อนป๊อป | ฟรี st(i) | DF C0+i [ k ] | ||
- ↑โคโปรเซสเซอร์ x87 (นอกเหนือจาก 8087) จัดการข้อยกเว้นในลักษณะที่ค่อนข้างผิดปกติ เมื่อคำสั่ง x87 สร้างข้อยกเว้นทางคณิตศาสตร์ที่ไม่ได้ปิดบังไว้ คำสั่งนั้นจะยังคงทำงานให้เสร็จสมบูรณ์โดยไม่ทำให้เกิดข้อผิดพลาดของ CPU – แทนที่จะทำให้เกิดข้อผิดพลาด คำสั่งนั้นจะบันทึกข้อมูลที่จำเป็นในการจัดการข้อยกเว้น (ตัวชี้คำสั่ง, รหัสการทำงาน, ตัวชี้ข้อมูลหากคำสั่งนั้นมีตัวถูกดำเนินการในหน่วยความจำ) ไว้ในโคโปรเซสเซอร์ และตั้งค่าแฟล็กสถานะคำของ FPU เพื่อระบุว่ามีข้อยกเว้นที่รออยู่ ข้อยกเว้นที่รออยู่นี้จะทำให้เกิดข้อผิดพลาดของ CPU เมื่อ
WAITมีการดำเนินการคำสั่ง x87, MMX หรือคำสั่งข้อยกเว้นสำหรับเรื่องนี้คือคำสั่ง "Non-Waiting" ของ x87 ซึ่งจะทำงานโดยไม่ทำให้เกิดข้อผิดพลาดดังกล่าวแม้ว่าจะมีข้อยกเว้นที่รออยู่ (โดยมีข้อควรระวังบางประการ โปรดดูหมายเหตุการใช้งาน AP-578 [ 171 ] ) คำสั่งเหล่านี้ส่วนใหญ่เป็นคำสั่งควบคุมที่สามารถตรวจสอบและ/หรือแก้ไขสถานะข้อยกเว้นที่รออยู่ของ FPU x87 ได้ - ↑สำหรับคำสั่ง x87 ที่ไม่รอการตอบสนองแต่ละคำสั่งที่มีตัวย่อขึ้นต้นด้วย
FNN จะมีคำสั่งเสมือนที่มีตัวย่อเดียวกัน ยกเว้นไม่มี N คำสั่งเสมือนเหล่านี้ประกอบด้วยWAITคำสั่ง (รหัสการทำงาน9B) ตามด้วยคำสั่ง x87 ที่ไม่รอการตอบสนองที่สอดคล้องกัน ตัวอย่างเช่น:FNCLEXเป็นคำสั่งที่มีรหัสปฏิบัติการ จากนั้นDB E2คำสั่งเสมือนที่เกี่ยวข้องFCLEXจะถูกเข้ารหัส9B DB E2เป็นFNSAVE ES:[BX+6]เป็นคำสั่งที่มีรหัสปฏิบัติการ (opcode26 DD 77 06) จากนั้นคำสั่งเสมือนที่สอดคล้องกันFSAVE ES:[BX+6]จะถูกเข้ารหัสเป็น9B 26 DD 77 06
- 1 2การเริ่มต้นใช้งาน FPU ที่ดำเนินการโดย
F(N)INITและF(N)SAVEจะตั้งค่ารีจิสเตอร์ FPU x87 ดังต่อไปนี้:- คำควบคุม FPU id ถูกตั้งค่าเป็น
0x03FFบน 8087 [ 172 ]หรือ0x037Fบน 80287 และ FPU รุ่นหลังๆ (ความแม่นยำ 64 บิต ปัดเศษเป็นค่าที่ใกล้ที่สุด ปิดบังข้อยกเว้นทั้งหมด เปิดใช้งานการขัดจังหวะสำหรับ 8087) - ค่าสถานะ FPU จะถูกตั้งเป็น 0 ทั้งหมด (ยกเว้นใน FPU รุ่น 8087/80287 ซึ่งอาจปล่อยบิต CC ไว้โดยไม่แก้ไข)
- คำสั่งแท็ก FPU ถูกตั้งค่าเป็น
0xFFFF(ทำเครื่องหมายรีจิสเตอร์ทั้งหมดเป็นว่างเปล่า) - ในโปรเซสเซอร์ i486 และรุ่นที่ใหม่กว่า รีจิสเตอร์ตัวชี้ข้อยกเว้น FPU (FCS, FIP, FDS, FDP, FOP) จะถูกตั้งค่าเป็น 0
- คำควบคุม FPU id ถูกตั้งค่าเป็น
- ↑บน FPU รุ่น 80387 และรุ่นก่อนหน้า หาก
FNINITมีการออกคำสั่งก่อนที่คำสั่ง x87 ที่อ้างอิงหน่วยความจำก่อนหน้าจะเสร็จสมบูรณ์ รอบการทำงานของบัสหน่วยความจำที่เกี่ยวข้องกับคำสั่ง x87 ก่อนหน้านั้นอาจถูกยกเลิก [ 173 ] - 1 2สำหรับการตรวจจับโคโปรเซสเซอร์ x87 บนระบบที่ไม่รองรับ
CPUIDมักจะออกคำสั่งFNINITตามด้วยFNSTCWหรือFNSTSWแล้วตรวจสอบว่าFNSTCW/FNSTSWเขียนค่าที่คาดหวังลงในหน่วยความจำ บน 8087 ขั้นตอนการตรวจจับดังกล่าวต้องใช้คำสั่งจำนวนเต็มอย่างน้อยสองคำสั่งคั่นระหว่าง/FNINITที่ตามมาเพื่อให้ทำงานได้อย่างถูกต้อง [ 172 ]FNSTCWFNSTSW - ↑
F(N)STSWการใช้งานรีจิสเตอร์ AX เป็นปลายทางนั้นมีให้ใช้งานในรุ่น 80287 และรุ่นที่ใหม่กว่า แต่ไม่มีในรุ่น 8087 - 1 2 3 4บนหน่วยประมวลผลทศนิยม (FPU) 80387 และ x87 รุ่นต่อมา คำสั่ง ,,
FLDENVและมีอยู่ทั้งแบบ 16 บิตและ 32 บิต แบบ 16 บิตจะโหลด/จัดเก็บโครงสร้างข้อมูลสภาพแวดล้อมทศนิยมขนาด 14 ไบต์ไปยัง/จากหน่วยความจำ – ส่วนแบบ 32 บิตจะโหลด/จัดเก็บโครงสร้างข้อมูลขนาด 28 ไบต์แทน (คำสั่ง/จะโหลด/จัดเก็บเนื้อหาของรีจิสเตอร์ข้อมูล FPU เพิ่มเติมอีก 80 ไบต์หลังจากสภาพแวดล้อม FPU รวมเป็น 94 หรือ 108 ไบต์) การเลือกใช้ระหว่างแบบ 16 บิตและ 32 บิตขึ้นอยู่กับจำนวนบิตและการมีอยู่ของคำนำหน้าคำสั่ง บน 8087 และ 80287 มีเฉพาะแบบ 16 บิตเท่านั้นไม่มีคำสั่งแบบ 64 บิต – การใช้งานภายใต้ x86-64 จะทำให้ใช้แบบ 32 บิตแทน เนื่องจากคำสั่งเหล่านี้สามารถโหลด/จัดเก็บได้เฉพาะ 32 บิตล่างสุดของ FIP และ FDP เท่านั้น จึงแนะนำให้ใช้/แทนหากต้องการใช้งานในโหมด 64 บิตF(N)STENVFRSTORF(N)SAVEF(N)SAVEFRSTORCS.D66hREX.WFXSAVE64FXRSTOR64 - 1 2ในกรณีที่คำสั่ง x87 ทำให้เกิดข้อยกเว้น FPU ที่ไม่ได้ปิดบัง FPU 8087 จะส่งสัญญาณ IRQในช่วงเวลาที่ไม่แน่นอนหลังจากออกคำสั่ง ซึ่งอาจไม่สามารถจัดการได้เสมอไป [ 172 ]ดังนั้น FPU จึงมี
F(N)DISIและF(N)ENIเพื่อตั้งค่า/ล้างบิต Interrupt Mask (บิต 7) ของคำควบคุม x87 [ 174 ]เพื่อควบคุมการขัดจังหวะFPU x87 รุ่นต่อมา ตั้งแต่ 80287 เป็นต้นไป ได้เปลี่ยนกลไกข้อยกเว้น FPU ไปเป็นการสร้างข้อยกเว้น CPU ในคำสั่ง x87 ถัดไปแทน ทำให้บิต Interrupt Mask ไม่จำเป็นอีกต่อไป จึงถูกลบออก [ 175 ]ใน FPU x87 ของ Intel รุ่นต่อมาF(N)ENIและF(N)DISIยังคงไว้เพื่อความเข้ากันได้กับรุ่นก่อนหน้า โดยทำงานเป็น NOP ที่ไม่แก้ไขสถานะ x87 ใดๆ - 1 2 3
FST/FSTPที่มีปลายทาง 80 บิต (m80 หรือ st(i)) และค่าแหล่งที่มา sNaN ได้รับการบันทึกไว้ว่าจะทำให้เกิดข้อยกเว้นบน AMD FPU แต่ไม่ใช่ Intel - ↑
FSTP ST(0)เป็นสำนวนที่ใช้กันทั่วไปสำหรับการดึงค่ารีจิสเตอร์เดียวออกจากสแต็กของรีจิสเตอร์ x87 - 1 2 3 4 5 6 7 8 9รหัสคำสั่งนามแฝง Intel x87 ไม่แนะนำให้ใช้รหัสคำสั่งนี้บนตัวประมวลผลร่วม Intel 8087 รหัสคำสั่งที่สงวนไว้หลายรหัสจะดำเนินการในลักษณะที่คล้ายกับคำสั่ง x87 ที่กำหนดไว้ที่มีอยู่ รหัสคำสั่งเหล่านี้ได้รับการบันทึกไว้สำหรับ 8087 [ 176 ]และ 80287 [ 177 ]แต่ถูกละเว้นจากคู่มือในภายหลังจนกระทั่งการอัปเดต Intel SDM ในเดือนตุลาคม 2017 [ 178 ] รหัสคำสั่ง เหล่านี้มีอยู่ใน FPU Intel x87 ที่รู้จักทั้งหมด แต่ไม่มีใน FPU ที่ไม่ใช่ Intel รุ่นเก่าบางรุ่น เช่น AMD Geode GX/LX, DM&P Vortex86 [ 179 ]และ NexGen 586PF [ 180 ]
- 1 2บน 8087 และ 80287
FBSTPคำสั่งโหลดค่าคงที่จะใช้โหมดการปัดเศษแบบปัดขึ้นเป็นค่าที่ใกล้ที่สุดเสมอ บน 80387 และหน่วยประมวลผลทศนิยม x87 รุ่นต่อมา คำสั่งเหล่านี้จะใช้โหมดการปัดเศษที่ระบุไว้ในรีจิสเตอร์ RC ของ x87 - 1 2 3 4 5 6 7 8 9สำหรับ
FADDP,FSUBP,FSUBRP,FMULP,FDIVP,FDIVRP,FCOM,FCOMPและFXCHตัวประกอบ/ตัวแยกส่วนประกอบ x86 อาจรู้จักรูปแบบต่างๆ ของคำสั่งที่ไม่มีอาร์กิวเมนต์ รูปแบบดังกล่าวเทียบเท่ากับรูปแบบที่ใช้ st(1) เป็นอาร์กิวเมนต์แรก - ↑บนโปรเซสเซอร์ Intel Pentium และรุ่นที่ใหม่กว่า
FXCHคำสั่งนี้ถูกนำไปใช้ในรูปแบบของการเปลี่ยนชื่อรีจิสเตอร์ แทนที่จะเป็นการย้ายข้อมูลจริง ซึ่งไม่มีผลทางความหมาย แต่ช่วยให้การทำงานมีความหน่วงเป็นศูนย์รอบการทำงาน นอกจากนี้ยังช่วยให้คำสั่งสามารถตัดการพึ่งพาข้อมูลสำหรับค่าบนสุดของสแต็ก x87 ซึ่งช่วยปรับปรุงประสิทธิภาพที่ทำได้สำหรับโค้ดที่ปรับให้เหมาะสมกับโปรเซสเซอร์เหล่านี้ - 1 2บนโปรเซสเซอร์ Intel Pentium ที่ไม่มี MMX วิธีที่เร็วที่สุดในการคัดลอกข้อมูลจากหน่วยความจำระบบไปยังหน่วยความจำที่ไม่ได้แคช (เช่นหน่วยความจำวิดีโอ ) คือการใช้รูปแบบ m64 ของ
FILDและFISTPในลูป [ 181 ]วิธีนี้ถูกใช้ในเกม MS-DOS บางเกม เช่น Carmageddonและ Pete Sampras Tennis '97ปัญหาที่เกิดขึ้นซ้ำๆ ในอีมูเลเตอร์ x86 ที่จำลองรีจิสเตอร์ FPU x87 ด้วยรูปแบบข้อมูลที่มีความแม่นยำของแมนทิสซาน้อยกว่า 64 บิต (เช่น ตัวเลข FP64ซึ่งมีแมนทิสซาเพียง 53 บิต) คือ เมื่อ ลูป
FILD/FISTPดังกล่าวถูกแมปไปยังการแปลง int64↔FP64 บิตข้อมูลลำดับต่ำบางส่วนของแต่ละรายการข้อมูล 64 บิตจะสูญหายไป ในกรณีของข้อมูลเฟรมบัฟเฟอร์ เช่น ข้อมูลสูญหายดังกล่าวจะปรากฏเป็นแถบแนวตั้งทุกๆ 8 พิกเซล[ 182 ] [ 183 ] - 1 2สำหรับ
FIST`and`FISTPหากค่าบนสุดของสแต็ก หลังจากปัดเศษเป็นจำนวนเต็มแล้ว มีค่าเล็กเกินไปหรือใหญ่เกินไปที่จะแสดงในรูปแบบหน่วยความจำปลายทาง ค่าที่จัดเก็บในหน่วยความจำจะไม่ถูกจำกัด แต่จะจัดเก็บค่า "Integer Indefinite" ของ x87 แทน ซึ่งเป็นค่าที่มีบิตบนสุดเป็น 1 และบิตอื่นๆ เป็น 0 (เช่น0x8000สำหรับจำนวนเต็ม 16 บิต) ค่า Integer Indefinite จะถูกใช้เช่นกันหากค่าบนสุดของสแต็กว่างเปล่า, NaN หรือ ±∞ - ↑ผลลัพธ์ของการดำเนินการ
FBLDคำสั่งกับข้อมูลที่ไม่ใช่ BCD นั้นไม่สามารถระบุได้ - ↑สำหรับ
FBSTPคำสั่งนี้ หากค่าบนสุดของสแต็กเป็น NaN หรือมีค่าที่หรือมากกว่าหลังจากปัดเศษ ค่า "BCD Indefinite" ของ x87 จะถูกจัดเก็บไว้ บน 486 และรุ่นต่อมา ค่านี้คือ0xFFFFC000000000000000ในขณะที่ FPU x87 รุ่นก่อนหน้า0xFFFF8000000000000000ใช้[ 184 ] - 1 2ในโปรเซสเซอร์ Intel Pentium รุ่นแรกๆ การหารจุดลอยตัวได้รับผลกระทบจากบั๊ก Pentium FDIV ซึ่งส่งผลกระทบ ต่อคำสั่งที่ทำการหารเป็นส่วนหนึ่งของการดำเนินการ
FPREMเช่นFPTANและFPATAN[ 185 ] - ↑ คำสั่ง นี้
FXAMจะตั้งค่า C0, C2 และ C3 โดยอิงตามประเภทค่าใน st(0) ดังต่อไปนี้:
C1 จะถูกตั้งค่าเป็นบิตเครื่องหมายของ st(0) โดยไม่คำนึงว่า st(0) จะว่างเปล่าหรือไม่ซี3 ซี2 C0 การจำแนกประเภท 0 0 0 ไม่รองรับ (ผิดปกติหรือหลอก-NaN) 0 0 1 นาเอ็น 0 1 0 จำนวนจำกัดปกติ 0 1 1 อินฟินิตี้ 1 0 0 ศูนย์ 1 0 1 ว่างเปล่า 1 1 0 เลขผิดปกติ 1 1 1 ว่างเปล่า (อาจเกิดขึ้นเฉพาะในรุ่น 8087/80287 เท่านั้น) - ↑สำหรับ
FXTRACTพฤติกรรมที่เป็นผลมาจาก st(0) เป็นศูนย์หรือ ±∞ จะแตกต่างกันระหว่าง 8087 และ 80387:- ถ้า st(0) คือ ±0 แล้วในเวอร์ชัน 8087/80287 ทั้ง EและMจะถูกตั้งค่าให้เท่ากับ st(0) โดยไม่มีการรายงานข้อยกเว้นใดๆ — ในเวอร์ชัน 80387 และเวอร์ชันที่ใหม่กว่าMจะถูกตั้งค่าให้เท่ากับ st(0) Eจะถูกตั้งค่าเป็น -∞ และจะเกิดข้อยกเว้นการหารด้วยศูนย์ขึ้น
- ถ้า st(0) คือ ±∞ บน 8087/80287 จะเกิดข้อยกเว้นการดำเนินการที่ไม่ถูกต้อง และทั้งMและEจะถูกตั้งค่าเป็น NaN — บน 80387 และรุ่นต่อมาMจะถูกตั้งค่าเท่ากับ st(0) และEจะถูกตั้งค่าเป็น +∞ โดยไม่มีการรายงานข้อยกเว้น[ 173 ]
- ↑สำหรับ
FPREMกรณีที่ผลหาร Qมีค่ามากกว่าถ้าเช่นนั้น การคำนวณเศษเหลืออาจทำไปเพียงบางส่วนเท่านั้น ในกรณีนี้FPREMจะต้องรันคำสั่งอีกครั้งเพื่อให้การคำนวณเศษเหลือเสร็จสมบูรณ์ ซึ่งจะแสดงโดยการตั้งค่าคำสั่งC2เป็น 1 ถ้าคำสั่งคำนวณเศษเหลือเสร็จสมบูรณ์แล้ว จะตั้งค่าC2เป็น 0 และตั้งค่าสามบิต{C0,C3,C1}ล่างสุดเป็นสามบิตล่างสุดของผลหารQ บนโปรเซสเซอร์ 80387 และรุ่นที่ใหม่กว่า ถ้าคำสั่งคำนวณเศษเหลือไม่เสร็จสมบูรณ์ เศษเหลือที่คำนวณได้Qที่ใช้สำหรับการลดอาร์กิวเมนต์จะถูกปัดเศษให้เป็นพหุคูณของ 8 (หรือกำลังของ 2 ที่มากกว่า) เพื่อให้สามบิตล่างสุดของผลหารยังคงสามารถดึงได้อย่างถูกต้องในการประมวลผลครั้งต่อไปที่ทำการคำนวณเศษเหลือเสร็จสมบูรณ์ - ↑การคำนวณเศษเหลือที่ดำเนินการโดย
FPREMคำสั่งนี้จะแม่นยำเสมอโดยไม่มีข้อผิดพลาดจากการปัดเศษ - ↑สำหรับ
FSCALEคำสั่ง 8087 และ 80287 นั้น st(1) จะต้องอยู่ในช่วงนอกจากนี้ ค่าสัมบูรณ์ของมันต้องเป็น 0 หรืออย่างน้อย 1 หากไม่เป็นไปตามข้อกำหนดเหล่านี้ ผลลัพธ์จะไม่มีค่าที่แน่นอนข้อจำกัดเหล่านี้ถูกยกเลิกในเวอร์ชัน 80387 แล้ว - ↑สำหรับ
FSCALEกรณีนี้ การปัดเศษจะใช้เฉพาะในกรณีที่ค่าเกิน ค่าต่ำกว่าค่าที่กำหนด หรือผลลัพธ์ต่ำกว่าปกติเท่านั้น - ↑คำสั่งเชิงอภิปรัชญาของ x87 ไม่ปฏิบัติตาม PC หรือ RC แต่จะคำนวณผลลัพธ์แบบเต็ม 80 บิต ผลลัพธ์เหล่านี้อาจไม่ได้ปัดเศษอย่างถูกต้องเสมอไป (ดูปัญหาของผู้สร้างตาราง ) – อาจมีข้อผิดพลาดได้ถึง ±1 ulpบน Pentiumหรือรุ่นที่ใหม่กว่า หรือถึง ±1.5 ulps บนโคโปรเซสเซอร์ x87 รุ่นก่อนหน้า
- 1 2สำหรับ
FYL2XandFYL2XP1ขอบเขตข้อผิดพลาดสูงสุด ±1 ulp จะใช้ได้เฉพาะเมื่อ st(1)=1.0 เท่านั้น สำหรับค่า st(1) อื่นๆ ขอบเขตข้อผิดพลาดจะเพิ่มขึ้นเป็น ±1.35 ulpsFYL2Xสามารถสร้าง #Z (ข้อยกเว้นการหารด้วยศูนย์) ได้หาก st(0)=0 และ st(1) เป็นค่าจำกัดที่ไม่ใช่ศูนย์FYL2XP1อย่างไรก็ตาม ไม่สามารถสร้าง #Z ได้ - ↑สำหรับกรณี
FPATANนี้ จะมีการปรับเปลี่ยนดังต่อไปนี้เมื่อเปรียบเทียบกับการคำนวณค่า arctangent ของอัตราส่วนที่มีอาร์กิวเมนต์เดียว:- ถ้าทั้ง st(0) และ st(1) เป็น ±∞ การคำนวณ arctangent จะทำเสมือนว่า st(0) และ st(1) แต่ละตัวถูกแทนที่ด้วย ±1 ที่มีเครื่องหมายเดียวกัน ซึ่งจะทำให้ได้ผลลัพธ์ที่เป็นจำนวนคี่เท่าของ.
- ถ้าทั้ง st(0) และ st(1) เป็น ±0 การคำนวณ arctangent จะเป็นเสมือนว่า st(0) แต่ไม่ใช่ st(1) ถูกแทนที่ด้วย ±1 ที่มีเครื่องหมายเดียวกัน ทำให้ได้ผลลัพธ์เป็น ±0 หรือ.
- ถ้า st(0) เป็นค่าลบ (มีบิตเครื่องหมายถูกตั้งค่า) แล้วผลบวกของโดยมีเครื่องหมายเดียวกันกับ st(1) จะถูกเพิ่มเข้าไปในผลลัพธ์
- ↑แม้ว่า
FNOPคำสั่งนี้จะไม่มีผลใดๆ ในแง่ที่ว่าสแต็กของรีจิสเตอร์ x87 FPU จะไม่ถูกแก้ไข แต่ก็อาจยังคงแก้ไขค่า FIP และ CC ได้ และอาจเกิดข้อผิดพลาดหากมีข้อยกเว้น x87 FPU ที่รอการแก้ไขอยู่ - ↑ในหน่วยประมวลผลทศนิยม 8087 (แต่ไม่ใช่หน่วยประมวลผลทศนิยม x87 รุ่นหลังๆ)
WAITจำเป็นต้องมีคำสั่งนี้ก่อนคำสั่ง x87 ทุกคำสั่ง (ยกเว้นคำสั่ง "ไม่รอ") เพื่อช่วยให้มั่นใจได้ว่าคำสั่ง x87 ใหม่จะไม่ถูกส่งไปยังหน่วยประมวลผลทศนิยมก่อนที่คำสั่งก่อนหน้าจะเสร็จสมบูรณ์ในโคโปรเซสเซอร์ x87 รุ่นแรกๆ — โดยเฉพาะ 8087 FPU รวมถึง 80287 FPU เมื่อใช้ในระบบ 80286 —
WAITคำสั่งนี้จำเป็นต้องใช้ก่อนคำสั่ง CPU ที่พยายามเข้าถึงตำแหน่งหน่วยความจำที่เคยใช้เป็นตัวดำเนินการของคำสั่งข้อมูล x87 มาก่อน[ 177 ]ในระบบ 386 และ 486 ที่มี FPU x87 ข้อกำหนดนี้ถูกลบออกสำหรับคำสั่ง x87 ส่วนใหญ่ที่เข้าถึงหน่วยความจำ แต่ยังคงมีอยู่สำหรับ
F(N)SAVEคำสั่ง[ 186 ]ในโปรเซสเซอร์ Pentium และรุ่นต่อมา ข้อกำหนดนี้ก็ถูกลบออกF(N)SAVEเช่นกัน - ↑หากรีจิสเตอร์ด้านบนสุดของสแต็ก st(0) ว่างเปล่า
FSTPNCEคำสั่งจะทำงานเหมือนกับFINCSTPการเพิ่มตัวชี้สแต็กโดยไม่มีการเคลื่อนย้ายข้อมูลและไม่มีการรายงานข้อยกเว้น
คำสั่ง x87 ถูกเพิ่มเข้ามาในโปรเซสเซอร์รุ่นหลังๆ
| คำอธิบายคำแนะนำ | ตัวช่วยจำ | รหัสปฏิบัติการ | รายการเพิ่มเติม |
|---|---|---|---|
| คำสั่งควบคุมแบบไม่รอ (Non-Waiting Control Instructions) สำหรับ x87 ถูกเพิ่มเข้ามาในเวอร์ชัน 80287 | ตัวช่วยจำเรื่องการรอคอย | ||
| แจ้ง FPU เมื่อเข้าสู่โหมดป้องกัน[ a ] | FNSETPM | DB E4 | FSETPM |
| จัดเก็บ x87 สถานะ Word เป็น AX | FNSTSW AX | DF E0 | FSTSW AX |
| คำสั่ง x87 เพิ่มในเวอร์ชัน 80387 [ b ] | ข้อจำกัดช่วงตัวดำเนินการแหล่งที่มา | ||
การเปรียบเทียบเลขทศนิยมแบบไม่เรียงลำดับคล้ายกับคำสั่งเปรียบเทียบเลขทศนิยมทั่วไป แต่คำ FCOMสั่ง except จะไม่สร้างข้อยกเว้นเมื่อพบตัวถูกดำเนินการที่เป็นqNaN | FUCOM st(i)[ค] | DD E0+i | ไม่มีข้อจำกัด |
| เปรียบเทียบและแยกข้อมูลแบบจุดลอยตัวที่ไม่เรียงลำดับ | FUCOMP st(i)[ค] | DD E8+i | |
| เปรียบเทียบจุดลอยตัวแบบไม่เรียงลำดับกับ st(1) จากนั้นป๊อปสองครั้ง | FUCOMPP | DA E9 | |
| เศษเหลือบางส่วนแบบจุดลอยตัวที่สอดคล้องกับมาตรฐานIEEE 754 [ d ] | FPREM1 | D9 F5 | |
| คำนวณ ค่าไซน์และโคไซน์แบบจุดลอยตัวคำนวณได้สองค่าและ [ e ] st(0) บนสุดของสแต็กจะถูกแทนที่ด้วยSหลังจากนั้นCจะถูกผลักเข้าไปในสแต็ก | FSINCOS | D9 FB | [ f ] |
| ค่าไซน์แบบจุดลอยตัว[ e ] | FSIN | D9 FE | |
| โคไซน์แบบจุดลอยตัว[ e ] | FCOS | D9 FF | |
| คำสั่ง x87 เพิ่มในPentium Pro | เงื่อนไขสำหรับการเคลื่อนไหวแบบมีเงื่อนไข | ||
| การย้ายแบบมีเงื่อนไขจุดลอยตัวไปยัง st(0) โดยอิงตามEFLAGS | FCMOVB st(0),st(i) | DA C0+i | ด้านล่าง (CF=1) |
FCMOVE st(0),st(i) | DA C8+i | เท่ากัน (ZF=1) | |
FCMOVBE st(0),st(i) | DA D0+i | ต่ำกว่าหรือเท่ากับ(CF=1 หรือ ZF=1) | |
FCMOVU st(0),st(i) | DA D8+i | ไม่มีลำดับ (PF=1) | |
FCMOVNB st(0),st(i) | DB C0+i | ไม่ต่ำกว่า (CF=0) | |
FCMOVNE st(0),st(i) | DB C8+i | ไม่เท่ากัน (ZF=0) | |
FCMOVNBE st(0),st(i) | DB D0+i | ไม่ต่ำกว่าหรือเท่ากับ(CF=0 และ ZF=0) | |
FCMOVNU st(0),st(i) | DB D8+i | ไม่เรียงลำดับ (PF=0) | |
การเปรียบเทียบและกำหนดค่าจุดลอยตัว แตก EFLAGSต่างจากFCOMคำสั่งเปรียบเทียบจุดลอยตัวแบบเก่าตรงที่คำสั่งนี้จะเก็บผลลัพธ์ไว้ในEFLAGSรีจิสเตอร์จำนวนเต็มแทนที่จะเป็นรีจิสเตอร์ CC ของ x87 [ g ] | FCOMI st(0),st(i) | DB F0+i | |
เปรียบเทียบและตั้งค่าเลขทศนิยมEFLAGSจากนั้นจึงดึงค่าออก | FCOMIP st(0),st(i) | DF F0+i | |
การเปรียบเทียบและตั้งค่าแบบจุดลอยตัวที่ไม่เรียงลำดับEFLAGS | FUCOMI st(0),st(i) | DB E8+i | |
เปรียบเทียบและตั้งค่าเลขทศนิยมแบบไม่เรียงลำดับEFLAGSจากนั้นจึงดึงค่าออก | FUCOMIP st(0),st(i) | DF E8+i | |
| คำสั่ง x87 Non-Waiting ถูกเพิ่มในPentium II , AMD K7และSSE [ h ] | ตัวช่วยจำ 64 บิต( REX.Wคำนำหน้า) | ||
| บันทึกสถานะ x87, MMX และ SSE ลงในโครงสร้างข้อมูลขนาด 464 ไบต์[ i ] [ j ] [ k ] | FXSAVE m464byte | NP 0F AE /0 | FXSAVE64 m464byte[ l ] |
| กู้คืนสถานะ x87, MMX และ SSE จากโครงสร้างข้อมูลขนาด 464 ไบต์[ i ] [ j ] | FXRSTOR m464byte | NP 0F AE /1 | FXRSTOR64 m464byte[ l ] |
| คำสั่ง x87 เพิ่มเข้ามาเป็นส่วนหนึ่งของSSE3 | |||
| การจัดเก็บค่าทศนิยมจำนวนเต็มและดึงข้อมูลออกมา โดยปัดเศษเป็นศูนย์[ m ] | FISTTP m16 | DF /1 | |
FISTTP m32 | DB /1 | ||
FISTTP m64 | DD /1 | ||
- ↑ หน่วยประมวลผล ทศนิยม (FPU) ของสถาปัตยกรรม x87 จำเป็นต้องทราบว่ากำลังทำงานในโหมดเรียล (Real Mode ) หรือโหมดป้องกัน (Protected Mode) เนื่องจากสภาพแวดล้อมการคำนวณจุดลอยตัวที่เข้าถึงโดย
F(N)SAVE`FRSTOR, `FLDENVและF(N)STENV`protected` มีรูปแบบที่แตกต่างกันในโหมดเรียลและโหมดป้องกัน บนสถาปัตยกรรม 80287F(N)SETPMจำเป็นต้องใช้คำสั่ง `real` เพื่อสื่อสารการเปลี่ยนจากโหมดเรียลไปเป็นโหมดป้องกันไปยัง FPU บนสถาปัตยกรรม 80387 และ FPU ของ x87 รุ่นต่อมา การเปลี่ยนจากโหมดเรียลไปเป็นโหมดป้องกันจะถูกจัดการโดยอัตโนมัติระหว่าง CPU และ FPU โดยไม่จำเป็นต้องใช้คำสั่งเฉพาะใดๆ ดังนั้น บน FPU เหล่านี้ คำสั่ง `real`FNSETPMจะทำงานเป็นคำสั่ง NOP ที่ไม่แก้ไขสถานะใดๆ ของ FPUบน 80287 เมื่อ FPU เข้าสู่โหมดการทำงานแบบ Protected Mode ด้วย
F(N)SETPMคำสั่งแล้ว จะไม่สามารถกลับเข้าสู่โหมดการทำงานแบบ Real Mode ได้โดยไม่ต้องรีเซ็ต FPU — บนพีซีที่เข้ากันได้กับ IBM ที่มี FPU 80287/80387 (แต่ไม่ใช่ 80486 และรุ่นต่อมา) การรีเซ็ต FPU ดังกล่าวสามารถทำได้โดยการเขียนไบต์ที่มีค่า 0 ไปยังพอร์ต I/F1hO [ 187 ] - ↑ไม่รวมคำสั่งที่ยกเลิกไปแล้วซึ่งเฉพาะเจาะจงสำหรับรุ่น FPU ที่เข้ากันได้กับ 80387 บางรุ่น
- 1 2สำหรับ
FUCOMand นั้นFUCOMPตัวประกอบ/ตัวแยกส่วนประกอบ x86 อาจรู้จักรูปแบบต่างๆ ของคำสั่งที่ไม่มีอาร์กิวเมนต์ รูปแบบดังกล่าวเทียบเท่ากับรูปแบบที่ใช้ st(1) เป็นอาร์กิวเมนต์แรก - ↑ คำสั่ง 80387
FPREM1แตกต่างจากFPREM(D9 F8) รุ่นเก่าตรงที่ผลหาร Qจะถูกปัดเศษเป็นจำนวนเต็มโดยใช้การปัดเศษเป็นเลขคู่ที่ใกล้ที่สุด แทนที่จะปัดเศษเป็นศูนย์เหมือนที่ใช้โดยFPREMเช่นเดียวFPREMกับFPREM1จะคำนวณผลลัพธ์ที่แม่นยำเสมอโดยไม่มีข้อผิดพลาดจากการปัดเศษ เช่นเดียวFPREMกับ อาจทำการคำนวณบางส่วนหากผลหารมีขนาดใหญ่เกินไป ในกรณีนี้จะต้องเรียกใช้ใหม่อีกครั้ง - 1 2 3เนื่องจากการลดอาร์กิวเมนต์ของ x87 FPU สำหรับ sin/cos ด้วยความแม่นยำเพียงประมาณ 68 บิต ค่าของ kที่ใช้ในการคำนวณ
FSIN,FCOSและFSINCOSจึงไม่ใช่ 1.0 อย่างแม่นยำ แต่จะได้รับจาก [ 188 ] [ 189 ] [ 173 ]ความคลาดเคลื่อนในการลดข้อโต้แย้งนี้ส่งผลกระทบต่อFPTANคำแนะนำ ด้วยเช่นกันตัวอย่างของตัวเลขที่ทำให้เกิดความแตกต่างเชิงสัมพัทธ์ขนาดใหญ่ระหว่าง
FSINคำสั่งและฟังก์ชันไซน์ทางคณิตศาสตร์ ได้แก่:- สำหรับจะ
FSINให้ผลลัพธ์ประมาณในขณะที่มูลค่าที่แท้จริงของประมาณ. - สำหรับจะ
FSINให้ผลลัพธ์ประมาณในขณะที่มูลค่าที่แท้จริงของประมาณ.
- สำหรับจะ
- ↑ถ้า st(0) มีค่าจำกัดและค่าสัมบูรณ์ของมันคือหรือมากกว่านั้น ค่า st(0) บนสุดของสแต็กจะไม่ถูกแก้ไข และ C2 จะถูกตั้งค่าโดยไม่มีข้อยกเว้นใดๆ สิ่งนี้ใช้ได้กับ คำสั่ง
FSIN,FCOSและFSINCOSเช่นเดียวกับFPTANบน 80387 และรุ่นที่ใหม่กว่าในกรณีนี้ คำสั่งFSINCOSและFPTANจะงดเว้นการผลักค่าลงบนสแต็กรีจิสเตอร์ x87 ด้วย - ↑คำ
FCOMI,FCOMIP,FUCOMIและFUCOMIPจะเขียนผลลัพธ์ลงในZF,CFและPFของEFLAGSรีจิสเตอร์ บนโปรเซสเซอร์ Intel แต่ไม่ใช่ AMD บิต ,SFและAFของOFจะEFLAGSถูกตั้งค่าเป็นศูนย์ด้วยคำสั่งเหล่านี้ - ↑คำ
FXSAVE`and`FXRSTORถูกเพิ่มเข้ามาในรุ่น "Deschutes" ของ Pentium II และไม่มีอยู่ในรุ่น "Klamath" ก่อนหน้านี้ คำสั่งเหล่านี้มีอยู่ใน AMD K7 ด้วยนอกจากนี้ยังถือว่าเป็นส่วนสำคัญของ SSE ดังนั้นจึงมีอยู่ในโปรเซสเซอร์ทุกตัวที่มี SSE - 1 2คำ
FXSAVE`and`FXRSTORจะบันทึก/กู้คืนสถานะ SSE เฉพาะบนโปรเซสเซอร์ที่รองรับ SSE เท่านั้น มิฉะนั้น จะบันทึก/กู้คืนเฉพาะสถานะ x87 และ MMX เท่านั้นส่วน x87 ของสถานะที่บันทึก/กู้คืนโดยFXSAVE(64)`/`FXRSTOR(64)มีโครงสร้างข้อมูลที่แตกต่างอย่างสิ้นเชิงจากF(N)SAVE`/`FRSTORทำให้สามารถบันทึก/กู้คืนได้เร็วขึ้นโดยหลีกเลี่ยงการโหลดและจัดเก็บที่ไม่ตรงแนวFXSAVEและFXRSTORต้องใช้พารามิเตอร์หน่วยความจำที่จัดเรียงแบบ 16 ไบต์ - 1 2เมื่อเปิดใช้งานการจำลองจุดลอยตัวด้วย
CR0.EM=1และจะถือว่าเป็นคำสั่ง x87 และจะทำให้เกิดข้อยกเว้น #NM (อุปกรณ์ไม่พร้อมใช้งาน) ตามนั้นFXSAVE(64)นอกเหนือจากแล้วนี่คือรหัสคำสั่งเดียวที่อยู่นอกพื้นที่รหัสคำสั่ง ESC ที่แสดงพฤติกรรมนี้ยกเว้นบนซีพียู Netburst (ตระกูล Pentium 4) รหัสคำสั่งทั้งหมดในจะสร้าง #NMหากแม้แต่รหัสคำสั่งที่ไม่ได้กำหนดไว้ซึ่งจะสร้าง #UDในกรณีอื่นก็ตามFXRSTOR(64)WAITD8..DFD8..DFCR0.EM=1 - ↑ แตกต่างจาก คำสั่งเดิมนี้จะไม่เริ่มต้น FPU หลังจากบันทึกสถานะลงในหน่วยความจำ แต่จะปล่อยสถานะของโคโปรเซสเซอร์ x87 ไว้โดยไม่เปลี่ยนแปลง
F(N)SAVEFXSAVE - 1 2คำ
FXSAVE64/FXRSTOR64แตกต่างจากFXSAVE/FXRSTORตรงที่:FXSAVEคำสั่ง /FXRSTORจะบันทึก/กู้คืน FIP และ FDP เป็นรายการ 32 บิต และจะบันทึก/กู้คืน FCS และ FDS เป็นรายการ 16 บิตFXSAVE64คำสั่งนี้จะบันทึก /FXRSTOR64กู้คืน FIP และ FDP เป็นรายการ 64 บิต ในขณะที่จะไม่บันทึก/กู้คืน FCS และ FDS
XSAVE/XRSTORเทียบกับXSAVE64/ ในภายหลัง ด้วย ส่งผลให้การบันทึกทั้ง FCS/FDS และ 32 บิตบนสุดของ FIP/FDP 64 บิตไม่สามารถทำได้ด้วยคำสั่งเดียว แต่ต้องเรียกใช้ทั้งและ แทน ซึ่งเป็นที่ทราบกันดีว่าก่อให้เกิดปัญหา โดยเฉพาะอย่างยิ่งสำหรับไฮเปอร์ไวเซอร์ 64 บิตที่รันเกสต์ 16/32 บิต[ 190 ] [ 191 ]XRSTOR64(F)XSAVE(F)XSAVE64 - ↑ เช่นเดียวกับคำสั่งเก่า ๆนี้
FISTTPจะจัดเก็บค่า "จำนวนเต็มไม่จำกัด" ของ x87 หากค่าบนสุดของสแต็กมีขนาดเล็ก/ใหญ่เกินกว่าที่จะแสดงในรูปแบบปลายทางของหน่วยความจำได้FISTFISTP
คำแนะนำSIMD
คำสั่งการเข้ารหัส
คำแนะนำเกี่ยวกับการจำลองเสมือน
คำแนะนำอื่นๆ
นอกจากนี้ x86 ยังรวมถึงชุดคำสั่งที่เลิกใช้แล้ว ซึ่งไม่ได้รับการสนับสนุนจาก Intel และ AMD อีกต่อไป และคำสั่งที่ไม่ได้รับการบันทึกไว้ ซึ่งสามารถทำงานได้แต่ไม่มีการบันทึกไว้อย่างเป็นทางการ
คำสั่ง x86 ที่ไม่ได้บันทึกไว้
ซีพียู x86 มีคำสั่งที่ไม่ได้รับการบันทึกไว้ซึ่งถูกนำไปใช้งานบนชิปแต่ไม่ได้ระบุไว้ในเอกสารทางการบางฉบับ สามารถค้นหาได้จากแหล่งข้อมูลต่างๆ บนอินเทอร์เน็ต เช่นรายการ Interrupt List ของ Ralf Brownและที่sandpile.org
คำสั่งเหล่านี้บางส่วนมีให้ใช้งานอย่างแพร่หลายในซีพียู x86 หลายรุ่น/ส่วนใหญ่ ในขณะที่คำสั่งอื่นๆ นั้นจำเพาะเจาะจงกับซีพียูบางรุ่นเท่านั้น
คำสั่งที่ไม่ได้รับการบันทึกไว้ แต่มีให้ใช้งานอย่างแพร่หลายในซีพียู x86 หลายรุ่น ได้แก่
| เทคนิคช่วยจำ | รหัสปฏิบัติการ | คำอธิบาย | สถานะ |
|---|---|---|---|
AAM imm8 | D4 ib | ASCII-Adjust-after-Multiply. บนเครื่อง 8086 มีการระบุไว้สำหรับ imm8=0Ah เท่านั้น ซึ่งใช้ในการแปลงผลลัพธ์การคูณเลขฐานสองเป็น BCD การดำเนินการจริงนั้น | ใช้งานได้ตั้งแต่รุ่น 8086 เป็นต้นไป โดยมีเอกสารกำกับสำหรับค่า imm8 อื่นๆ นอกเหนือ0Ahจากรุ่น Pentium (เอกสารรุ่นก่อนหน้านี้ไม่ได้ระบุอาร์กิวเมนต์ใดๆ) |
AAD imm8 | D5 ib | ASCII-Adjust-Before-Division. ในเครื่อง 8086 มีการระบุไว้สำหรับ imm8=0Ah เท่านั้น ซึ่งใช้ในการแปลงค่า BCD เป็นเลขฐานสองสำหรับคำสั่งหารที่จะตามมา การดำเนินการจริงนั้นใช้ได้ | |
SALC,SETALC | D6 | กำหนดค่า AL โดยขึ้นอยู่กับค่าของ Carry Flag (ซึ่งเป็นตัวเลือกขนาด 1 ไบต์SBB AL, AL) | มีให้ใช้งานตั้งแต่รุ่น 8086 เป็นต้นไป แต่มีเอกสารบันทึกไว้เฉพาะตั้งแต่รุ่น Pentium Pro เป็นต้นไปเท่านั้น |
ICEBP,INT1 | F1 | ข้อยกเว้นแบบไบต์เดียวขั้นตอนเดียว / เรียกใช้ICE | ใช้งานได้ตั้งแต่ 80386 เป็นต้นไป มีเอกสารกำกับ (เป็นINT1) ตั้งแต่ Pentium Pro ทำงานเป็นคำนำหน้าคำสั่งที่ไม่ได้รับการบันทึกบน 8086 และ 80286 [ 193 ] |
TEST r/m8,imm8 | F6 /1 ib | รูปแบบTESTคำสั่ง ที่ไม่ได้บันทึกไว้ [ 194 ]ดำเนินการเช่นเดียวกับรูปแบบที่บันทึกไว้F6 /0และF7 /0รูปแบบอื่นๆ ตามลำดับ | มีให้ใช้งานตั้งแต่รุ่น 8086 เป็นต้นมา |
TEST r/m16,imm16,TEST r/m32,imm32 | F7 /1 iw,F7 /1 id | ||
SHL,SAL | (D0..D3) /6,(C0..C1) /6 ib | รูปแบบSHLคำสั่ง ที่ไม่ได้บันทึกไว้ [ 194 ]ดำเนินการเช่นเดียวกับรูปแบบที่บันทึกไว้(D0..D3) /4และรูปแบบอื่นๆ ตามลำดับ(C0..C1) /4 ib | มีให้บริการตั้งแต่ 80186 (ดำเนินการที่แตกต่างกันบน 8086) [ 197 ] |
| (หลายรายการ) | 82 /(0..7) ib | ชื่อเรียกแทนของโอเปอเรเตอร์โค้ด80hซึ่งมีคำสั่งจำนวนเต็ม 8 บิตหลายแบบ ( ADD, OR, ADC, SBB, AND, SUB, XOR, CMP) พร้อมอาร์กิวเมนต์ค่าคงที่ 8 บิต[ 198 ] | มีให้ใช้งานตั้งแต่ 8086 [ 198 ]ไม่สามารถใช้งานได้อย่างชัดเจนในโหมด 64 บิต แต่ยังคงเก็บไว้เพื่อความเข้ากันได้[ 199 ] |
OR/AND/XOR r/m16,imm8 | 83 /(1,4,6) ib | 16 บิตOR/ AND/ XORพร้อมค่าคงที่ 8 บิตที่ขยายเครื่องหมาย | มีให้บริการบน 8086 แต่มีเอกสารกำกับไว้เฉพาะตั้งแต่ 80386 เป็นต้นไป[ 200 ] [ 201 ] |
REPNZ MOVS | F2 (A4..A5) | พฤติกรรมของF2คำนำหน้า ( REPNZ, REPNE) เมื่อใช้กับคำสั่งสตริงอื่นที่ไม่ใช่CMPS/ SCASนั้นไม่มีการกำหนดอย่างเป็นทางการ แต่มีซอฟต์แวร์เชิงพาณิชย์ (เช่น FDISK เวอร์ชันที่แจกจ่ายพร้อมกับ MS-DOS เวอร์ชัน 3.30 ถึง 6.22 [ 202 ] ) ที่อาศัยพฤติกรรมดังกล่าวในลักษณะเดียวกับ คำนำหน้า F3( REP) ที่มีเอกสารกำกับไว้ | มีให้ใช้งานตั้งแต่รุ่น 8086 เป็นต้นมา |
REPNZ STOS | F2 (AA..AB) | ||
REP RET | F3 C3 | การใช้คำนำREPหน้ากับRETคำสั่งไม่ได้ระบุว่าได้รับการสนับสนุนใน Intel SDM หรือ AMD APM อย่างไรก็ตาม คู่มือการเพิ่มประสิทธิภาพของ AMD สำหรับ AMD-K8 อธิบายการF3 C3เข้ารหัสว่าเป็นวิธีการเข้ารหัสRETคำสั่งสองไบต์ ซึ่งเป็นวิธีแก้ปัญหาที่แนะนำสำหรับปัญหาในตัวทำนายการแตกแขนงของ AMD-K8 ที่อาจทำให้การทำนายการแตกแขนงล้มเหลวสำหรับคำสั่ง 1 ไบต์บางRETคำสั่ง[ 203 ]อย่างน้อยบางเวอร์ชันของ gcc เป็นที่ทราบกันว่าใช้การเข้ารหัสนี้[ 204 ] | ทำงานได้RETบนซีพียู x86 ทุกรุ่นที่รู้จัก |
NOP | 67 90 | NOPด้วยคำนำหน้าการแทนที่ขนาดที่อยู่ การใช้67hคำนำหน้าสำหรับคำสั่งที่ไม่มีตัวดำเนินการหน่วยความจำถูกระบุไว้ใน Intel SDM (เล่ม 2 ส่วนที่ 2.1.1) ว่า "สงวนไว้" แต่ถูกนำมาใช้ใน Microsoft Windows 95 เป็นวิธีแก้ปัญหาสำหรับข้อบกพร่องในขั้นตอน B1 ของ Intel 80386 [ 205 ] [ 206 ] | ทำงานได้เหมือนกับNOPบนโปรเซสเซอร์ 80386 และรุ่นที่ใหม่กว่า |
NOP r/m | 0F 1F /0 | NOP อย่างเป็นทางการแบบยาว เปิดตัวใน Pentium Pro ในปี 1995 แต่ยังไม่มีการบันทึกไว้จนกระทั่งเดือนมีนาคม 2006 [ 92 ] [ 207 ] [ 208 ] | ใช้งานได้บน Pentium Pro และ AMD K7 [ 209 ]และรุ่นต่อมา ไม่สามารถใช้งานได้บน AMD K6, AMD Geode LX, VIA Nehemiah [ 210 ] |
NOP r/m | 0F 0D /r | สงวนไว้-NOP ถูกนำมาใช้ในPentium 4 ขนาด 65 นาโนเมตรNOP เอกสารของ Intel ระบุรหัสคำสั่งนี้ไว้ ในตารางรหัสคำสั่ง แต่ไม่ได้ระบุไว้ในรายการคำสั่งตั้งแต่เดือนมิถุนายน พ.ศ. 2548 [ 211 ] [ 212 ]ตั้งแต่ Broadwell เป็นต้นมา0F 0D /1ได้รับการบันทึกไว้เป็นPREFETCHWในขณะที่0F 0D /0และ/2../7ได้รับการรายงานว่ามีฟังก์ชันการดึงข้อมูลล่วงหน้าที่ไม่ได้บันทึกไว้[ 148 ]ในซีพียู AMD | มีให้ใช้งานในซีพียู Intel ตั้งแต่รุ่นPentium 4 ขนาด 65 นาโนเมตร ขึ้น ไป |
UD1 | 0F B9 /r | คำแนะนำที่ไม่ได้กำหนดไว้โดยเจตนา แต่ต่างจากUD2( 0F 0B) คำแนะนำเหล่านี้ไม่ได้เผยแพร่จนถึงเดือนธันวาคม 2016 [ 213 ] [ 103 ]เป็นที่ทราบกันดีว่าการติดตั้ง Microsoft Windows 95 ขึ้นอยู่กับ โอเปอเรเตอร์โค้ดที่ไม่ถูกต้องอื่นๆ ที่ซอฟต์แวร์เชิงพาณิชย์ใช้ในการสร้างข้อยกเว้น #UD ได้แก่ | โอเปอเรเตอร์โค้ดทั้งหมดนี้จะสร้างข้อยกเว้น #UD บนโปรเซสเซอร์ 80186 และรุ่นที่ใหม่กว่า (ยกเว้นบน NEC V20/V30 ซึ่งจะกำหนดค่าอย่างน้อย0F FFให้กับคำสั่งเฉพาะของ NEC BRKEM) |
UD0 | 0F FF | ||
คำสั่งที่ไม่ได้รับการบันทึกไว้ ซึ่งปรากฏเฉพาะในซีพียู x86 บางรุ่นเท่านั้น ได้แก่
| เทคนิคช่วยจำ | รหัสปฏิบัติการ | คำอธิบาย | สถานะ | |
|---|---|---|---|---|
REP MUL | F3 F6 /4,F3 F7 /4 | ในสถาปัตยกรรม 8086/8088 คำสั่ง REPOR REPNZจะมีคำนำหน้าเป็นMULOR IMULซึ่งจะทำให้ผลลัพธ์เป็นค่ากลับด้าน เนื่องจากไมโครโค้ดใช้บิต “REP prefix present” ในการเก็บค่าเครื่องหมายของผลลัพธ์ | 8086/8088 เท่านั้น[ 220 ] | |
REP IMUL | F3 F6 /5,F3 F7 /5 | |||
REP IDIV | F3 F6 /7,F3 F7 /7 | ในสถาปัตยกรรม 8086/8088 การใช้คำนำหน้า " REPหรือ " REPNZใน คำสั่ง IDIV(แต่ไม่ใช่DIV") จะทำให้ผลหารกลับเครื่องหมาย เนื่องจากไมโครโค้ดใช้บิต "REP prefix present" ในการเก็บเครื่องหมายของผลหาร | 8086/8088 เท่านั้น[ 220 ] | |
SAVEALL,
| (F1) 0F 04 | ไม่ทราบวัตถุประสงค์ที่แน่ชัด ทำให้ CPU ค้าง ( HCF ) วิธีเดียวที่จะแก้ไขได้คือการรีเซ็ต CPU [ 221 ] ในการใช้งานบางอย่าง จำลองผ่านBIOSเป็นลำดับการหยุด[ 222 ] ในกระทู้สนทนาของ Vintage Computing Federationคำสั่งนี้ (พร้อม | ใช้งานได้เฉพาะบนรหัส 80286 เท่านั้น | |
LOADALL | 0F 05 | โหลดรีจิสเตอร์ทั้งหมดจากที่อยู่หน่วยความจำ 0x000800H | ใช้งานได้เฉพาะบนรหัส 80286 เท่านั้น มีการนำรหัสปฏิบัติการนี้กลับมาใช้ใหม่ | |
LOADALLD | 0F 07 | โหลดรีจิสเตอร์ทั้งหมดจากที่อยู่หน่วยความจำ ES:EDI | ใช้ได้เฉพาะกับรหัสไปรษณีย์ 80386 เท่านั้น มีการนำรหัสปฏิบัติการนี้กลับมาใช้ใหม่ | |
CL1INVMB | 0F 0A[ 223 ] | บน Intel SCC ( Single-chip Cloud Computer ) ให้ยกเลิกบัฟเฟอร์ข้อความทั้งหมด คำสั่งย่อและการทำงานของคำสั่ง แต่ไม่ใช่รหัสการทำงาน จะถูกอธิบายไว้ในข้อกำหนดสถาปัตยกรรม SCC ของ Intel [ 224 ] | มีให้บริการเฉพาะบน SCC เท่านั้น | |
PATCH2 | 0F 0E | บน AMD K6 และแผนที่รุ่นต่อมาจะแสดงFEMMSผลการทำงาน (ล้างสถานะ MMX อย่างรวดเร็ว) แต่บน Intel จะระบุ ข้อมูล uarchที่อ่านบน Intel [ 225 ] | ใช้งานได้เฉพาะในสถานะปลดล็อกสีแดงเท่านั้น ( 0F 0Fเช่นกัน) | |
PATCH3 | 0F 0F | เขียน uarch | สามารถเปลี่ยนส่วน RAM ของไมโครโค้ดบน Intel ได้ | |
UMOV r,r/m,UMOV r/m,r | 0F (10..13) /r | ย้ายข้อมูลเข้า/ออกจากหน่วยความจำผู้ใช้เมื่อทำงานใน โหมด ICE HALT [ 226 ]ทำงานตามปกติMOVในกรณีอื่นๆ | ใช้งานได้เฉพาะกับโปรเซสเซอร์ 386 และ 486 บางรุ่นเท่านั้น รหัสปฏิบัติการที่นำกลับมาใช้ใหม่สำหรับคำสั่ง SSE ในซีพียูรุ่นหลังๆ | |
NXOP | 0F 55 | อินเทอร์เฟซไฮเปอร์โค้ด NexGen [ 227 ] | ใช้งานได้เฉพาะบนNexGen Nx586 เท่านั้น | |
| (หลายรายการ) | 0F (E0..FB)[ 228 ] | คำแนะนำสำหรับ "โหมดไฮเปอร์" ของ NexGen Nx586 ซีพียู NexGen Nx586 ใช้ "ไฮเปอร์โค้ด" [ 229 ] (ลำดับโค้ด x86 ที่คลายแพ็คในเวลาบูตและเข้าถึงได้เฉพาะในโหมดการทำงาน "ไฮเปอร์โหมด" พิเศษ คล้ายกับPALcode ของ DEC Alpha และ XuCode ของ Intel [ 230 ] ) สำหรับการดำเนินการที่ซับซ้อนหลายอย่างซึ่งถูกนำไปใช้ด้วยไมโครโค้ดในซีพียู x86 อื่นๆ ส่วนใหญ่ Nx586 มีคำสั่งจำนวนมากที่ไม่ได้บันทึกไว้เพื่อช่วยในการทำงานในโหมดไฮเปอร์ | ใช้งานได้เฉพาะในโหมด Hyper ของ Nx586 เท่านั้น | |
PSWAPW mm,mm/m64 | 0F 0F /r BB | คำสั่ง AMD 3DNow! ที่ไม่ได้บันทึกไว้บน K6-2 และ K6-3 สลับคำ 16 บิตภายในรีจิสเตอร์ MMX 64 บิต[ 231 ] [ 232 ] คำแนะนำที่ทราบกันว่าได้รับการยอมรับโดยMASM 6.13 และ 6.14 | ใช้ได้เฉพาะกับรุ่น K6-2 และ K6-3 เท่านั้น มีการนำ Opcode กลับมาใช้ซ้ำสำหรับ | |
| ตัวช่วยจำที่ไม่รู้จัก | 64 D6 | การใช้64คำนำหน้า (FS: segment) ร่วมกับ คำสั่ง D6( SALC/ SETALC) ที่ไม่ได้ระบุไว้ จะทำให้ EAX ถูกตั้งค่าเป็น0xAB6B1B07. เฉพาะบนซีพียู UMC เท่านั้น [ 233 ] [ 234 ] | ใช้งานได้เฉพาะบนCPU UMC Greenเท่านั้น การทำงานเหมือนกับSALCบน CPU ที่ไม่ใช่ UMC | |
FS: Jcc | 64 (70..7F) rel8,
| บนซีพียู Intel NetBurst (Pentium 4) คำนำหน้าคำสั่ง 64h (FS: segment) เมื่อใช้กับคำสั่งกระโดดแบบมีเงื่อนไข จะทำหน้าที่เป็นคำแนะนำการกระโดดเพื่อระบุว่าการกระโดดจะสลับระหว่างการกระโดดที่ถูกกระโดดและไม่ถูกกระโดด[ 235 ]ซึ่งแตกต่างจากคำแนะนำการกระโดด NetBurst อื่นๆ (คำนำหน้า segment CS: และ DS:) คำแนะนำนี้ไม่ได้ถูกบันทึกไว้ | ใช้ได้เฉพาะกับซีพียู NetBurst เท่านั้น คำนำหน้าเซ็กเมนต์ในเงื่อนไขการแยกสาขาจะได้รับการยอมรับ แต่ซีพียูที่ไม่รองรับ NetBurst จะไม่สนใจ | |
JMPAI | 0F 3F | กระโดดและดำเนินการตามคำสั่งในชุดคำสั่งทางเลือก ที่ไม่ได้รับการบันทึก ไว้ | ใช้ได้เฉพาะกับโปรเซสเซอร์ x86 บางรุ่นที่ผลิตโดยVIA Technologiesเท่านั้น | |
| ( FMA4 ) | VEX.66.0F38 (5C..5F,68..6F,78..7F) /r imm8 | ในสถาปัตยกรรม AMD Zen1 คำสั่ง FMA4 มีอยู่แต่ไม่ได้ระบุไว้ในเอกสาร (ขาดแฟล็ก CPUID) สาเหตุที่ไม่ได้ระบุไว้ในเอกสารอาจเป็นเพราะการใช้งานมีข้อผิดพลาดหรือไม่ก็ได้ | ถูกลบออกตั้งแต่ Zen2 เป็นต้นไป | |
| (ไม่ทราบจำนวน, หลายรายการ) | 0F 0F /r ?? | เอกสารไวท์เปเปอร์สำหรับ SandSifter [ 236 ]และ UISFuzz [ 237 ]รายงานการตรวจพบคำสั่งจำนวนมากที่ไม่ได้บันทึกไว้ในช่วงรหัสปฏิบัติการ 3DNow! บนซีพียู AMD หลายรุ่น (อย่างน้อยGeode NXและC-50 ) ไม่ทราบการทำงานของคำสั่งเหล่านี้ อย่างน้อยบน AMD K6-2 คำสั่ง 3DNow! ที่ไม่ได้กำหนดทั้งหมด (นอกเหนือจากคำสั่งที่ไม่ได้บันทึกไว้ | มีอยู่ในซีพียู AMD บางรุ่นที่รองรับ 3DNow! | |
MOVDB,
| ไม่ทราบ | บทความ "MediaGX Targets Low-Cost PCs" จากMicroprocessor Report ในปี 1997 ซึ่งครอบคลุมการเปิดตัวโปรเซสเซอร์ Cyrix MediaGXได้ระบุคำสั่งใหม่หลายคำสั่งที่กล่าวกันว่าถูกเพิ่มเข้าไปในโปรเซสเซอร์นี้เพื่อรองรับคุณสมบัติ "Virtual System Architecture" ใหม่ รวมถึงMOVDBและGP2MEM– และยังกล่าวถึงว่า Cyrix ไม่ได้ตั้งใจที่จะเผยแพร่ข้อกำหนดสำหรับคำสั่งเหล่านี้[ 238 ] | ไม่ทราบแน่ชัด ไม่มีข้อมูลจำเพาะใด ๆ ที่ได้รับการเผยแพร่ | |
REP XSHA512 | F3 0F A6 E0 | ทำการคำนวณแฮชด้วยอัลกอริทึม SHA-512 ได้รับการสนับสนุนโดย OpenSSL [ 239 ]ซึ่งเป็นส่วนหนึ่งของ การสนับสนุน VIA PadLockและระบุไว้ในแพตช์เคอร์เนล Linux ที่จัดหาโดย Zhaoxin [ 240 ]แต่ไม่ได้บันทึกไว้ในคู่มือการเขียนโปรแกรม VIA PadLock | ใช้งานได้เฉพาะกับโปรเซสเซอร์ x86 บางรุ่นที่ผลิตโดยVIA TechnologiesและZhaoxinเท่านั้น | |
REP XMODEXP | F3 0F A6 F8 | คำสั่งสำหรับดำเนินการยกกำลังแบบโมดูลาร์และการสร้างเลขสุ่มตามลำดับ ระบุไว้ในแพทช์ที่ VIA จัดหามาเพื่อเพิ่มการสนับสนุนคำสั่ง PadLock เฉพาะ VIA Nano ให้กับ OpenSSL [ 241 ]แต่ไม่ได้บันทึกไว้ในคู่มือการเขียนโปรแกรม PadLock ของ VIA | ||
XRNG2 | F3 0F A7 F8 | |||
| ตัวช่วยจำที่ไม่รู้จัก | 0F A7 (C1..C7) | ตรวจพบโดยเครื่องมือทดสอบการทำงานของ CPU เช่น SandSifter [ 236 ]และ UISFuzz [ 237 ]ว่าทำงานโดยไม่ทำให้เกิด #UD บน CPU VIA และ Zhaoxin หลายตัว การทำงานที่ไม่รู้จัก อาจเกี่ยวข้องกับ คำสั่ง XSTORE( 0F A7 C0) ที่ระบุไว้ในเอกสาร | ||
| ตัวช่วยจำที่ไม่รู้จัก | F2 0F A6 C0 | คำสั่งZhaoxin SM2 แฟล็ก CPUIDที่ระบุไว้ในแพตช์เคอร์เนล Linux สำหรับ OpenEuler [ 242 ]คำอธิบายและรหัสคำสั่ง (แต่ไม่มีตัวย่อคำสั่ง) ที่ให้ไว้ในคำขอสิทธิบัตรของ Zhaoxin [ 243 ]และแพตช์เคอร์เนล Linux ที่ Zhaoxin จัดหาให้[ 244 ] | มีอยู่ใน Zhaoxin KX-6000G [ 245 ] | |
ZXPAUSE | F2 0F A6 D0 | หยุดการทำงานของโปรเซสเซอร์จนกว่าตัวนับเวลาจะถึงหรือเกินค่าที่ระบุใน EDX:EAX สามารถขอสถานะ C ของโปรเซสเซอร์พลังงานต่ำได้ใน ECX ระบุไว้ในแพทช์เคอร์เนล OpenEuler [ 246 ] | มีอยู่ใน Zhaoxin KX-7000 | |
MONTMUL2 | ไม่ทราบ | คำสั่ง Zhaoxin RSA/"xmodx" ตัวย่อและแฟล็ก CPUID อยู่ในรายการแพตช์เคอร์เนล Linux สำหรับ OpenEuler [ 242 ]แต่ไม่มีรหัสการทำงานและคำอธิบายคำสั่ง | ไม่ทราบแน่ชัด CPU Zhaoxin บางตัว[ 245 ]มีการตั้งค่าแฟล็ก CPUID สำหรับคำสั่งเหล่านี้ | |
คำสั่ง x87 ที่ไม่ได้บันทึกไว้
| เทคนิคช่วยจำ | รหัสปฏิบัติการ | คำอธิบาย | สถานะ |
|---|---|---|---|
FENI,
| DB E0 | การเปิดใช้งานอินเตอร์รัปต์ FPU (8087) | เอกสารสำหรับ Intel 80287 [ 177 ] มีอยู่ในหน่วยประมวลผลทศนิยม (FPU) Intel x87 ทุกรุ่นตั้งแต่ 80287 เป็นต้นไป สำหรับ FPU รุ่นอื่นๆ นอกเหนือจากรุ่นที่เริ่มใช้ (8087 สำหรับ คำสั่งเหล่านี้และการทำงานของคำสั่งเหล่านี้บนซีพียูรุ่นใหม่ มักถูกกล่าวถึงในเอกสารของ Intel รุ่นหลังๆ แต่จะละเว้นรหัสคำสั่งและเว้นว่างรายการในตารางรหัสคำสั่งไว้ (เช่นIntel SDM 325462-077 เดือนเมษายน 2022กล่าวถึงคำสั่งเหล่านี้สองครั้งโดยไม่มีรหัสคำสั่ง) อย่างไรก็ตาม Intel XED รู้จักโอเปอเรเตอร์โค้ดเหล่านี้[ 247 ] |
FDISI,
| DB E1 | FPU ปิดใช้งานการขัดจังหวะ (8087) | |
FSETPM,
| DB E4 | FPU ตั้งค่าโหมดป้องกัน (80287) | |
| (ไม่มีเทคนิคช่วยจำ) | D9 D7, , D9 E2D9 E7, , DD FCDE D8, , DE DADE DC, , DE DDDE DE, DF FC | รหัสปฏิบัติการ "สงวนสิทธิ์โดย Cyrix" | รหัสคำสั่งเหล่านี้ถูกระบุว่าเป็นรหัสคำสั่งที่สงวนไว้ซึ่งจะทำให้เกิด "ผลลัพธ์ที่คาดเดาไม่ได้" โดยไม่ก่อให้เกิดข้อยกเว้นอย่างน้อยบน Cyrix 6x86, [ 248 ] 6x86MX, MII, MediaGX และ AMD Geode GX/LX [ 249 ] (เอกสารประกอบสำหรับซีพียูเหล่านี้ทั้งหมดระบุรหัสคำสั่งสิบตัวเดียวกัน) ยังไม่ทราบวิธีการทำงานที่แท้จริงของฟังก์ชันเหล่านี้ และยังไม่ทราบด้วยว่าวิธีการทำงานของฟังก์ชันเหล่านี้เหมือนกันในซีพียูทุกตัวหรือไม่ |
ดูเพิ่มเติม
SFENCEMFENCE;LFENCEลำดับเพื่อบังคับลำดับระหว่างการจัดเก็บหน่วยความจำและการเขียน MSR x2apic ในภายหลังเก็บถาวรเมื่อวันที่ 4 กรกฎาคม 2024MONITORและMWAITตัวดำเนินการที่ระบุอย่างชัดเจนเก็บถาวรเมื่อวันที่ 9 พฤษภาคม 2548MONITOR/MWAITmnemonics ด้วย เก็บถาวรเมื่อ 6 พฤศจิกายน 2022HWNT/HSTตัวย่อสำหรับคำนำหน้าคำแนะนำสาขา เก็บถาวรจากต้นฉบับเมื่อวันที่ 5 กุมภาพันธ์ 2005FNINITค่าคำควบคุมบน 8087 และหน้า 24-25 สำหรับการจัดการการขัดจังหวะและแฟล็กเปิดใช้งานการขัดจังหวะของ 8087FXTRACTกรณีพิเศษส่วนที่ 4.4.9 ในหน้า 87 สำหรับข้อมูลเกี่ยวกับFPTAN(และโดยขยายความFSIN/FCOS/FSINCOS) และส่วนที่ 4.8.1 ในหน้า 99 สำหรับFNINITความสามารถในการยกเลิกวงจรบัสหน่วยความจำสำหรับคำสั่ง x87 ก่อนหน้าWAITซิงโครไนซ์ตัวดำเนินการหน่วยความจำบน 80287 และหน้า 485 สำหรับรหัสคำสั่งนามแฝงบน 80287FSIN,FCOS,FSINCOSและFPTANในเล่มที่ 1 ส่วนที่ 8.3.8NOPคำอธิบายคำสั่ง)UD0และUD1การใช้คำนำหน้า REP หรือ REPNE กับคำสั่ง MUL หรือ IMUL จะทำให้ผลคูณเป็นค่าลบ การใช้คำนำหน้า REP หรือ REPNE กับคำสั่ง IDIV จะทำให้ผลหารเป็นค่าลบ
0F 0A- บริษัท อินเทล คอร์ปอเรชั่น (เมษายน 2022). "คู่มือสำหรับนักพัฒนาซอฟต์แวร์สถาปัตยกรรม Intel 64 และ IA-32 ฉบับรวมเล่ม: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D และ 4" . อินเทล. สืบค้นเมื่อ21 มิถุนายน 2022 .
ลิงก์ภายนอก
- เอกสารประกอบการใช้งาน IA-32 และ x86-64 ฟรีจาก Intel
- คู่มือโปรแกรมเมอร์สถาปัตยกรรม AMD64 เล่ม 1-5จัดทำโดย AMD
- เอกสารอ้างอิงรหัสการทำงานและคำสั่ง x86
- เอกสารอ้างอิงคำสั่ง x86 และ amd64
- ตารางคำสั่ง: รายการแสดงค่าความหน่วงของคำสั่ง อัตราการประมวลผล และรายละเอียดการทำงานของไมโครโอเปอเรชั่นสำหรับซีพียู Intel, AMD และ VIA
- รายการคำสั่งแอสเซมเบลอร์แบบเน็ตไวด์ (จากเน็ตไวด์ แอสเซมเบลอร์ )