กลับไปหน้าบทความ

อ่าน 55 นาที

รายการคำสั่ง x86

ชุดคำสั่งx86 หมายถึงชุดคำสั่งที่ไมโครโปรเซสเซอร์ที่เข้ากันได้กับ สถาปัตยกรรม 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)

เพิ่มในโปรเซสเซอร์เฉพาะบางรุ่น

เพิ่มด้วย80186 / 80188

มีการเพิ่มคำสั่งและรูปแบบคำสั่งใหม่ในโปรเซสเซอร์ Intel 80186 และ 80188 นอกจากนี้ยังพบใน โปรเซสเซอร์ NEC V20 /V30 และรุ่นต่อๆ มาด้วย

  1. วงแหวนป้องกันใช้ได้กับรุ่น 80286 และรุ่นที่ใหม่กว่า ไม่ใช่รุ่น 80186
  2. 1 2 3ในโหมด 64 บิต คำสั่ง ,PUSHAและPOPAจะBOUNDไม่สามารถใช้งานได้ —PUSHAและPOPAจะทำให้เกิด #UD และBOUNDรหัสคำสั่ง (62) จะถูกนำไปใช้ใหม่สำหรับคำนำหน้า EVEX
  3. ในโปรเซสเซอร์บางตัว รวมถึง 80186 บางรุ่น การใช้คำนำหน้าซ้ำกับBOUNDคำสั่งจะปรับเปลี่ยนการทำงานให้เปรียบเทียบเฉพาะขอบล่างเท่านั้น [ 4 ]ด้วยเหตุนี้ จึงควรหลีกเลี่ยงการใช้คำนำหน้าซ้ำสำหรับคำสั่งนี้
  4. บนโปรเซสเซอร์ Intel 80186/80188 และ NEC V-series ความล้มเหลวในการตรวจสอบขอบเขตจะทำให้ #BR ออกมาเป็นข้อยกเว้นประเภทกับดัก (ค่าของ CS:IP ที่เก็บไว้ในสแต็กชี้ไปยังคำสั่งถัดจากBOUNDคำสั่งนั้น) [ 5 ]ในขณะที่บนโปรเซสเซอร์ 80286 และรุ่นต่อมา จะออกมาเป็นข้อยกเว้นประเภทความผิดพลาด (ค่าของ CS:IP ที่เก็บไว้ในสแต็กคือค่าของBOUNDคำสั่งนั้นเอง) [ 6 ]
  5. บางครั้งมีการใช้ "IIMUL" เป็นตัวย่อสำหรับคำสั่ง multiply-immediate ของ 80186 ในเอกสารของ IBM PC [ 7 ]แต่โดยทั่วไปแล้วไม่ได้ใช้
  6. 1 2 3 4สามารถใช้คำนำหน้า ( ) ร่วมกับคำREPสั่ง///ได้ การทำเช่นนั้นจะทำให้คำสั่งถูกทำซ้ำตามจำนวนครั้งที่ระบุใน rCX (การตั้งค่า rCX เป็น 0 จะทำให้ไม่มีการทำซ้ำ กล่าวคือ คำสั่งจะทำงานเหมือน NOP)F3INSBINSWOUTSBOUTSW
  7. 1 2บนโปรเซสเซอร์ 80286 และรุ่นที่ใหม่กว่าINSB/INSWอาจทำการตรวจสอบสิทธิ์การเข้าถึงหน่วยความจำหลังจากการอ่านข้อมูลจากพอร์ต I/O เสร็จสิ้นแล้ว หากการตรวจสอบใดๆ ล้มเหลว (เช่น segfault หรือ page-fault) ข้อมูลที่อ่านจากพอร์ต I/O จะสูญหายไป ด้วยเหตุนี้ การใช้INSB/INSWเพื่ออ่านพอร์ต I/O ที่มีผลข้างเคียงเมื่ออ่านจึงไม่แนะนำ
  8. การเข้าถึงพอร์ต I/O จะได้รับอนุญาตก็ต่อเมื่อ CPL≤IOPLหรือ (ใน 80386 และรุ่นที่ใหม่กว่า) บิต แผนที่สิทธิ์การเข้าถึงพอร์ต I/Oสำหรับพอร์ตที่จะเข้าถึงนั้นถูกตั้งค่าเป็น 0 ทั้งหมด
  9. 1 2 3 4 5 6 7สำหรับคำสั่ง ROL/ROR/RCL/RCR/SHL/SHR/SAR นั้น opcodeC0จะใช้สำหรับรูปแบบไบต์ และ opcodeC1จะใช้สำหรับรูปแบบเวิร์ดสำหรับC0/C1immediate นั้น จะใช้เพียง 5 บิตล่างสุดของ immediate เท่านั้น (6 บิตสำหรับ opcodeC1หากเข้ารหัสด้วยขนาด operand 64 บิตภายใต้ x86-64)
  10. ในโปรเซสเซอร์ 80186 และรุ่นต่อมา ซับโอเปอเรเตอร์โค้ด /6 สำหรับชิฟต์โอเปอเรเตอร์โค้ดC0/C1/D0/D1/D2/D3ทำหน้าที่เป็นชื่อเรียกแทน (ซึ่งมักมีการอธิบายไว้ไม่ดีนัก) ของซับโอเปอเรเตอร์โค้ด /4 — ทั้งหมดนี้เป็นรูปแบบต่างๆ ของSHLคำสั่งดังกล่าว
  11. อาร์กิวเมนต์แรกของENTERคำสั่งนี้จะเป็นค่าคงที่แบบไม่มีเครื่องหมายขนาด 16 บิตเสมอ ไม่ว่า OperandSize จะเป็นเท่าใดก็ตาม

    อาร์กิวเมนต์ที่สองของENTERคือ ค่าคงที่ 8 บิต - บนโปรเซสเซอร์ 80186/80188 และ NEC V-series จะใช้ทั้ง 8 บิต[ 5 ]แต่โปรเซสเซอร์ 80286 และรุ่นต่อมาจะใช้เพียง 5 บิตล่างสุด[ 6 ]

  12. บนโปรเซสเซอร์รุ่นใหม่กว่าENTERคำสั่งนี้จะตรวจสอบหลังจากตั้งค่าเฟรมสแต็กแล้วว่าตำแหน่งไบต์ที่ชี้โดยค่าใหม่ของ SS:rSP สามารถเขียนได้หรือไม่ — หากไม่สามารถเขียนได้ คำสั่งนี้จะสร้างข้อยกเว้นเดียวกัน (เช่น เพจฟอลต์) เช่นเดียวกับการเขียนไปยังที่อยู่ดังกล่าว [ 8 ]

เพิ่มด้วย80286

คำสั่งใหม่ที่เพิ่มเข้ามาใน 80286 เพิ่มการรองรับโหมดป้องกัน x86 คำสั่งบางส่วนแต่ไม่ใช่ทั้งหมด สามารถใช้งานได้ในโหมดจริงเช่นกัน

  1. 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 หรือไม่

  2. 1 2 3 4คำLGDT,LIDT,LLDTและLTRจะถูกเรียงลำดับบน โปรเซสเซอร์ Pentiumและรุ่นที่ใหม่กว่า
  3. คำสั่ง นี้LMSWทำงานแบบเรียงลำดับบนโปรเซสเซอร์ Intel ตั้งแต่ Pentiumขึ้นไป แต่ไม่ทำงานบนโปรเซสเซอร์ AMD

    เมื่อLMSWใช้คำสั่งเพื่อเข้าสู่โหมดป้องกันควรตามด้วยคำสั่งกระโดดทันทีเพื่อล้างคิวพรีเฟตช์[ 12 ] (บน Intel 80286 LMSWมีรายงานว่าการเรียกใช้คำสั่งที่ไม่ใช่การกระโดดสามคำสั่งทันทีหลังจากเข้าสู่โหมดป้องกันจะทำให้ CPU รีเซ็ต) [ 13 ]

  4. บน 80386 และรุ่นต่อมา "คำสถานะเครื่อง" จะเหมือนกับรีจิสเตอร์ควบคุม CR0 – อย่างไรก็ตามLMSWคำสั่งนี้สามารถแก้ไขได้เฉพาะ 4 บิตล่างสุดของรีจิสเตอร์นี้เท่านั้น และไม่สามารถล้างบิตที่ 0 ได้ การที่ไม่สามารถล้างบิตที่ 0 ได้หมายความว่าLMSWสามารถใช้เพื่อเข้าสู่โหมดป้องกัน x86บน 80286 ไม่สามารถออกจากโหมดป้องกันได้เลย (ไม่ว่าจะใช้LMSWหรือไม่ใช้LOADALL [ 14 ] ) โดยไม่ต้องรีเซ็ต CPU – บน 80386 และรุ่นต่อมา สามารถออกจากโหมดป้องกันได้ แต่ต้องใช้คำสั่งMOVมาCR0
  5. หากCR4.UMIP=1มีการตั้งค่าSGDT,SIDT,SLDT,SMSWและSTRสามารถทำงานได้เฉพาะใน Ring 0 เท่านั้นคำสั่งเหล่านี้ไม่มีสิทธิ์พิเศษบนซีพียู x86 ทั้งหมดตั้งแต่ 80286 เป็นต้นไปจนกระทั่งมีการนำ UMIP มาใช้ในปี 2017 [ 15 ] นี่เป็นปัญหาด้านความปลอดภัยที่สำคัญสำหรับการจำลองเสมือนแบบใช้ซอฟต์แวร์ เนื่องจากทำให้คำสั่งเหล่านี้สามารถใช้โดยแขก VM เพื่อตรวจจับว่ากำลังทำงานอยู่ภายใน VM [ 16 ] [ 17 ]
  6. 1 2 3คำSMSW,SLDTและSTRจะใช้ขนาดตัวถูกดำเนินการ 16 บิตเสมอเมื่อใช้กับอาร์กิวเมนต์หน่วยความจำ สำหรับโปรเซสเซอร์ 80386 หรือรุ่นที่ใหม่กว่า หากใช้อาร์กิวเมนต์รีจิสเตอร์ จะมีขนาดตัวถูกดำเนินการปลายทางที่กว้างกว่า และทำงานดังนี้:
    • SMSW: จัดเก็บค่าCR0 แบบเต็ม ในโหมด 64 บิตบนซีพียู x86-64 มิฉะนั้นจะไม่กำหนดค่า
    • SLDT: ขยายค่าศูนย์ให้กับอาร์กิวเมนต์ 16 บิตบน โปรเซสเซอร์ Pentium Proและรุ่นที่ใหม่กว่า ไม่มีค่าในโปรเซสเซอร์รุ่นก่อนหน้า
    • STR: ขยายค่าอาร์กิวเมนต์ 16 บิตเป็นศูนย์
  7. บนโปรเซสเซอร์ที่มีสถาปัตยกรรม x86-64ARPLคำสั่งนี้ไม่สามารถใช้งานได้ในโหมด 64 บิต เนื่องจากคำสั่งที่63 /rใช้งานได้เฉพาะในโหมด 64 บิตเท่านั้นMOVSXD
  8. คำสั่ง นี้ARPLทำให้เกิด #UD ในโหมดจริงและโหมดเสมือน 8086 – Windows 95 และ OS/2 2.x เป็นที่ทราบกันดีว่าใช้ #UD นี้อย่างกว้างขวางเพื่อใช้63โอเปอเรเตอร์เป็นเบรกพอยต์หนึ่งไบต์เพื่อเปลี่ยนจากโหมดเสมือน 8086ไปเป็นโหมดเคอร์เนล [ 18 ] [ 19 ]
  9. บิต 19:16 ของมาสก์นี้ถูกบันทึกไว้ว่าเป็น "ไม่ได้กำหนด" บนซีพียู Intel [ 20 ]บนซีพียู AMD มาสก์นี้ถูกบันทึกไว้เป็น0x00FFFF00.
  10. 1 2สำหรับLARandLSLหากไม่สามารถโหลดตัวอธิบายเซ็กเมนต์ที่ระบุได้ รีจิสเตอร์ปลายทางของคำสั่งนั้นจะไม่มีการเปลี่ยนแปลง
  11. ในชุดค่าผสม CPU/ไมโครโค้ดของ Intel บางชุดตั้งแต่ปี 2019 เป็นต้นไป รวมถึงชุดค่าผสม CPU/ไมโครโค้ดของ AMD บางชุดตั้งแต่ปี 2025 เป็นต้นไปVERWคำสั่งนี้ยังทำการล้างบัฟเฟอร์ข้อมูลไมโครสถาปัตยกรรมต่างๆ ในลักษณะเฉพาะของการใช้งาน ซึ่งทำให้สามารถใช้เป็นส่วนหนึ่งของวิธีแก้ปัญหาสำหรับช่องโหว่ด้านความปลอดภัย เช่นการสุ่มตัวอย่างข้อมูลไมโครสถาปัตยกรรมและการโจมตีตัวกำหนดเวลาชั่วคราว [ 21 ] [ 22 ] [ 23 ] ฟังก์ชันการล้างบัฟเฟอร์ไมโครสถาปัตยกรรมบางส่วนที่เพิ่มเข้ามาVERWอาจต้องการให้คำสั่งนี้ถูกดำเนินการด้วยตัวดำเนินการหน่วยความจำ [ 24 ]
  12. 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 เป็นอาร์กิวเมนต์) ไม่จำเป็นต้องมีตัวย่อคำสั่งใหม่ และไม่มีการจัดเตรียมตัวย่อดังกล่าว

  1. สำหรับคำสั่งสตริง 32 บิต สัญลักษณ์ ±± ใช้เพื่อระบุว่ารีจิสเตอร์ที่ระบุจะถูกลดค่าลง 4 ถ้าเป็นจริงEFLAGS.DF=1และจะเพิ่มขึ้น 4 ในกรณีอื่น ๆสำหรับตัวถูกดำเนินการที่ระบุเซกเมนต์ DS เซกเมนต์ DS สามารถถูกแทนที่ได้ด้วยคำนำหน้าการแทนที่เซกเมนต์ – ในกรณีที่ระบุเซกเมนต์ ES เซกเมนต์จะเป็น ES เสมอและไม่สามารถถูกแทนที่ได้การเลือกใช้รีจิสเตอร์ SI/DI 16 บิตหรือรีจิสเตอร์ ESI/EDI 32 บิตเป็นรีจิสเตอร์แอดเดรสจะทำโดย AddressSize ซึ่งสามารถแทนที่ได้ด้วยคำนำ67หน้า
  2. คำสั่งสตริง 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 เท่านั้น
  3. สำหรับINSB/W/Dคำสั่งนี้ สิทธิ์การเข้าถึงหน่วยความจำสำหรับES:[rDI]ที่อยู่หน่วยความจำอาจจะไม่ได้รับการตรวจสอบจนกว่าจะมีการเข้าถึงพอร์ตเสร็จสิ้นแล้ว – หากการตรวจสอบนี้ล้มเหลว (เช่น ข้อผิดพลาดในการเข้าถึงหน้าหน่วยความจำ หรือข้อยกเว้นหน่วยความจำอื่นๆ) ข้อมูลที่อ่านจากพอร์ตจะสูญหายไป ดังนั้นจึงไม่แนะนำให้ใช้คำสั่งนี้ในการเข้าถึงพอร์ต I/O ที่มีผลข้างเคียงใดๆ ในระหว่างการอ่าน
  4. การเข้าถึงพอร์ต I/O จะได้รับอนุญาตก็ต่อเมื่อ CPL≤IOPLหรือบิตในแผนที่สิทธิ์การเข้าถึงพอร์ต I/O ทั้งหมดถูกตั้งค่าเป็น 0 เท่านั้น
  5. คำสั่ง นี้CWDEแตกต่างจากคำสั่งเดิมCWDตรงที่มันCWDจะขยายค่า 16 บิตใน AX ให้เป็นค่า 32 บิตในคู่รีจิสเตอร์ DX:AX
  6. สำหรับE3โอเปรนด์โค้ด (JCXZ/JECXZ) การเลือกใช้ว่าจะใช้CXหรือECXสำหรับการเปรียบเทียบ (และด้วยเหตุนี้จึงใช้ตัวย่อใด) ขึ้นอยู่กับขนาดที่อยู่ (AddressSize) ไม่ใช่ขนาดตัวดำเนินการ (OperandSize) (ในทางกลับกัน OperandSize จะควบคุมว่าปลายทางการกระโดดควรถูกตัดให้เหลือ 16 บิตหรือไม่)สิ่งนี้ยังใช้กับคำสั่งวนซ้ำLOOP,LOOPE,LOOPNE(โอเปรนด์โค้ดE0,E1,E2) ด้วย อย่างไรก็ตาม ต่างจากJCXZ/JECXZคำสั่งเหล่านี้ไม่ได้มีตัวย่อใหม่สำหรับเวอร์ชันที่ใช้ ECX
  7. สำหรับกรณีนี้PUSHA(D)ค่าของ SP/ESP ที่ถูกผลักลงบนสแต็กคือค่าที่มันมีอยู่ก่อนที่PUSHA(D)คำสั่งจะเริ่มทำงาน
  8. สำหรับPOPA/POPADรายการในสแต็กที่สอดคล้องกับ SP/ESP จะถูกดึงออกจากสแต็ก (โดยทำการอ่านหน่วยความจำ) แต่จะไม่ถูกใส่กลับเข้าไปใน SP/ESP
  9. คำPUSHFD`and`POPFDจะทำให้เกิดข้อยกเว้น `#GP` หากดำเนินการในโหมดเสมือน 8086หาก IOPL ไม่ใช่ 3`and`, `and` และ`or` จะทำให้เกิดข้อยกเว้น `#GP` หากดำเนินการในโหมดเสมือน 8086 หาก IOPL ไม่ใช่ 3 และ VME ไม่ได้เปิดใช้งานPUSHFPOPFIRETIRETD
  10. หากIRETDใช้เพื่อกลับจากโหมดเคอร์เนลไปยังโหมดผู้ใช้ (ซึ่งจะเกี่ยวข้องกับการเปลี่ยนแปลง CPL) และเซ็กเมนต์ สแต็กโหมดผู้ใช้ ที่ระบุโดย SS เป็นเซ็กเมนต์ 16 บิตIRETDคำสั่งจะคืนค่าเฉพาะ 16 บิตล่างของตัวชี้สแต็ก (ESP/RSP) เท่านั้น โดยบิตที่เหลือจะคงค่าใดก็ตามที่มีอยู่ในโค้ดเคอร์เนลก่อนหน้านั้นIRETDซึ่งทำให้จำเป็นต้องมีวิธีแก้ปัญหาที่ซับซ้อนทั้งใน Linux ("ESPFIX") [ 27 ]และ Windows [ 28 ]IRETQ ปัญหานี้ยังส่งผลกระทบต่อ คำสั่ง64 บิตในภายหลังด้วย
  1. 1 2 3 4สำหรับBT,BTS,BTRและBTC:
    • หากอาร์กิวเมนต์แรกของคำสั่งเป็นตัวถูกดำเนินการในรีจิสเตอร์ และ/หรือ อาร์กิวเมนต์ที่สองเป็นค่าคงที่ ระบบจะคำนวณดัชนีบิตในอาร์กิวเมนต์ที่สองโดยหารด้วยขนาดของตัวถูกดำเนินการ (16/32/64 ซึ่งในทางปฏิบัติจะใช้เพียง 4, 5 หรือ 6 บิตล่างสุดของดัชนีเท่านั้น)
    • ถ้าอาร์กิวเมนต์แรกเป็นตัวถูกดำเนินการในหน่วยความจำ และอาร์กิวเมนต์ที่สองเป็นตัวถูกดำเนินการในรีจิสเตอร์ ระบบจะใช้ดัชนีบิตในอาร์กิวเมนต์ที่สองทั้งหมด โดยจะถูกตีความว่าเป็นดัชนีบิตแบบมีเครื่องหมาย ซึ่งใช้ในการชดเชยที่อยู่หน่วยความจำที่จะใช้สำหรับการทดสอบบิต
  2. 1 2 3 คำ สั่งBTS,BTCและBTRยอมรับLOCK(F0) เมื่อใช้กับอาร์กิวเมนต์หน่วยความจำ – ซึ่งส่งผลให้คำสั่งทำงานแบบอะตอมิก
  3. หากF3ใช้คำนำหน้ากับ0F BC /rโอเปอเรเตอร์โค้ด คำสั่งจะทำงานบนTZCNTระบบที่รองรับส่วนขยาย BMI1TZCNTแตกต่างจากBSFตรงที่TZCNTแต่ไม่ใช่BSRถูกกำหนดให้ส่งคืนขนาดของตัวถูกดำเนินการหากตัวถูกดำเนินการต้นทางเป็นศูนย์ – สำหรับค่าตัวถูกดำเนินการต้นทางอื่นๆ จะให้ผลลัพธ์เดียวกัน (ยกเว้นแฟล็ก)
  4. 1 2BSFและ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 ]
  5. หากF3ใช้คำนำหน้าพร้อมกับ0F BD /rโอเปอเรชันโค้ด คำสั่งจะทำงานLZCNTบนระบบที่รองรับส่วนขยาย ABM หรือ LZCNT ซึ่งLZCNTจะให้ผลลัพธ์ที่แตกต่างจากBSRสำหรับค่าอินพุตส่วนใหญ่
  6. 1 2สำหรับSHLDและSHRDจำนวนการเลื่อนจะถูกปิดบัง – บิต 5 บิตล่างสุดจะใช้สำหรับขนาดตัวดำเนินการ 16/32 บิต และ 6 บิตสำหรับขนาดตัวดำเนินการ 64 บิตSHLDและSHRDด้วยอาร์กิวเมนต์ 16 บิตและจำนวนการเลื่อนที่มากกว่า 16 จะให้ผลลัพธ์ที่ไม่แน่นอน (ผลลัพธ์ที่แท้จริงจะแตกต่างกันไปในซีพียู Intel ต่างๆ โดยมีพฤติกรรมที่แตกต่างกันอย่างน้อยสามแบบที่ทราบ [ 33 ] )
  7. 1 2รหัสเงื่อนไขที่รองรับสำหรับและ(รหัสปฏิบัติการและตามลำดับ โดยที่ ตัวเลข xระบุเงื่อนไข) มีดังนี้: SETccJcc near0F 9x /00F 8x
    xซีซีเงื่อนไข ( 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,POPF=0: "ไม่ใช่พาริตี" , "พาริตีคี่"
    ซีแอลเอ็นจีโอSF≠OF: "น้อยกว่า", "ไม่มากกว่าหรือเท่ากับ"
    ดีNL,GESF=OF: "ไม่น้อยกว่า" , "มากกว่าหรือเท่ากับ"
    อีเล,เอ็นจี(ZF=1 หรือ SF≠OF): "น้อยกว่าหรือเท่ากับ" , "ไม่มากกว่า"
    เอฟเอ็นแอลอี,จี(ZF=0 และ SF=OF): "ไม่น้อยกว่าหรือเท่ากับ" , "มากกว่า"
  8. สำหรับ คำสั่ง `modR/M`SETccนั้น โดยทั่วไปแล้วรหัสคำสั่งจะถูกระบุเป็น `/0` ซึ่งหมายความว่าบิตที่ 5:3 ของไบต์ ModR/M ของคำสั่งควรเป็น 000 แต่โปรเซสเซอร์ x86 รุ่นใหม่ๆ (Pentium และรุ่นต่อมา) จะไม่สนใจบิตที่ 5:3 และจะดำเนินการคำสั่งโดยไม่คำนึงถึงเนื้อหาของบิตเหล่านั้นSETcc
  9. สำหรับLFS,LGSและLSS, ขนาดของส่วนออฟเซ็ตของตัวชี้ระยะไกลจะกำหนดโดยขนาดของตัวถูกดำเนินการ – ขนาดของส่วนเซกเมนต์จะมีค่า 16 บิตเสมอ ในโหมด 64 บิต การใช้REX.Wคำนำหน้ากับคำสั่งเหล่านี้จะทำให้โหลดตัวชี้ระยะไกลด้วยออฟเซ็ต 64 บิตบนโปรเซสเซอร์ Intel แต่ไม่ใช่บนโปรเซสเซอร์ AMD
  10. 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ว่าง
  11. 1 2 3 4สำหรับการย้ายข้อมูลเข้า/ออกจากCRxและDRxขนาดของตัวดำเนินการจะมีขนาด 64 บิตเสมอในโหมด 64 บิต และ 32 บิตในกรณีอื่นๆ
  12. ในโปรเซสเซอร์ที่รองรับเพจส่วนกลาง (Pentium และรุ่นที่ใหม่กว่า) รายการในตารางเพจส่วนกลางจะไม่ถูกล้างด้วยคำMOVสั่งCR3− แต่สามารถล้างรายการเหล่านี้ได้โดยการสลับบิต CR4.PGE แทน

    ในโปรเซสเซอร์ที่รองรับPCIDการเขียนข้อมูลCR3ในขณะที่เปิดใช้งาน PCID จะทำการล้างเฉพาะรายการ TLB ที่เป็นของ PCID ที่ระบุไว้ในบิต 11:0 ของค่าที่เขียนลงไปเท่านั้นCR3การล้างเพจที่เป็นของ PCID อื่นๆ สามารถทำได้โดยการสลับบิต CR4.PGE การล้างบิต CR4.PCIDE หรือใช้INVPCIDคำสั่ง

    ในโหมด 64 บิต สามารถระงับการล้าง TLB ได้โดยการตั้งค่าบิตที่ 63 ของค่าที่เขียนลงไปCR3เป็น 1

  13. บนโปรเซสเซอร์ก่อน 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

  14. 1 2คำMOV TRxสั่งดังกล่าวถูกยกเลิกตั้งแต่ Pentium เป็นต้นไป
  15. คำINT1/ICEBP(F1) มีอยู่ในโปรเซสเซอร์ Intel x86 ที่รู้จักทั้งหมดตั้งแต่ 80386 เป็นต้นไป [ 38 ]แต่มีการจัดทำเอกสารอย่างครบถ้วนสำหรับโปรเซสเซอร์ Intel ตั้งแต่การเผยแพร่ Intel SDM (rev 067) ในเดือนพฤษภาคม 2018 เป็นต้นไป [ 39 ]ก่อนการเผยแพร่นี้ การกล่าวถึงคำสั่งในเอกสารของ Intel เป็นไปอย่างประปราย เช่น AP-526 rev 001 [ 40 ]สำหรับโปรเซสเซอร์ AMD คำสั่งนี้ได้รับการจัดทำเอกสารมาตั้งแต่ปี 2002 [ 41 ]
  16. การทำงานของF1(ICEBP) แตกต่างจากการทำงานของโอเปรนด์การขัดจังหวะซอฟต์แวร์ทั่วไปCD 01ในหลายๆ ด้าน:
      ในโหมดป้องกัน ระบบCD 01จะตรวจสอบ CPL กับฟิลด์ DPL ของตัวอธิบายการขัดจังหวะเพื่อตรวจสอบสิทธิ์การเข้าถึง ในขณะที่โหมดอื่นF1จะไม่ทำเช่นนั้น
    • ในโหมด virtual-8086 CD 01จะตรวจสอบ CPL กับ IOPL เพื่อตรวจสอบสิทธิ์การเข้าถึงด้วย ในขณะที่โหมดอื่นF1จะไม่ตรวจสอบ
    • ในโหมด virtual-8086 ที่เปิดใช้งาน VME การเปลี่ยนเส้นทางการขัดจังหวะจะได้รับการสนับสนุนสำหรับCD 01แต่ไม่ใช่F1สำหรับ
  17. คำสั่ง UMOV มีอยู่ในโปรเซสเซอร์ 386 และ 486 เท่านั้น [ 38 ]
  18. 1 2คำXBTSและIBTSถูกยกเลิกในรุ่น B1 ของ 80386 คำสั่ง เหล่านี้ถูกใช้โดยซอฟต์แวร์เป็นหลักเพื่อตรวจจับข้อบกพร่อง [ 42 ] ใน รุ่น B0 ของ 80386 Microsoft Windows (เวอร์ชัน 2.01 และใหม่กว่า) จะพยายามเรียกใช้XBTSคำสั่งเป็นส่วนหนึ่งของการตรวจจับ CPU หากCPUIDไม่มีคำสั่งนี้อยู่ และจะปฏิเสธการบูตหากXBTSพบว่าคำสั่งนี้ทำงานอยู่ [ 43 ]
  19. 1 2สำหรับXBTSและIBTSอาร์กิวเมนต์ r/m แทนข้อมูลที่จะดึง/แทรกบิตฟิลด์จาก/ไปยัง อาร์กิวเมนต์ reg แทนบิตฟิลด์ที่จะแทรก/ดึง AX/EAX แทนค่าออฟเซ็ตบิต และ CL แทนความยาวบิตฟิลด์ [ 44 ]
  20. ไม่มีเอกสาร เฉพาะ 80386 เท่านั้น [ 45 ]

เพิ่มด้วย80486

คำแนะนำรหัสปฏิบัติการคำอธิบายแหวน
BSWAP r320F C8+rการสลับลำดับไบต์ (Byte Order Swap) โดยปกติใช้เพื่อแปลงระหว่าง การแสดงข้อมูล แบบ big-endian และ little-endianสำหรับรีจิสเตอร์ 32 บิต การดำเนินการที่ทำคือ:
r = (r << 24) | ((r << 8) & 0x00FF0000) | ((r >> 8) & 0x0000FF00) | (r >> 24);

การใช้งานBSWAPร่วมกับอาร์กิวเมนต์รีจิสเตอร์ 16 บิตจะให้ผลลัพธ์ที่ไม่แน่นอน[ a ]

3
CMPXCHG r/m8,r80F B0 /r[]เปรียบเทียบและแลกเปลี่ยนถ้าค่าสะสม (AL/AX/EAX/RAX) เท่ากับค่าตัวถูกดำเนินการตัวแรก[ c ]จะEFLAGS.ZFถูกตั้งค่าเป็น 1 และค่าตัวถูกดำเนินการตัวแรกจะถูกเขียนทับด้วยค่าตัวถูกดำเนินการตัวที่สอง มิฉะนั้นEFLAGS.ZFจะถูกตั้งค่าเป็น 0 และค่าตัวถูกดำเนินการตัวแรกจะถูกคัดลอกไปยังค่าสะสม

คำสั่งนี้จะเป็นอะตอมิกก็ต่อเมื่อใช้ร่วมกับLOCKคำนำหน้า เท่านั้น

CMPXCHG r/m,r16CMPXCHG r/m,r320F B1 /r[]
XADD r/m,r80F C0 /reXchange และ ADDสลับค่าตัวถูกดำเนินการตัวแรกกับค่าตัวถูกดำเนินการตัวที่สอง จากนั้นเก็บผลรวมของค่าทั้งสองลงในค่าตัวถูกดำเนินการปลายทาง

คำสั่งนี้จะเป็นอะตอมิกก็ต่อเมื่อใช้ร่วมกับLOCKคำนำหน้า เท่านั้น

XADD r/m,r16XADD r/m,r320F C1 /r
INVLPG m80F 01 /7ยกเลิก รายการ TLBที่จะใช้สำหรับตัวดำเนินการหน่วยความจำขนาด 1 ไบต์[ d ]

คำสั่งกำลังเรียงลำดับ

0
WBINVDNFx 0F 09[ e ]เขียนกลับและล้างแคช[ f ] [ g ]เขียนบรรทัดแคชที่แก้ไขทั้งหมดในแคชภายในของโปรเซสเซอร์กลับไปยังหน่วยความจำหลักและล้างแคชภายใน
INVD0F 08ยกเลิกแคชภายใน[ f ] [ g ]ข้อมูลที่แก้ไขในแคชจะไม่ถูกเขียนกลับไปยังหน่วยความจำ ซึ่งอาจทำให้ข้อมูลสูญหายได้0 [ h ]
  1. การใช้งานBSWAPร่วมกับรีจิสเตอร์ 16 บิตไม่ได้ถูกห้ามโดยตัวมันเอง (มันจะทำงานโดยไม่ก่อให้เกิด #UD หรือข้อยกเว้นอื่นๆ) แต่มีเอกสารระบุว่าจะให้ผลลัพธ์ที่ไม่แน่นอน – มีรายงานว่าจะให้ผลลัพธ์ที่แตกต่างกันไปบน 486, [ 46 ] 586และ Bochs / QEMU [ 47 ]
  2. 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 ]
  3. ชุดCMPXCHGคำสั่งEFLAGSในลักษณะเดียวกับCMPคำสั่งที่ใช้ตัวสะสม (AL/AX/EAX/RAX) เป็นอาร์กิวเมนต์ตัวแรก
  4. INVLPGจะดำเนินการโดยไม่มีการทำงานใดๆ หากอาร์กิวเมนต์ m8 ไม่ถูกต้อง (เช่น หน้าที่ไม่ได้แมป หรือที่อยู่ที่ไม่เป็นไปตามแบบแผน)INVLPGสามารถใช้เพื่อยกเลิกรายการ TLB สำหรับแต่ละหน้าทั่วโลกได้
  5. หากF3มีการใช้คำนำหน้าพร้อมกับ0F 09รหัสคำสั่ง คำสั่งนั้นจะถูกดำเนินการบนWBNOINVDโปรเซสเซอร์ที่รองรับส่วนขยาย WBNOINVD ซึ่งจะไม่ทำให้แคชไม่ถูกต้อง
  6. 1 2 คำสั่ง `INVDand` และ `WBINVDvailable` จะทำให้แคชไลน์ทั้งหมดในแคช L1 ของ CPU เป็นโมฆะ การทำให้เนื้อหาในแคช L2/L3 เป็นโมฆะด้วยหรือไม่นั้นขึ้นอยู่`INVDand` และ `WBINVDvailable` จะไม่ขัดขวางการดึง ข้อมูลแคช ล่วงหน้าในขณะที่คำสั่งกำลังทำงานอยู่ — หากจำเป็นต้องรับประกันว่าแคชว่างเปล่า จะต้องตั้งค่า `if`CR0.CDเป็น 1 ก่อนเรียกใช้คำสั่งใดคำสั่งหนึ่งเหล่านี้ (หากแคชถูกใช้ร่วมกันระหว่างโปรเซสเซอร์เชิงตรรกะหลายตัว การทำให้แคชว่างเปล่าจำเป็นต้องให้โปรเซสเซอร์เชิงตรรกะทั้งหมดที่ใช้แคชร่วมกันCR0.CDตั้งค่าบิต `if` เป็น 1 ก่อนINVDหรือ `WBINVDvailable`)
  7. 1 2คำINVDเหล่านี้WBINVDเป็นการทำงานแบบเรียงลำดับ – ในบางโปรเซสเซอร์ คำสั่งเหล่านี้อาจบล็อกการขัดจังหวะจนกว่าจะเสร็จสมบูรณ์
  8. มีหลายกรณีที่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 โดยบังคับ

เพิ่มในโปรเซสเซอร์ระดับP5 / P6

คำสั่งเกี่ยวกับจำนวนเต็ม/ระบบ ซึ่งไม่มีอยู่ในชุดคำสั่งพื้นฐานของ 80486 แต่ถูกเพิ่มเข้ามาในโปรเซสเซอร์ x86 ต่างๆ ก่อนการเปิดตัว SSE ( ไม่รวมคำสั่งที่เลิกใช้แล้ว )

  1. เอกสาร Intel 64 รุ่นแรก ๆระบุว่าสำหรับคำ,และในโหมด 64 บิต คำสั่งเหล่านี้สามารถเข้ารหัสด้วยคำนำหน้าเพื่อให้ตีความรีจิสเตอร์ RCX เป็นดัชนี MSR/PMC 64 บิตเต็ม [ 52 ] สิ่งนี้ถูก ลบออกจากเอกสาร Intel 64 รุ่นหลังๆ (SDM rev 023 [ 53 ] และรุ่นต่อ มา ) ซึ่งระบุว่าคำสั่งเหล่านี้จะละเว้น 32 บิตบนสุดของ RCX เสมอโดยไม่คำนึงถึงคำนำหน้า REX ใดๆRDMSRWRMSRRDPMCREX.W

    ในโปรเซสเซอร์ x86-64 ที่รู้จักทั้งหมด คำสั่งเหล่านี้จะยอมรับแต่จะไม่สนใจคำนำหน้า REX และจะไม่สนใจ 32 บิตบนสุดของ RCX

  2. 1 2 3ในโหมด 64 บิต คำสั่ง ,RDMSRและRDTSCจะRDPMCตั้งค่า 32 บิตบนสุดของ RDX และ RAX ให้เป็นศูนย์
  3. 1 2สำหรับชุด CPU/MSR บางชุดRDMSRและWRMSRอาจใช้รีจิสเตอร์อื่นนอกเหนือจาก ECX และ EDX:EAX ตัวอย่างที่ทราบกันดี ได้แก่ การใช้ EDI [ 54 ] [ 55 ]และ ESI [ 56 ]สำหรับรหัสผ่าน และ EBX [ 57 ]สำหรับที่อยู่หน่วยความจำทางกายภาพ
  4. การอ่าน MSR ที่ทำด้วยRDMSRand สามารถ จัดลำดับใหม่ได้RDMSRLISTโดยทั่วไปเมื่อเทียบกับคำสั่งอื่นๆ รวมถึงการอ่าน MSR อื่นๆ — โดยมีข้อจำกัดดังต่อไปนี้: [ 58 ] [ 59 ]
    • การเข้าถึง MSR ไม่สามารถจัดลำดับใหม่ได้ระหว่างคำสั่งการจัดลำดับ (เช่นCPUID, IRET) หรือคำสั่งการจัดลำดับการส่ง (เช่นLFENCE)
    • การอ่าน MSR จากIA32_BARRIERMSR (MSR 2Fhซึ่งถูกนำมาใช้ในส่วนขยายชุดคำสั่ง MSRLIST) ไม่สามารถจัดลำดับใหม่ได้ระหว่างการอ่าน MSR อื่นๆ
    • การเข้าถึง MSR ของ x2APICไม่สามารถจัดลำดับใหม่ได้เมื่อเทียบกับการเข้าถึง MSR อื่นๆ
  5. บนซีพียู Intel, AMD และ VIAWRMSRคำสั่งนี้ยังใช้เพื่ออัปเดตไมโครโค้ดของซีพียู ด้วย โดยจะทำโดยการเขียนที่อยู่เสมือนของไมโครโค้ดใหม่เพื่ออัปโหลดไปยัง MSRซีพียู79hIntel และ VIA [ 61 ] และ MSR C001_0020h[ 62 ]บนซีพียู AMD
  6. การเขียนไปยัง 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; MSR 830h) ของ x2APIC จะใช้ในการสร้าง IPI ( Inter-processor interrupt ) บนซีพียู Intel [ 66 ]แต่ไม่ใช่ AMD [ 67 ]โดย IPI ดังกล่าวสามารถจัดลำดับใหม่ได้ก่อนการจัดเก็บหน่วยความจำแบบเก่า
  7. โหมดการจัดการระบบและRSMคำสั่งต่างๆ มีให้ใช้งานใน Intel 486 รุ่นที่ไม่ใช่ SL เท่านั้น หลังจากที่ Intel Pentium เปิดตัวครั้งแรกในปี 1993
  8. ในโปรเซสเซอร์ 32 บิตรุ่นเก่าบางตัว การดำเนินการCPUIDด้วยดัชนีใบ (EAX) ที่มากกว่า 0 อาจทำให้ EBX และ ECX ไม่เปลี่ยนแปลง โดยคงค่าเดิมไว้ ด้วยเหตุนี้ จึงแนะนำให้ตั้งค่า EBX และ ECX เป็นศูนย์ก่อนดำเนินการCPUIDโปรเซสเซอร์ที่พบว่ามีพฤติกรรมนี้ ได้แก่ Cyrix MII [ 72 ]และ IDT WinChip 2 [ 73 ]ในโหมด 64 บิตCPUIDจะตั้งค่า 32 บิตบนสุดของ RAX, RBX, RCX และ RDX เป็นศูนย์
  9. ในโปรเซสเซอร์ Intel บางรุ่นตั้งแต่ Ivy Bridge เป็นต้นไป มี MSR ที่สามารถใช้เพื่อจำกัดCPUIDให้อยู่ใน ring 0 ได้ MSR ดังกล่าวได้รับการบันทึกไว้อย่างน้อยสำหรับ Ivy Bridge [ 74 ]และ Denverton [ 75 ]ความสามารถในการจำกัดให้อยู่CPUIDใน ring 0 ยังมีอยู่ในโปรเซสเซอร์ AMD ที่รองรับคุณสมบัติ "CpuidUserDis" ( Zen 4 "Raphael" และรุ่นต่อมา) [ 76 ]
  10. 1 2CPUIDยังมีให้ใช้งานในโปรเซสเซอร์ Intel และ AMD 486 บางรุ่นที่วางจำหน่ายหลังจาก Intel Pentium รุ่นแรกวางจำหน่าย
  11. บนซีพียู Cyrix 5x86 และ 6x86 ฟังก์ชันนี้CPUIDไม่ได้เปิดใช้งานโดยค่าเริ่มต้น และต้องเปิดใช้งานผ่านรีจิสเตอร์การกำหนดค่าของ Cyrix
  12. บนซีพียู NexGenCPUIDรองรับเฉพาะ BIOS ของระบบบางตัวเท่านั้น บนซีพียู NexGen บางตัวที่รองรับCPUIDEFLAGS.ID ไม่ได้รับการสนับสนุน แต่ EFLAGS.AC ได้รับการสนับสนุน ทำให้การตรวจจับซีพียูซับซ้อนขึ้น [ 77 ]
  13. แตกต่างจาก คำสั่งเดิมคำสั่งนี้ไม่ได้แก้ไข บิต EFLAGS ใดๆ นอกเหนือจาก ZFCMPXCHGCMPXCHG8B
  14. การใช้ ↑LOCK CMPXCHG8Bกับตัวดำเนินการรีจิสเตอร์ (ซึ่งเป็นการเข้ารหัสที่ไม่ถูกต้อง) จะ ทำให้ เครื่องค้างแทนที่จะแสดงข้อผิดพลาด #UD ตามที่คาดไว้ซีพียู Intel Pentium บางรุ่น ซึ่งเป็นที่รู้จักกันในชื่อบั๊ก Pentium F00F
  15. 1 2 3บนโปรเซสเซอร์ IDT WinChip, Transmeta Crusoe และ Rise mP6CMPXCHG8Bคำสั่งนี้ได้รับการสนับสนุนเสมอ อย่างไรก็ตาม บิต CPUID อาจหายไป นี่เป็นวิธีแก้ปัญหาสำหรับข้อบกพร่องใน Windows NT [ 78 ]
  16. 1 2คำRDTSCและRDPMCไม่ได้เรียงลำดับตามคำสั่งอื่น และอาจสุ่มตัวอย่างตัวนับที่เกี่ยวข้องก่อนที่คำสั่งก่อนหน้าจะถูกดำเนินการหรือหลังจากที่คำสั่งถัดไปถูกดำเนินการ การเรียกใช้RDPMC(แต่ไม่ใช่RDTSC) อาจถูกจัดลำดับใหม่สัมพันธ์กันแม้กระทั่งสำหรับการอ่านตัวนับเดียวกันเพื่อกำหนดลำดับตามคำสั่งอื่นจำเป็นต้องLFENCEคำสั่งเรียงลำดับ (เช่น ) [ 79 ]CPUID
  17. บนโปรเซสเซอร์ 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 นี้อาจล้มเหลว232{\displaystyle 2^{32}}หรือค่าที่มากกว่านั้นจะทำให้ค่าที่เขียนถูกดำเนินการ 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

  18. การนำระบบ 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])
    บนโปรเซสเซอร์ Intel ทาง Intel รับประกันว่าตัวนับเวลาจะไม่วนกลับภายใน 10 ปีหลังจากรีเซ็ต[ 85 ]
  19. RDTSCสามารถรันนอก Ring 0 ได้เฉพาะในกรณีที่CR4.TSD=0.บน Intel Pentium และ AMD K5/K6RDTSCไม่สามารถรันในโหมด Virtual-8086 ได้ [ 86 ] [ 87 ]โปรเซสเซอร์รุ่นหลังๆ (Pentium Pro, Athlon 64) ได้ลบข้อจำกัดนี้ออกไป
  20. RDPMCสามารถรันนอก Ring 0 ได้ก็ต่อเมื่อCR4.PCE=1.
  21. คำสั่ง นี้RDPMCไม่มีอยู่ในโปรเซสเซอร์ VIA รุ่นก่อน Nano
  22. รหัสเงื่อนไขที่รองรับสำหรับคำสั่ง (opcodeโดยที่ x nibble ระบุเงื่อนไข) มีดังนี้: CMOVcc0F 4x /r
    xซีซีเงื่อนไข ( 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,POPF=0: "ไม่ใช่พาริตี" , "พาริตีคี่"
    ซีแอลเอ็นจีโอSF≠OF: "น้อยกว่า", "ไม่มากกว่าหรือเท่ากับ"
    ดีNL,GESF=OF: "ไม่น้อยกว่า" , "มากกว่าหรือเท่ากับ"
    อีเล,เอ็นจี(ZF=1 หรือ SF≠OF): "น้อยกว่าหรือเท่ากับ" , "ไม่มากกว่า"
    เอฟเอ็นแอลอี,จี(ZF=0 และ SF=OF): "ไม่น้อยกว่าหรือเท่ากับ" , "มากกว่า"
  23. ในโหมด 64 บิตCMOVccหากใช้ขนาดตัวถูกดำเนินการ 32 บิต จะล้าง 32 บิตบนสุดของรีจิสเตอร์ปลายทาง แม้ว่าเงื่อนไขจะเป็นเท็จก็ตามสำหรับCMOVccการใช้ตัวถูกดำเนินการจากหน่วยความจำ ซีพียูจะอ่านตัวถูกดำเนินการจากหน่วยความจำเสมอ ซึ่งอาจทำให้เกิดข้อผิดพลาดเกี่ยวกับหน่วยความจำและการเติมแคชไลน์ แม้ว่าเงื่อนไขสำหรับการย้ายข้อมูลจะไม่เป็นไปตามที่กำหนดก็ตาม (ส่วนขยาย Intel APXกำหนดชุดของตัวแปรที่เข้ารหัส EVEXCMOVcc ใหม่ ที่จะระงับข้อผิดพลาดเกี่ยวกับหน่วยความจำหากเงื่อนไขเป็นเท็จ)
  24. ในตัวแปร VIA C3 ก่อนเนหะมีย์ ("ซามูเอล"/"เอซรา")มีรายงานว่ามีคำแนะนำอยู่reg,regแต่ไม่ได้reg,[mem]ระบุรูปแบบ [ 88 ]CMOVcc
  25. การเข้ารหัสไบต์ที่ Intel แนะนำสำหรับ NOP หลายไบต์ที่มีความยาว 2 ถึง 9 ไบต์ในโหมด 32/64 บิตคือ (ในรูปแบบเลขฐานสิบหก): [ 89 ]
    ความยาวลำดับไบต์
    266 90
    30F 1F 00
    40F 1F 40 00
    50F 1F 44 00 00
    666 0F 1F 44 00 00
    70F 1F 80 00 00 00 00
    80F 1F 84 00 00 00 00 00
    966 0F 1F 84 00 00 00 00 00
    ในกรณีที่มีความจำเป็นต้องใช้พื้นที่เติม NOP มากกว่า 9 ไบต์ แนะนำให้ใช้ NOP หลายตัว
  26. แตกต่างจากคำสั่งอื่นๆ ที่เพิ่มเข้ามาใน 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 ]

  27. 0F 1F /0เนื่องจาก long-NOP ถูกนำมาใช้ใน Pentium Pro แต่ยังคงไม่มีเอกสารจนกระทั่งปี 2006 [ 92 ]0F 18..1Fช่วงรหัสคำสั่ง ทั้งหมดNOPใน Pentium Pro อย่างไรก็ตาม ยกเว้น0F 1F /0Intel ไม่รับประกันว่ารหัสคำสั่งเหล่านี้จะยังคงอยู่NOPในโปรเซสเซอร์ในอนาคต และได้กำหนดรหัสคำสั่งบางส่วนเหล่านี้ให้กับคำสั่งอื่นในโปรเซสเซอร์อย่างน้อยบางตัว [ 93 ] [ 94 ]
  28. มีเอกสารสำหรับ AMD x86-64 ตั้งแต่ปี 2002 [ 95 ]
  29. แม้ว่า0F 0Bรหัสปฏิบัติการจะถูกสงวนไว้อย่างเป็นทางการให้เป็นรหัสปฏิบัติการที่ไม่ถูกต้องตั้งแต่ Pentium เป็นต้นไป แต่รหัสปฏิบัติการนี้ได้รับการกำหนดชื่อย่อUD2ตั้งแต่ Pentium Proเป็นต้นไป เท่านั้น [ 97 ]
  30. 1 2 GNU Binutilsใช้UD2AและUD2Bสำหรับ0F 0Bและ0F B9ตั้งแต่เวอร์ชัน 2.7 [ 98 ]เดิมทีทั้งUD2Aและไม่UD2Bได้รองรับอาร์กิวเมนต์ใดๆ -UD2Bต่อมาได้รับการแก้ไขให้ยอมรับ ไบต์ ModR/Mใน Binutils เวอร์ชัน 2.30 [ 99 ]
  31. คำUD2(0F 0B) จะหยุดการถอดรหัสไบต์ถัดไปเป็นคำสั่งเพิ่มเติม แม้กระทั่งการคาดเดา ด้วยเหตุนี้ หากคำสั่งกระโดดแบบอ้อมตามด้วยสิ่งที่ไม่ใช่โค้ด ขอแนะนำให้วางUD2คำสั่งไว้หลังคำสั่งกระโดดแบบอ้อม [ 100 ]
  32. 1 2โอเปรนด์ UD0/1/2 -0F 0B,0F B9และ0F FF- จะทำให้เกิดข้อยกเว้น #UD บนโปรเซสเซอร์ x86 ทั้งหมดตั้งแต่ 80186เป็นต้นไป (ยกเว้น โปรเซสเซอร์ NEC V-series ) แต่ไม่ได้ถูกสงวนไว้สำหรับวัตถุประสงค์นี้โดยเฉพาะจนกระทั่งโปรเซสเซอร์ระดับ P5
  33. แม้ว่า0F B9รหัสคำสั่งจะถูกสงวนไว้อย่างเป็นทางการให้เป็นรหัสคำสั่งที่ไม่ถูกต้องตั้งแต่ Pentium เป็นต้นไป แต่ก็ได้รับการกำหนดชื่อย่อUD1ในภายหลัง – AMD APM เริ่มแสดงรายการUD1ในแผนที่รหัสคำสั่งตั้งแต่เวอร์ชัน 3.17 เป็นต้นไป [ 102 ]ในขณะที่ Intel SDM เริ่มแสดงรายการตั้งแต่เวอร์ชัน 061 เป็นต้นไป [ 103 ]
  34. 1 2สำหรับทั้ง opcode0F B9และ0F FFopcode การใช้งาน x86 ที่แตกต่างกันนั้นทราบกันดีว่ามีความแตกต่างกันในเรื่องที่ว่า opcode ยอมรับไบต์ ModR/M หรือไม่ [ 104 ] [ 105 ] [ 106 ]
  35. สำหรับ0F FFโอเปอเรเตอร์โค้ดOIOCyrix เป็นผู้แนะนำตัวย่อ [ 107 ]ในขณะที่UD0AMD และ Intel แนะนำตัวย่อ (โดยไม่มีอาร์กิวเมนต์) ในเวลาเดียวกันกับUD1ตัวย่อสำหรับ0F B9[ 102 ] [ 103 ]ต่อมาเอกสารของ Intel (แต่ไม่ใช่ AMD) ได้แก้ไขคำอธิบายของเพื่อเพิ่ม ไบต์ ModR/Mและรับอาร์กิวเมนต์สองตัว[ 108 ]UD0
  36. 1 2 3 4คำSYSRET,SYSENTERและSYSEXITไม่สามารถใช้งานได้ในโหมด Realอย่างไรก็ตามSYSENTERสามารถใช้งานได้ในโหมด Virtual 8086

    ในโปรเซสเซอร์ AMD SYSCALLคำสั่งนี้สามารถใช้งานได้ในโหมดการทำงานทั้งหมด รวมถึงโหมด Real Mode ด้วย

    หากเปิดใช้งาน FRED (Flexible Return and Event Delivery) จะไม่สามารถดูคำแนะนำSYSRETต่างๆ ได้SYSEXIT

  37. บน K6SYSCALL/SYSRETมีให้ใช้งานในรุ่น 7 (250nm "Little Foot") และรุ่นต่อมา แต่ไม่มีในรุ่น 6 รุ่นก่อนหน้า [ 110 ]
  38. SYSCALLและSYSRETถูกรวมเข้าเป็นส่วนหนึ่งของ x86-64 อย่างสมบูรณ์ – ส่งผลให้คำสั่งเหล่านี้สามารถใช้งานได้ในโหมด 64 บิตบนโปรเซสเซอร์ x86-64 ทั้งหมดจาก AMD, Intel, VIA และ Zhaoxinส่วนในโหมดอื่นนอกเหนือจาก 64 บิต คำสั่งเหล่านี้จะใช้งานได้เฉพาะบนโปรเซสเซอร์ AMD เท่านั้น
  39. ความหมายที่แท้จริงของSYSRETแตกต่างกันเล็กน้อยระหว่างโปรเซสเซอร์ AMD และ Intel: ที่อยู่ส่งคืนที่ไม่เป็นไปตามแบบแผนทำให้เกิดข้อยกเว้น #GP ใน Ring 3 บน CPU AMD แต่ใน Ring 0 บน CPU Intel ซึ่งเป็นที่ทราบกันดีว่าก่อให้เกิดปัญหาด้านความปลอดภัย [ 111 ]
  40. 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

  41. ธงCPUIDที่บ่งชี้การสนับสนุนสำหรับSYSENTER/SYSEXITถูกตั้งค่าไว้ใน Pentium Pro แม้ว่าโปรเซสเซอร์จะไม่รองรับคำสั่งเหล่านี้อย่างเป็นทางการก็ตาม [ 113 ]การทดสอบจากบุคคลที่สามระบุว่ารหัสคำสั่งมีอยู่ใน Pentium Pro แต่มีข้อบกพร่องมากเกินไปจนใช้งานไม่ได้ [ 114 ]
  42. บนซีพียู AMDSYSENTERและSYSEXITจะไม่สามารถใช้งานได้ในโหมด x86-64 แบบยาว (#UD)
  43. บนซีพียู TransmetaSYSENTERและSYSEXITจะใช้งานได้เฉพาะกับซอฟต์แวร์ Transmeta Code Morphing เวอร์ชัน 4.2 หรือสูงกว่าเท่านั้น [ 116 ]
  44. ในเนเฮมิยาห์SYSENTERและSYSEXITมีให้ใช้เฉพาะในขั้นตอนที่ 8 และหลังจากนั้น [ 117 ]

เพิ่มเป็นส่วนขยายชุดคำสั่ง

เพิ่มด้วยx86-64

คำสั่งเหล่านี้สามารถเข้ารหัสได้เฉพาะในโหมด 64 บิตเท่านั้น โดยแบ่งออกเป็นสี่กลุ่ม:

  • คำสั่งดั้งเดิมที่นำรหัสปฏิบัติการที่มีอยู่มาใช้ซ้ำเพื่อวัตถุประสงค์ที่แตกต่างกัน ( MOVSXDแทนที่ARPL)
  • คำสั่งเดิมพร้อมรหัสคำสั่งใหม่ ( SWAPGS)
  • คำสั่งที่มีอยู่ได้รับการขยายให้มีขนาดแอดเดรส 64 บิต ( JRCXZ)
  • คำสั่งที่มีอยู่ได้รับการขยายให้มีขนาดตัวดำเนินการ 64 บิต (คำสั่งที่เหลือ)

คำสั่งส่วนใหญ่ที่มีขนาดตัวถูกดำเนินการ 64 บิตจะเข้ารหัสโดยใช้REX.Wคำนำหน้า หากไม่มีREX.Wคำนำหน้า คำสั่งที่สอดคล้องกันซึ่งมีขนาดตัวถูกดำเนินการ 32 บิตจะถูกเข้ารหัส กลไกนี้ยังใช้กับคำสั่งอื่นๆ ส่วนใหญ่ที่มีขนาดตัวถูกดำเนินการ 32 บิตด้วย คำสั่งเหล่านั้นไม่ได้ระบุไว้ในที่นี้ เนื่องจากคำสั่งเหล่านั้นไม่มีตัวย่อใหม่ในไวยากรณ์ของ Intel เมื่อใช้กับขนาดตัวถูกดำเนินการ 64 บิต

คำแนะนำการเข้ารหัสความหมายแหวน
CDQEREX.W 98ขยายสัญญาณ EAX ไปยัง RAX3
CQOREX.W 99ป้ายขยาย RAX เป็น RDX:RAX
CMPSQREX.W A7เปรียบเทียบสตริงควอดเวิร์ด
CMPXCHG16B m128[] []REX.W 0F C7 /1เปรียบเทียบและแลกเปลี่ยน 16 ไบต์ ใช้งานแบบอะตอมิกได้เฉพาะเมื่อใช้ร่วมกับคำนำหน้า LOCK เท่านั้น
IRETQREX.W CF64 บิต คืนค่าจากการขัดจังหวะ
JRCXZ rel8E3 cbกระโดดหาก RCX เป็นศูนย์
LODSQREX.W ADโหลดสตริงควอดเวิร์ด
MOVSXD r64,r/m32REX.W 63 /r[]การแปลงคำสั่ง MOV พร้อมขยายเครื่องหมายจาก 32 บิตเป็น 64 บิต
MOVSQREX.W A5ย้ายสตริงควอดเวิร์ด
POPFQ9Dทะเบียน POP RFLAGS
PUSHFQ9Cลงทะเบียน PUSH RFLAGS
SCASQREX.W AFสตริง SCAn ควอดเวิร์ด
STOSQREX.W ABSTOre String Quadword
SWAPGS0F 01 F8แลกเปลี่ยนฐาน GS กับ KernelGSBase MSR0
UDBD6คำสั่งที่ไม่นิยาม — จะทำให้เกิด ข้อยกเว้น รหัสคำสั่งไม่ถูกต้อง (#UD) ในโหมด 64 บิต[ d ](3)
  1. ตัวดำเนินการหน่วยความจำCMPXCHG16Bต้องจัดเรียงให้ตรงกับ 16 ไบต์
  2. คำสั่ง นี้CMPXCHG16Bไม่มีอยู่ในโปรเซสเซอร์ Intel/AMD x86-64 รุ่นแรกๆ บางรุ่น ในโปรเซสเซอร์ Intel คำสั่งนี้ไม่มีอยู่ใน Xeon "Nocona"รุ่น D [ 118 ]แต่ถูกเพิ่มเข้ามาในรุ่น E [ 119 ]ใน โปรเซสเซอร์ตระกูล AMD K8คำสั่งนี้ถูกเพิ่มเข้ามาในรุ่น F พร้อมกับการเปิดตัวการสนับสนุน DDR2 [ 120 ]ด้วยเหตุนี้ จึงCMPXCHG16Bมีแฟล็ก CPUID ของตัวเองแยกต่างหากจากส่วนที่เหลือของ x86-64
  3. การเข้ารหัสที่MOVSXDไม่มีคำนำหน้า REX.W ได้รับอนุญาตแต่ไม่แนะนำ [ 121 ] – การเข้ารหัสดังกล่าวทำงานเหมือนกับ 16/32 บิตMOV(8B /r)
  4. รหัส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 – นอกเหนือจากนั้น คำสั่งการจัดการบิตสามารถใช้งานได้ในทุกโหมดการทำงานบนซีพียูที่รองรับ

ส่วนขยายการจัดการบิตตัวช่วยจำคำแนะนำรหัสปฏิบัติการคำอธิบายคำแนะนำเพิ่มใน
ABM (LZCNT) [ a ]
การจัดการบิตขั้นสูง
POPCNT r16,r/m16POPCNT r32,r/m32F3 0F B8 /rจำนวนประชากรนับจำนวนบิตที่มีค่าเป็น 1 ในอาร์กิวเมนต์ต้นทางK10 , บ็อบแคท , ฮาสเวลล์ , จางเจียง , เกรซมอนต์
POPCNT r64,r/m64F3 REX.W 0F B8 /r
LZCNT r16,r/m16LZCNT r32,r/m32F3 0F BD /rนับเลขศูนย์นำหน้า[ b ]ถ้าตัวถูกดำเนินการต้นทางเป็นศูนย์ทั้งหมดLZCNTจะส่งคืนขนาดตัวถูกดำเนินการเป็นบิต (16/32/64) และตั้งค่า CF=1
LZCNT r64,r/m64F3 REX.W 0F BD /r
ดัชนีมวลกาย1
ชุดคำสั่งการจัดการบิต 1
TZCNT r16,r/m16TZCNT r32,r/m32F3 0F BC /rนับจำนวนศูนย์ต่อท้าย[ c ]หากตัวถูกดำเนินการต้นทางเป็นศูนย์ทั้งหมด ระบบTZCNTจะส่งคืนขนาดตัวถูกดำเนินการเป็นบิต (16/32/64) และตั้งค่า CF=1แฮสเวลล์ , ไพล์ไดรเวอร์ , จา กัวร์, จางเจียง,เกรซมอนต์
TZCNT r64,r/m64F3 REX.W 0F BC /r
ANDN ra,rb,r/mVEX.LZ.0F38 F2 /rการดำเนินการ AND-NOT แบบบิตไวส์:ra = r/m AND NOT(rb)
BEXTR ra,r/m,rbVEX.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/mVEX.LZ.0F38 F3 /3ดึงค่าบิตต่ำสุดในอาร์กิวเมนต์ต้นทาง ส่งคืนค่า 0 หากอาร์กิวเมนต์ต้นทางเป็น 0 เทียบเท่ากับdst = (-src) AND src
BLSMSK reg,r/mVEX.LZ.0F38 F3 /2สร้างบิตมาสก์ที่มีค่าเป็น 1 ทั้งหมด ตั้งแต่บิตแรกจนถึงตำแหน่งบิตต่ำสุดที่มีค่าเป็น 1 ในอาร์กิวเมนต์ต้นทาง ส่งคืนค่า 1 ทั้งหมดหากอาร์กิวเมนต์ต้นทางเป็น 0 เทียบเท่ากับdst = (src-1) XOR src
BLSR reg,r/mVEX.LZ.0F38 F3 /1คัดลอกบิตทั้งหมดของอาร์กิวเมนต์ต้นทาง จากนั้นล้างบิตที่ตั้งค่าไว้ต่ำสุด เทียบเท่ากับdst = (src-1) AND src
บีเอ็มไอ2
ชุดคำสั่งการจัดการบิต 2
BZHI ra,r/m,rbVEX.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/mVEX.LZ.F2.0F38 F6 /rการขยายการคูณจำนวนเต็มที่ไม่มีเครื่องหมายโดยไม่ต้องตั้งค่าแฟล็ก คูณ EDX/RDX ด้วยr/mจากนั้นเก็บครึ่งล่างของผลลัพธ์การคูณไว้ในraและครึ่งบนไว้ในrbหากraและrbระบุรีจิสเตอร์เดียวกัน จะเก็บเฉพาะครึ่งบนของผลลัพธ์เท่านั้น
PDEP ra,rb,r/mVEX.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/mVEX.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,imm8VEX.LZ.F2.0F3A F0 /r ibหมุนไปทางขวาทันทีโดยไม่กระทบกับธง
SARX ra,r/m,rbVEX.LZ.F3.0F38 F7 /rการเลื่อนบิตเลขคณิตไปทางขวาโดยไม่ปรับปรุงแฟล็กสำหรับSARX, SHRXและSHLX, จำนวนการเลื่อนที่ระบุในrbจะถูกมาสก์ไว้ที่ 5 บิตสำหรับขนาดตัวถูกดำเนินการ 32 บิต และ 6 บิตสำหรับขนาดตัวถูกดำเนินการ 64 บิต
SHRX ra,r/m,rbVEX.LZ.F2.0F38 F7 /rเลื่อนไปทางขวาแบบตรรกะโดยไม่ปรับปรุงค่าสถานะ
SHLX ra,r/m,rbVEX.LZ.66.0F38 F7 /rเลื่อนไปทางซ้ายโดยไม่เปลี่ยนแปลงสถานะ
  1. บนซีพียู AMD ส่วนขยาย "ABM" ให้ทั้งPOPCNTและLZCNTในขณะที่ซีพียู Intel บิต CPUID สำหรับ "ABM" นั้นระบุไว้เพียงเพื่อบ่งชี้การมีอยู่ของLZCNTคำสั่ง และแสดงเป็น "LZCNT" ในขณะที่POPCNTมีบิตคุณลักษณะ CPUID แยกต่างหากอย่างไรก็ตาม โปรเซสเซอร์ที่รู้จักทั้งหมดที่ใช้งานส่วนขยาย "ABM"/"LZCNT" ก็ใช้งานPOPCNTและตั้งค่าบิตคุณลักษณะ CPUID สำหรับ POPCNT ด้วย ดังนั้นความแตกต่างจึงเป็นเพียงทฤษฎีเท่านั้น(ในทางกลับกันนั้นไม่เป็นความจริง – มีโปรเซสเซอร์ที่รองรับPOPCNTแต่ไม่รองรับ ABM เช่น Intel Nehalemและ VIA Nano 3000)
  2. คำสั่ง นี้LZCNTจะทำงานBSRบนระบบที่ไม่รองรับส่วนขยาย LZCNT หรือ ABM โดยBSRจะคำนวณดัชนีของบิตที่ตั้งค่าสูงสุดในตัวถูกดำเนินการต้นทาง ซึ่งจะให้ผลลัพธ์ที่แตกต่างจากLZCNTสำหรับค่าอินพุตส่วนใหญ่
  3. คำสั่ง นี้TZCNTจะทำงานBSFบนระบบที่ไม่รองรับส่วนขยาย BMI1 โดยBSFจะให้ผลลัพธ์เหมือนกันTZCNTสำหรับค่าตัวถูกดำเนินการทั้งหมด ยกเว้นศูนย์ ซึ่งTZCNTจะคืนค่าขนาดของตัวถูกดำเนินการ แต่BSFจะทำให้เกิดพฤติกรรมที่ไม่แน่นอน (โดยที่ปลายทางจะไม่เปลี่ยนแปลงบนซีพียูรุ่นใหม่ส่วนใหญ่)
  4. สำหรับBEXTRตำแหน่งเริ่มต้นและความยาวจะไม่ถูกปิดบัง และสามารถรับค่าได้ตั้งแต่ 0 ถึง 255 หากบิตที่เลือกขยายเกินกว่าส่วนท้ายของr/mอาร์กิวเมนต์ (ซึ่งมีขนาดตัวดำเนินการ 32/64 บิตตามปกติ) บิตที่อยู่นอกขอบเขตจะถูกอ่านออกมาเป็น 0
  5. บนโปรเซสเซอร์ AMD ก่อน Zen 3PEXTและPDEPค่อนข้างช้า [ 123 ]และแสดงให้เห็นถึงจังหวะเวลาที่ขึ้นอยู่กับข้อมูลเนื่องจากการใช้การใช้งานไมโครโค้ด (ประมาณ 18 ถึง 300 รอบ ขึ้นอยู่กับจำนวนบิตที่ตั้งค่าในอาร์กิวเมนต์มาสก์) ส่งผลให้การใช้ลำดับคำสั่งอื่นบนโปรเซสเซอร์เหล่านี้มักจะเร็วกว่า [ 124 ] [ 125 ]

เพิ่มด้วย Intel TSX

ชุดย่อย TSXคำแนะนำรหัสปฏิบัติการคำอธิบายเพิ่มใน
อาร์ทีเอ็ม
หน่วยความจำธุรกรรมแบบจำกัด
XBEGIN rel16XBEGIN rel32C7 F8 cwC7 F8 cdเริ่มการทำธุรกรรม หากการทำธุรกรรมล้มเหลว ให้ทำการกระโดดไปยังออฟเซ็ตสัมพัทธ์ที่กำหนดHaswell (เลิกใช้แล้วในซีพียูเดสก์ท็อป/แล็ปท็อปตั้งแต่รุ่นที่ 10 ขึ้นไป ( Ice Lake , Comet Lake ) แต่ยังคงมีจำหน่ายใน ชิ้นส่วนเซิร์ฟเวอร์แบรนด์ Xeon (เช่นIce Lake-SP , Sapphire Rapids ))
XABORT imm8C6 F8 ibยกเลิกธุรกรรมโดยใช้ค่าคงที่ 8 บิตเป็นรหัสข้อผิดพลาด
XENDNP 0F 01 D5สิ้นสุดการทำธุรกรรม
XTESTNP 0F 01 D6ตรวจสอบว่าอยู่ในระหว่างการดำเนินการแบบธุรกรรมหรือไม่ ตั้งค่าEFLAGS.ZFเป็น 0 หากดำเนินการภายในธุรกรรม (RTM หรือ HLE) และตั้งค่าเป็น 1 ในกรณีอื่น ๆ
เอชแอลอี
ฮาร์ดแวร์ล็อค Elision
XACQUIREF2คำนำหน้าคำสั่งเพื่อระบุจุดเริ่มต้นของการละเว้นการล็อกฮาร์ดแวร์ ใช้เฉพาะกับคำสั่งอะตอมิกหน่วยความจำเท่านั้น (สำหรับคำสั่งอื่นๆF2คำนำหน้าอาจมีความหมายอื่น) เมื่อใช้กับคำสั่งดังกล่าว อาจเริ่มต้นธุรกรรมแทนที่จะดำเนินการอะตอมิกหน่วยความจำHaswell (เลิกผลิตแล้ว – โปรเซสเซอร์รุ่นสุดท้ายที่รองรับ HLE คือCoffee LakeและCascade Lake )
XRELEASEF3คำนำหน้าคำสั่งเพื่อระบุจุดสิ้นสุดของการละเว้นการล็อกฮาร์ดแวร์ ใช้เฉพาะกับคำสั่งอะตอมิก/จัดเก็บข้อมูลในหน่วยความจำเท่านั้น (สำหรับคำสั่งอื่นๆF3คำนำหน้าอาจมีความหมายอื่น) เมื่อใช้กับคำสั่งดังกล่าวในระหว่างการละเว้นการล็อกฮาร์ดแวร์ จะเป็นการยุติธุรกรรมที่เกี่ยวข้องแทนที่จะดำเนินการจัดเก็บ/อะตอมิก
TSXLDTRK
โหลดการติดตามที่อยู่ ระงับ/ดำเนินการต่อ
XSUSLDTRKF2 0F 01 E8ระงับการติดตามที่อยู่โหลดแซฟไฟร์ แรพิดส์
XRESLDTRKF2 0F 01 E9การติดตามประวัติการโหลดที่อยู่

เพิ่มด้วยIntel CET

เทคโนโลยี Intel CET (Control-Flow Enforcement Technology) เพิ่มคุณสมบัติที่แตกต่างกันสองประการเพื่อช่วยป้องกันการโจมตีทางด้านความปลอดภัย เช่นการเขียนโปรแกรมแบบ return-oriented programming ได้แก่ shadow stack (CET_SS) และindirect branch tracking (CET_IBT)

ชุดย่อย CETคำแนะนำรหัสปฏิบัติการคำอธิบายแหวนเพิ่มใน
ซีที_เอสเอส
สแต็กเงา (Shadow stack ) เมื่อเปิดใช้งานสแต็กเงา ที่อยู่ส่งคืนจะถูกผลักลงในทั้งสแต็กปกติและสแต็กเงาเมื่อมีการเรียกฟังก์ชัน จากนั้นที่อยู่ส่งคืนทั้งสองจะถูกดึงออกเมื่อฟังก์ชันส่งค่ากลับ หากที่อยู่ส่งคืนไม่ตรงกัน จะถือว่าสแต็กเสียหาย และจะเกิดข้อยกเว้น #CP ขึ้นนอกจากนี้ สแต็กเงายังต้องถูกจัดเก็บไว้ในหน้าหน่วยความจำที่ทำเครื่องหมายไว้เป็นพิเศษ ซึ่งไม่สามารถแก้ไขได้โดยคำสั่งจัดเก็บหน่วยความจำปกติ
INCSSPD r32F3 0F AE /5เพิ่มค่าตัวชี้สแต็กเงา3ไทเกอร์เลค , เซน 3
INCSSPQ r64F3 REX.W 0F AE /5
RDSSPD r32F3 0F 1E /1อ่านค่าตัวชี้สแต็กเงาลงในรีจิสเตอร์ (32 บิตล่าง) [ a ]
RDSSPQ r64F3 REX.W 0F 1E /1อ่านค่าตัวชี้สแต็กเงาลงในรีจิสเตอร์ (64 บิตเต็ม) [ a ]
SAVEPREVSSPF3 0F 01 EAบันทึกตัวชี้สแต็กเงาก่อนหน้า
RSTORSSP m64F3 0F 01 /5กู้คืนตัวชี้สแต็กเงาที่บันทึกไว้
WRSSD m32,r32NP 0F 38 F6 /rเขียนข้อมูล 4 ไบต์ลงในสแต็กเงา
WRSSQ m64,r64NP REX.W 0F 38 F6 /rเขียนข้อมูล 8 ไบต์ลงในสแต็กเงา
WRUSSD m32,r3266 0F 38 F5 /rเขียนข้อมูล 4 ไบต์ลงในสแต็กเงาของผู้ใช้0
WRUSSQ m64,r6466 REX.W 0F 38 F5 /rเขียนข้อมูล 8 ไบต์ลงในสแต็กเงาของผู้ใช้
SETSSBSYF3 0F 01 E8ทำเครื่องหมายว่ากำลังยุ่งอยู่กับสแต็กเงา
CLRSSBSY m64F3 0F AE /6ล้างสถานะการทำงานที่ไม่ว่างของสแต็กเงา
ซีที_ไอบีที
การติดตามการกระโดดทางอ้อม (Indirect Branch Tracking : IBT ) เมื่อเปิดใช้งาน IBT การกระโดดทางอ้อม (jump, call, return) ไปยังคำสั่งใดๆ ที่ไม่ใช่ENDBR32/64คำสั่ง จะทำให้เกิดข้อยกเว้น #CP
ENDBR32F3 0F 1E FBยุติสาขาทางอ้อมในโหมด 32 บิต[ b ]3ทะเลสาบไทเกอร์
ENDBR64F3 0F 1E FAยุติสาขาทางอ้อมในโหมด 64 บิต[ b ]
NOTRACK3E[]คำนำหน้าใช้กับคำสั่งทางอ้อมCALL/ JMPใกล้เคียง (opcode FF /2และFF /4) เพื่อระบุว่าเป้าหมายการกระโดดไม่จำเป็นต้องเริ่มต้นด้วยENDBR32/64คำสั่ง คำนำหน้านี้จะใช้ได้ก็ต่อเมื่อตั้งค่าแฟล็ก NO_TRACK_EN เท่านั้น
  1. 1 2คำRDSSPDandRDSSPQทำหน้าที่เป็น NOP บนโปรเซสเซอร์ที่ปิดใช้งาน shadow stack หรือไม่รองรับ CET
  2. 1 2ENDBR32และENDBR64ทำหน้าที่เป็น NOP บนโปรเซสเซอร์ที่ไม่รองรับ CET_IBT หรือในกรณีที่ IBT ถูกปิดใช้งาน
  3. คำนำหน้านี้มีการเข้ารหัสเหมือนกับ DS: คำนำหน้าการแทนที่เซกเมนต์ – ณ เดือนเมษายน 2022 เอกสารของ Intel ดูเหมือนจะไม่ได้ระบุว่าคำนำหน้านี้ยังคงรักษาฟังก์ชันการแทนที่เซกเมนต์แบบเก่าไว้หรือไม่เมื่อใช้เป็นคำนำหน้าแบบไม่มีแทร็ก และไม่ได้ให้ตัวช่วยจำอย่างเป็นทางการสำหรับคำนำหน้านี้ [ 126 ] [ 127 ] (GNU binutils ใช้ "notrack" [ 128 ] )

เพิ่มด้วย XSAVE

ส่วนขยายชุดคำสั่ง XSAVE ถูกออกแบบมาเพื่อบันทึก/เรียกคืนสถานะเพิ่มเติมของ CPU (โดยทั่วไปเพื่อวัตถุประสงค์ในการสลับบริบท ) ในลักษณะที่สามารถขยายให้ครอบคลุมส่วนขยายชุดคำสั่งใหม่ได้โดยที่โค้ดการสลับบริบทของระบบปฏิบัติการไม่จำเป็นต้องเข้าใจรายละเอียดเฉพาะของส่วนขยายใหม่เหล่านั้น ทำได้โดยการกำหนดส่วนประกอบสถานะ หลาย ชุด แต่ละชุดมีขนาดและออฟเซ็ตภายในพื้นที่บันทึกที่กำหนด และแต่ละชุดสอดคล้องกับส่วนย่อยของสถานะที่จำเป็นสำหรับส่วนขยาย CPU หนึ่งหรืออีกส่วนขยายหนึ่ง ส่วนย่อย EAX=0DhCPUIDใช้เพื่อระบุข้อมูลเกี่ยวกับส่วนประกอบสถานะที่ CPU รองรับและขนาด/ออฟเซ็ตของส่วนประกอบเหล่านั้น เพื่อให้ระบบปฏิบัติการสามารถสำรองพื้นที่ที่เหมาะสมและตั้งค่าบิตเปิดใช้งานที่เกี่ยวข้องได้

ส่วนขยาย XSAVEตัวช่วยจำคำแนะนำรหัสปฏิบัติการ[ a ]คำอธิบายคำแนะนำแหวนเพิ่มใน
ประหยัด
ฟังก์ชันบันทึก/กู้คืนสถานะเพิ่มเติมของโปรเซสเซอร์
XSAVE memXSAVE64 memNP 0F AE /4NP REX.W 0F AE /4บันทึกส่วนประกอบสถานะที่ระบุโดยบิตแมปใน EDX:EAX ลงในหน่วยความจำ3เพนริน , [ b ]รถดันดิน , จากัวร์ , โกลด์มอนต์ , จางเจียง
XRSTOR memXRSTOR64 memNP 0F AE /5NP REX.W 0F AE /5กู้คืนส่วนประกอบสถานะที่ระบุโดย EDX:EAX จากหน่วยความจำ
XGETBVNP 0F 01 D0รับค่าของรีจิสเตอร์ควบคุมเพิ่มเติมอ่านค่า XCR ที่ระบุโดย ECX ลงใน EDX:EAX [ c ]
XSETBVNP 0F 01 D1ตั้งค่ารีจิสเตอร์ควบคุมเพิ่มเติม[ d ]เขียนค่าใน EDX:EAX ไปยัง XCR ที่ระบุโดย ECX0
XSAVEOPT
โปรเซสเซอร์ การบันทึก/กู้คืนสถานะขยายที่ได้รับการปรับให้เหมาะสม
XSAVEOPT memXSAVEOPT64 memNP 0F AE /6NP REX.W 0F AE /6บันทึกส่วนประกอบสถานะที่ระบุโดย EDX:EAX ลงในหน่วยความจำ แตกต่างจาก คำสั่งเดิมอาจงดเว้นการเขียนรายการสถานะของโปรเซสเซอร์ลงในหน่วยความจำเมื่อ CPU สามารถตรวจสอบได้ว่ารายการเหล่านั้นไม่ได้ถูกแก้ไขนับตั้งแต่การแก้ไขครั้งล่าสุดที่เกี่ยวข้องXSAVEXSAVEOPTXRSTOR3แซนดี้บริดจ์ , สตีมโรลเลอร์ ,พูม่า ,โกลด์มอนต์ ,จางเจียง
XSAVEC
การบันทึก/กู้คืนสถานะขยายของโปรเซสเซอร์พร้อมการบีบอัดข้อมูล
XSAVEC memXSAVEC64 memNP 0F C7 /4NP REX.W 0F C7 /4บันทึกส่วนประกอบสถานะขยายของโปรเซสเซอร์ที่ระบุโดย EDX:EAX ลงในหน่วยความจำด้วยการบีบอัดข้อมูล3สกายเลค , โกลด์มอนท์ , เซน 1 , ชิจิดาดาว[ e ]
เอ็กซ์เอสเอส
ฟังก์ชันบันทึก/กู้คืนสถานะขยายของโปรเซสเซอร์ รวมถึงสถานะตัวควบคุมหลัก
XSAVES memXSAVES64 memNP 0F C7 /5NP REX.W 0F C7 /5บันทึกส่วนประกอบสถานะขยายของโปรเซสเซอร์ที่ระบุโดย EDX:EAX ลงในหน่วยความจำโดยใช้การบีบอัดและการเพิ่มประสิทธิภาพหากเป็นไปได้0สกายเลค , โกลด์มอนท์ , เซน 1 , ชิจิดาดาว[ e ]
XRSTORS memXRSTORS64 memNP 0F C7 /3NP REX.W 0F C7 /3กู้คืนส่วนประกอบสถานะที่ระบุโดย EDX:EAX จากหน่วยความจำ
  1. ภายใต้ Intel APXXSAVE*และXRSTOR*ไม่สามารถเข้ารหัสด้วยคำนำหน้า REX2 ได้
  2. ฟังก์ชัน XSAVE ถูกเพิ่มเข้ามาในเวอร์ชัน E0/R0 ของ Penryn และไม่มีในเวอร์ชันก่อนหน้านั้น
  3. ในโปรเซสเซอร์บางตัว (เริ่มตั้งแต่ Skylake , Goldmont , Zen 1และ Shijidadao v2)XGETBVอนุญาตให้ดำเนินการด้วย ECX=1 ได้ – ซึ่งจะไม่ส่งค่าคืนXCR1(เนื่องจากไม่มีรีจิสเตอร์ดังกล่าว) แต่จะส่งXCR0ค่าคืนด้วยการดำเนินการ AND แบบบิตกับค่าปัจจุบันของบิตแมปส่วนประกอบสถานะ "XINUSE" (บิตแมปของส่วนประกอบสถานะ XSAVE ที่ไม่ทราบว่าอยู่ในสถานะเริ่มต้น)การมีฟังก์ชันนี้XGETBVจะแสดงโดย CPUID .(EAX=0Dh,ECX=1):EAX[bit 2]
  4. คำสั่ง นี้XSETBVจะทำให้เกิดการเรียกใช้ #VMEXIT โดยอัตโนมัติ หากดำเนินการภายใต้ระบบเวอร์ชวลไลเซชัน Intel VT-x
  5. 1 2 XSAVEC และ XSAVES ถูกเพิ่มในการแก้ไข v2 ของ Zhaoxin Shijidadao และไม่มีในการแก้ไข v1 [ 129 ]

เพิ่มส่วนขยายข้ามผู้จำหน่ายอื่นๆ

  1. โปรเซสเซอร์ AMD Athlon 1 2 3 รุ่นก่อน Athlon XP ไม่รองรับ SSE เต็มรูปแบบ แต่ได้แนะนำคำสั่งที่ไม่ใช่ SIMD ของ SSE เป็นส่วนหนึ่งของ "MMX Extensions" [ 130 ] ส่วนขยายเหล่านี้ (โดยไม่มี SSE เต็มรูปแบบ) ยังมีอยู่ใน โปรเซสเซอร์ Geode GX2และ Geode รุ่นต่อมา
  2. 1 2 3 4 5 6 7 คำสั่ง ทั้งหมดPREFETCH*เป็นคำสั่งแนะนำที่มีผลต่อประสิทธิภาพเท่านั้น ไม่มีผลต่อความหมายของโปรแกรม การระบุที่อยู่ที่ไม่ถูกต้อง (เช่น ที่อยู่ของเพจที่ไม่ได้แมป หรือที่อยู่ที่ไม่เป็นไปตามแบบแผน) จะทำให้คำสั่งนั้นทำงานเหมือนคำสั่ง NOP โดยไม่มีการสร้างข้อยกเว้นใดๆ
  3. 1 2 3บนโปรเซสเซอร์ Intel [ 131 ]เช่นเดียวกับโปรเซสเซอร์ AMD64 [ 132 ]โปรเซสเซอร์จะไม่สนใจฟิลด์ r/m ของ ไบต์ ModR/MสำหรับSFENCE,LFENCEและMFENCE— ค่า x ใดๆ ในช่วง 0..7 จะส่งผลให้เป็นคำสั่งที่ถูกต้อง (ไม่ทราบว่ากรณีนี้เกิดขึ้นกับโปรเซสเซอร์อื่นๆ ที่รองรับคำสั่งเหล่านี้หรือไม่ ดังนั้นจึงแนะนำให้เข้ารหัสด้วย x=0)
  4. คำสั่ง นี้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คำสั่งการจัดลำดับแบบอนุกรม
  5. คำสั่ง นี้LFENCEรับประกันว่าการโหลดหน่วยความจำทั้งหมดหลังจากLFENCEคำสั่งนี้จะสามารถสังเกตได้ทั่วโลกหลังจากโหลดหน่วยความจำทั้งหมดก่อนหน้านั้นLFENCEบนซีพียู Intel ทั้งหมดที่รองรับ SSE2LFENCEคำสั่งนี้ให้การรับประกันลำดับที่แข็งแกร่งกว่า: [ 135 ]มันเป็นการจัดลำดับแบบส่ง คำสั่ง ซึ่งหมายความว่าคำสั่งหลังจากLFENCEคำสั่งนี้จะได้รับอนุญาตให้เริ่มทำงานได้ก็ต่อเมื่อคำสั่งทั้งหมดก่อนหน้านั้นเสร็จสิ้นแล้ว (ซึ่งจะทำให้มั่นใจได้ว่าการโหลดก่อนหน้าทั้งหมด แต่ไม่จำเป็นต้องเป็นการจัดเก็บข้อมูล ได้เสร็จสมบูรณ์แล้ว) ผลของการจัดลำดับแบบส่งคำสั่งคือ คำสั่งนี้LFENCEยังทำหน้าที่เป็น ตัวกั้น การคาดการณ์และตัวกั้นการจัดลำดับใหม่สำหรับการเข้าถึงทรัพยากรที่ไม่ใช่หน่วยความจำ เช่น ตัวนับประสิทธิภาพ (เข้าถึงผ่าน เช่นRDTSCหรือRDPMC) และ x2apic MSRบนซีพียู AMDLFENCEคำสั่งนี้ไม่จำเป็นต้องจัดลำดับแบบส่งคำสั่งโดยค่าเริ่มต้น อย่างไรก็ตาม บนซีพียู AMD ทั้งหมดที่รองรับรูปแบบใดๆ ของการไม่จัดลำดับแบบส่งคำสั่ง คำสั่งLFENCEนี้สามารถทำให้จัดลำดับแบบส่งคำสั่งได้โดยการตั้งค่าบิตที่ 1 ของC001_1029MSR [ 136 ]
  6. คำสั่ง นี้MFENCEรับประกันว่าการโหลด การจัดเก็บ และการล้างแคชไลน์ของหน่วยความจำทั้งหมดหลังจากMFENCEคำสั่งนี้จะสามารถสังเกตได้ทั่วโลกหลังจากโหลด การจัดเก็บ และการล้างแคชไลน์ของหน่วยความจำทั้งหมดก่อนหน้านั้นMFENCEบนซีพียู IntelMFENCEนี้ไม่ได้ทำการเรียงลำดับแบบส่งคำสั่ง ดังนั้นจึงไม่สามารถใช้เพียงอย่างเดียวเพื่อบังคับลำดับการเข้าถึงทรัพยากรที่ไม่ใช่หน่วยความจำ เช่น ตัวนับประสิทธิภาพและ x2apic MSR ได้MFENCEคำสั่งนี้ยังคงเรียงลำดับตามLFENCEดังนั้นหากจำเป็นต้องบังคับลำดับระหว่างการจัดเก็บหน่วยความจำและการเข้าถึงที่ไม่ใช่หน่วยความจำที่ตามมา ลำดับดังกล่าวสามารถทำได้โดยการออกคำสั่งMFENCEตามด้วยคำสั่งLFENCE[ 79 ] [ 137 ] บนซีพียู AMDMFENCEได้ทำการเรียงลำดับแบบส่ง
  7. การทำงานของPAUSEคำสั่งในโหมด 64 บิตนั้นNOPไม่ได้รับผลกระทบจากการมีอยู่ของREX.Rคำนำหน้า ซึ่งแตกต่างจากคำสั่งอื่น ๆ ทั้งคำสั่งNOPจะไม่PAUSEได้รับผลกระทบจากบิตอื่น ๆ ของREXคำนำหน้า ตัวอย่างบางส่วนของการที่โอเปอเรเตอร์โค้ด90ทำงานร่วมกับคำนำหน้าต่าง ๆ ในโหมด 64 บิต มีดังนี้:
    • 90เป็นNOP
    • 41 90เป็นXCHG R8D,EAX
    • 4E 90เป็นNOP
    • 49 90เป็นXCHG R8,RAX
    • F3 90เป็นPAUSE
    • F3 41 90เป็นPAUSE
    • F3 4F 90เป็นPAUSE
  8. ระยะเวลาหยุดชั่วคราวที่PAUSEคำสั่งนี้ดำเนินการนั้นขึ้นอยู่กับการใช้งานของระบบ ในระบบที่ไม่มี SSE2 คำสั่งนี้PAUSEจะดำเนินการเหมือนกับคำสั่ง NOP
  9. ภายใต้การจำลองเสมือน VT-x หรือ AMD-V การเรียกใช้งานPAUSEหลายครั้งในช่วงเวลาสั้นๆ อาจทำให้เกิด #VMEXIT จำนวนครั้งในPAUSEการเรียกใช้งานและความยาวของช่วงเวลาที่สามารถกระตุ้นให้เกิด #VMEXIT นั้นขึ้นอยู่กับแพลตฟอร์ม
  10. แม้ว่าCLFLUSHคำสั่งนี้จะถูกนำมาใช้พร้อมกับ SSE2 แต่ก็มีแฟล็ก CPUID ของตัวเอง และอาจมีอยู่ในโปรเซสเซอร์ที่ไม่รองรับ SSE2 และ/หรืออาจไม่มีอยู่ในโปรเซสเซอร์ที่รองรับ SSE2 (เช่น AMD Geode LXรองรับCLFLUSHแต่ไม่รองรับ SSE2)
  11. แม้ว่าMONITOR`MWAITจะถูกนำมาใช้พร้อมกับ SSE3 แต่ก็มีแฟล็ก CPUID ของตัวเองที่ต้องตรวจสอบแยกต่างหากจากแฟล็ก CPUID ของ SSE3 (เช่น Athlon 64 X2และ VIA C7รองรับ SSE3 แต่ไม่รองรับ MONITOR)
  12. 1 2สำหรับMONITORandMWAITเอกสารเก่าของ Intel [ 138 ]แสดงรายการคำสั่งย่อพร้อมตัวถูกดำเนินการที่ระบุอย่างชัดเจน (MONITOR EAX,ECX,EDXandMWAIT EAX,ECX) ในขณะที่เอกสารใหม่จะละเว้นตัวถูกดำเนินการเหล่านี้ โปรแกรมประกอบ/โปรแกรมแยกส่วนอาจรองรับรูปแบบใดรูปแบบหนึ่งหรือทั้งสองรูปแบบนี้ [ 139 ]
  13. สำหรับMONITORDS: เซ็กเมนต์สามารถถูกแทนที่ได้ด้วยคำนำหน้าเซ็กเมนต์พื้นที่หน่วยความจำที่จะถูกตรวจสอบจะไม่ใช่แค่ไบต์เดียวที่ระบุโดย DS:rAX แต่จะเป็นพื้นที่หน่วยความจำเชิงเส้นที่ประกอบด้วยไบต์นั้น ขนาดและการจัดเรียงของพื้นที่หน่วยความจำนี้ขึ้นอยู่กับการใช้งาน และสามารถสอบถามได้ผ่าน CPUIDตำแหน่งหน่วยความจำที่จะตรวจสอบควรมีประเภทหน่วยความจำ WB (write-back cacheable) มิฉะนั้นการตรวจสอบอาจล้มเหลว
  14. ณ เดือนเมษายน 2567 ยังไม่มีการกำหนดส่วนขยายหรือคำแนะนำใดๆ สำหรับMONITORคำสั่งนี้ ดังนั้น คำสั่งนี้จึงต้องการ ECX=0 และไม่สนใจ EDX
  15. ในโปรเซสเซอร์บางตัว เช่น Intel Xeon Phi x200 [ 140 ]และ AMD K10 [ 141 ]และรุ่นต่อมา มี MSR ที่ได้รับการบันทึกไว้ซึ่งสามารถใช้เพื่อเปิดใช้งานMONITORและMWAITเรียกใช้ใน Ring 3 ได้
  16. การรอที่ดำเนินการโดยMWAITอาจสิ้นสุดลงด้วยเหตุการณ์ของระบบอื่นๆ นอกเหนือจากการเขียนหน่วยความจำ (เช่น การล้างแคชไลน์ การขัดจังหวะ) – ชุดเหตุการณ์ที่แน่นอนที่สามารถทำให้การรอสิ้นสุดลงนั้นขึ้นอยู่กับการใช้งานเฉพาะไม่ว่าการรอจะสิ้นสุดลงด้วยการเขียนหน่วยความจำหรือเหตุการณ์อื่นๆ การตรวจสอบจะสิ้นสุดลงแล้ว และจำเป็นต้องตั้งค่าการตรวจสอบใหม่อีกครั้งMONITORก่อนที่จะใช้MWAITเพื่อรอการเขียนหน่วยความจำอีกครั้ง
  17. ตัวเลือกการขยายที่มีให้ใช้งานMWAITในรีจิสเตอร์ ECX มีดังนี้:
    บิตส่วนขยาย MWAIT
    0ถือว่าการขัดจังหวะเป็นเหตุการณ์หยุด แม้ว่าจะถูกปิดกั้นไว้ ( EFLAGS .IF=0) ก็ตาม (ใช้งานได้ในทุกการใช้งาน ที่ไม่ใช่ NetBurstMWAIT )
    1MWAIT แบบกำหนดเวลา: สิ้นสุดการรอเมื่อTSCถึงหรือเกินค่าใน EDX:EBX (ไม่มีเอกสาร รายงานว่ามีอยู่ในโปรเซสเซอร์ Intel Skylakeและโปรเซสเซอร์ Intel รุ่นต่อมา) [ 142 ]
    2MWAIT ที่ไม่มีจอภาพ[ 143 ]
    31:3หากไม่ได้ใช้งาน ต้องตั้งค่าเป็นศูนย์
  18. ตัวเลือกคำแนะนำที่มีให้ใช้งานMWAITในรีจิสเตอร์ EAX มีดังนี้:
    บิตคำใบ้ MWAIT
    3:0สถานะย่อยภายในสถานะ C (ดูบิต 7:4) (เฉพาะโปรเซสเซอร์ Intel)
    7:4สถานะ C ของพลังงาน CPUเป้าหมายระหว่างการรอ ลบ 1 (เช่น 0000b สำหรับ C1, 0001b สำหรับ C2, 1111b สำหรับ C0)
    31:8ไม่ได้ใช้งาน
    สถานะ C คือสถานะพลังงานเฉพาะของโปรเซสเซอร์ ซึ่งไม่จำเป็นต้องตรงกับสถานะ C ของ ACPI แบบ 1:1 เสมอ ไป
  19. สำหรับGETSECคำสั่งนี้REX.Wคำนำหน้าจะเปิดใช้งานที่อยู่ 64 บิตสำหรับฟังก์ชัน EXITAC เท่านั้น - อนุญาตให้ใช้คำนำหน้า REX ได้ แต่จะถูกละเว้นสำหรับคำสั่งนี้
  20. ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับGETSEC(เลือกโดย EAX) มีดังนี้:
    อีเอเอ็กซ์การทำงาน
    0  (ความสามารถ)รายงานความสามารถของ SMX
    2  (ทางเข้า)เข้าสู่การดำเนินการของโมดูลรหัสที่ตรวจสอบสิทธิ์แล้ว
    3  (ทางออก)ออกจากการทำงานของโมดูลรหัสที่ตรวจสอบสิทธิ์แล้ว
    4 (ศูนย์กลาง)เข้าสู่สภาพแวดล้อมที่วัดได้
    5 (SEXIT)ออกจากสภาพแวดล้อมที่วัดได้
    6  (พารามิเตอร์)รายงานพารามิเตอร์ SMX
    7 (SMCTRL)การควบคุมโหมด SMX
    8 (ตื่นนอน)ปลุกโปรเซสเซอร์ที่กำลังหลับอยู่ในสภาพแวดล้อมที่มีการวัดค่า
    ค่าใดๆ ที่ไม่รองรับใน EAX จะทำให้เกิดข้อผิดพลาด #UD
  21. สำหรับGETSECกรณีนี้ ฟังก์ชันระดับใบส่วนใหญ่จะถูกจำกัดไว้ที่ Ring 0 แต่ฟังก์ชันระดับใบ CAPABILITIES (EAX=0) และ PARAMETERS (EAX=6) นั้นมีอยู่ใน Ring 3
  22. 1 2ค่า "core ID" ที่อ่านได้นั้นRDTSCPแล้วRDPIDคือTSC_AUXMSR (MSRC000_0103h) ส่วนค่านี้จะตรงกับรหัสโปรเซสเซอร์หรือไม่นั้น ขึ้นอยู่กับธรรมเนียมปฏิบัติของระบบปฏิบัติการ
  23. แตกต่างจาก คำสั่งเดิมนี้จะหน่วงเวลาการอ่าน TSC จนกว่าคำสั่งก่อนหน้าทั้งหมดจะเสร็จสิ้น ซึ่งรับประกันลำดับที่สัมพันธ์กับการโหลดหน่วยความจำก่อนหน้า (แต่ไม่ใช่การจัดเก็บ)อย่างไรก็ตาม ลำดับจะไม่สัมพันธ์กับคำสั่งถัดไปRDTSCRDTSCPRDTSCP
  24. RDTSCPสามารถรันนอก Ring 0 ได้ก็ต่อเมื่อCR4.TSD=0.
  25. ฟังก์ชันนี้RDTSCPถูกเพิ่มเข้ามาในรุ่น F ของ AMD K8 และไม่มีในรุ่นก่อนหน้า
  26. แม้ว่าPOPCNTคำสั่งนี้จะถูกนำมาใช้พร้อมกับ SSE4.2 แต่ก็ไม่ได้ถือว่าเป็นส่วนหนึ่งของ SSE4.2 แต่เป็นส่วนขยายแยกต่างหากที่มีแฟล็ก CPUID ของตัวเองบนโปรเซสเซอร์ AMD คำสั่งนี้ถือว่าเป็นส่วนหนึ่งของส่วนขยาย ABM แต่ก็ยังคงมีแฟล็ก CPUID ของตัวเองอยู่
  27. 1 2สำหรับMOVBEคำสั่ง การเข้ารหัสที่ใช้ทั้ง66hคำนำหน้าและREX.Wคำนำหน้าจะทำให้เกิด #UD บนโปรเซสเซอร์บางตัว (เช่น Haswell [ 145 ] ) และควรหลีกเลี่ยง
  28. ประเภทการทำให้เป็นโมฆะที่กำหนดไว้สำหรับINVPCID(เลือกโดยอาร์กิวเมนต์รีจิสเตอร์) มีดังนี้:
    ค่าการทำงาน
    0ยกเลิกรายการ TLB ที่ตรงกับ PCID และที่อยู่หน่วยความจำเสมือนในตัวอธิบาย โดยไม่รวมรายการส่วนกลาง
    1ยกเลิกรายการ TLB ที่ตรงกับ PCID ในตัวอธิบาย โดยไม่รวมรายการส่วนกลาง
    2ยกเลิกรายการ TLB ทั้งหมด รวมถึงรายการส่วนกลางด้วย
    3ยกเลิกรายการ TLB ทั้งหมด ยกเว้นรายการส่วนกลาง
    ค่าใดๆ ที่ไม่รองรับในอาร์กิวเมนต์ register จะทำให้เกิดข้อยกเว้น #GP
  29. แตกต่างจาก คำสั่งเดิมจะทำให้เกิดข้อยกเว้น #GP หากที่อยู่หน่วยความจำที่ให้มาไม่ใช่ที่อยู่แบบมาตรฐาน ความไม่สอดคล้องกันนี้เป็นที่ทราบกันดีว่าก่อให้เกิดปัญหาด้านความปลอดภัย [ 146 ]INVLPGINVPCID
  30. คำสั่ง `PREFETCHand` และ `or`PREFETCHWเป็นส่วนประกอบที่จำเป็นของ ส่วนขยายชุดคำสั่ง 3DNow!แต่ก็มีให้ใช้งานเป็นส่วนขยายแบบสแตนด์อโลนบนระบบที่ไม่รองรับ 3DNow! ด้วย
  31. รหัสคำสั่งสำหรับPREFETCHและPREFETCHW(0F 0D /r) จะทำงานเป็น NOP บนซีพียู Intel ตั้งแต่ Cedar Mill ( Pentium 4 ขนาด 65 นาโนเมตร ) เป็นต้นไป โดยจะPREFETCHWได้รับฟังก์ชันการดึงข้อมูลล่วงหน้าตั้งแต่ Broadwell เป็นต้นไป
  32. คำ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
  33. 1 2 3ส่วนขยายชุดคำสั่ง SMAP, PKU และ RDPID ได้รับการสนับสนุนในขั้นตอนที่ 2 [ 149 ] และขั้นตอนที่ใหม่กว่าของ Zhaoxin LuJiaZui แต่ไม่ใช่ในขั้นตอนก่อนหน้า
  34. แตกต่างจากคำสั่งเดิมRDTSCPที่สามารถใช้อ่านรหัสโปรเซสเซอร์ได้ โหมดผู้ใช้RDPIDจะไม่ถูกปิดใช้งานโดยCR4.TSD=1.
  35. สำหรับMOVDIR64ES:reg ที่อยู่ปลายทางที่ระบุโดย ES:reg ต้องจัดเรียงให้ตรงกับ 64 ไบต์ขนาดของตัวดำเนินการสำหรับอาร์กิวเมนต์รีจิสเตอร์จะกำหนดโดยขนาดของที่อยู่ ซึ่งอาจถูกแทนที่ด้วย67hคำนำหน้า อาร์กิวเมนต์แหล่งข้อมูลหน่วยความจำขนาด 64 ไบต์ไม่จำเป็นต้องจัดเรียงให้ตรงกับ 64 ไบต์ และไม่รับประกันว่าจะถูกอ่านแบบอะตอมิก
  36. คำสั่ง นี้WBNOINVDจะทำงานเสมือนว่าWBINVDรันบนระบบที่ไม่รองรับส่วนขยาย WBNOINVD ซึ่งWBINVDแตกต่างจากWBNOINVDคำสั่งWBINVDที่ลบล้างแคชทั้งหมดหลังจากเขียนกลับ (writeback)
  37. 1 2ในการใช้งานเบื้องต้นPREFETCHIT0`and`PREFETCHIT1จะทำการดึงโค้ดล่วงหน้าเฉพาะเมื่อใช้โหมดการกำหนดแอดเดรสแบบ RIP-relative เท่านั้น และจะทำงานเป็นคำสั่ง NOP ในกรณีอื่นๆคำสั่ง `PREFETCHI` เป็นเพียงคำสั่งแนะนำเท่านั้น หากพยายามดึงแอดเดรสที่ไม่ถูกต้อง คำสั่งเหล่านี้จะทำงานเป็นคำสั่ง NOP โดยไม่มีการสร้างข้อยกเว้นใดๆ บนโปรเซสเซอร์ที่รองรับ Long-NOP แต่ไม่รองรับคำสั่ง `PREFETCHI` คำสั่งเหล่านี้จะทำงานเป็นคำสั่ง NOP เสมอ

เพิ่มส่วนขยายเฉพาะของ Intel อื่นๆ เข้าไปด้วย

  1. 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 ]

  2. 1 2คำนำ2Eand` และ `3Eor` จะถูกตีความว่าเป็นคำแนะนำการกระโดด (branch hints) เฉพาะเมื่อใช้กับJccคำสั่งการกระโดดแบบมีเงื่อนไข (opcodes `70..7Fand`0F 80..8F) เท่านั้น - เมื่อใช้กับ opcodes อื่นๆ คำนำหน้าเหล่านี้อาจมีความหมายอื่นๆ (เช่น สำหรับคำสั่งที่มีตัวถูกดำเนินการในหน่วยความจำนอกโหมด 64 บิต คำนำหน้าเหล่านี้จะทำงานเป็นคำนำหน้าการแทนที่เซกเมนต์ (segment-override prefixes) `CS:และDS:`or` ตามลำดับ) บนโปรเซสเซอร์ที่ไม่รองรับคำแนะนำการกระโดด คำนำหน้าเหล่านี้จะได้รับการยอมรับแต่จะถูกละเลยเมื่อใช้ร่วมกับJcc`or`
  3. ฟังก์ชัน Branch hints รองรับการใช้งานบน โปรเซสเซอร์ NetBurst (ตระกูล Pentium 4) ทุกรุ่น แต่ไม่รองรับบนโปรเซสเซอร์รุ่นอื่นใดที่ทราบมาก่อนที่จะมีการนำกลับมาใช้ใหม่ในซีพียู "Redwood Cove" ซึ่งเริ่มต้นด้วย "Meteor Lake" ในปี 2023
  4. ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับENCLS(เลือกโดย EAX) มีดังนี้:
    อีเอเอ็กซ์การทำงาน
    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 ]
    ค่าใดๆ ที่ไม่ได้รับการสนับสนุนใน EAX จะทำให้เกิดข้อผิดพลาด #GP
  5. SGX ถูกยกเลิกการใช้งานในโปรเซสเซอร์เดสก์ท็อป/แล็ปท็อปตั้งแต่รุ่นที่ 11 เป็นต้นไป ( Rocket Lake , Tiger Lake ) [ 157 ]แต่ยังคงมีให้บริการในชิ้นส่วนเซิร์ฟเวอร์ที่ใช้แบรนด์ Xeon
  6. เอกสารของ Intel ระบุว่า Ice Lake-SP และ Tremont เป็นโปรเซสเซอร์ที่มีการนำ SGX oversubscription มาใช้ [ 159 ]อย่างไรก็ตาม ณ เดือนกุมภาพันธ์ 2026 ยังไม่พบว่า Ice Lake-SP หรือ Tremont รุ่นใดมีการตั้งค่าบิตคุณลักษณะ CPUID ของส่วนขยาย SGX oversubscription ในขณะที่หลายรุ่นมีการล้างบิตเหล่านั้นออกไป — โปรเซสเซอร์เพียงรุ่นเดียวที่พบว่ามีการตั้งค่าบิตคุณลักษณะเหล่านี้คือ Ice Lake-U บางรุ่น [ 160 ]
  7. ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับENCLU(เลือกโดย EAX) มีดังนี้:
    อีเอเอ็กซ์การทำงาน
    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 บิต
    ค่าใดๆ ที่ไม่รองรับใน EAX จะทำให้เกิดข้อยกเว้น #GP ฟังก์ชันEENTERและERESUMEไม่สามารถเรียกใช้ภายใน SGX enclave ได้ – ฟังก์ชันอื่นๆ สามารถเรียกใช้ได้เฉพาะภายใน enclave เท่านั้น
  8. คำสั่ง ↑ENCLUสามารถดำเนินการได้เฉพาะในวงแหวนที่ 3 เท่านั้น ไม่สามารถดำเนินการในวงแหวนที่ 0/1/2 ได้
  9. ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับENCLV(เลือกโดย EAX) มีดังนี้:
    อีเอเอ็กซ์การทำงาน
    เพิ่มด้วย OVERSUB [ 155 ]
    0  (EDECVIRTCHILD)ลดค่า VIRTCHILDCNT ในหน่วย SECS
    1  (EINCVIRTCHILD)เพิ่มค่า VIRTCHILDCNT ใน SECS
    2  (ESETCONTEXT)ตั้งค่าฟิลด์ ENCLAVECONTEXT ใน SECS
    ค่าใดๆ ที่ไม่ได้รับการสนับสนุนใน EAX จะทำให้เกิดข้อยกเว้น #GP คำสั่ง นี้ENCLVมีอยู่เฉพาะในระบบที่รองรับส่วนขยาย EPC Oversubscription Extensions to SGX ("OVERSUB") เท่านั้น
  10. ENCLVจะใช้งานได้ก็ต่อเมื่อเปิดใช้งานการทำงานของ Intel VMX ด้วยVMXONและหากไม่เช่นนั้นจะแสดงข้อความ #UD
  11. สำหรับกรณีนี้PTWRITEการเขียนข้อมูลลงใน Processor Trace Packet จะเกิดขึ้นก็ต่อเมื่อบิตเปิดใช้งานชุดหนึ่ง (บิต "TriggerEn", "ContextEn", "FilterEn" ของRTIT_STATUSMSR และบิต "PTWEn" ของRTIT_CTLMSR) ถูกตั้งค่าเป็น 1 ทั้งหมดนี้PTWRITEระบุไว้ใน SDM ว่าจะทำให้เกิดข้อยกเว้น #UD หากใช้คำนำหน้าคำสั่ง 66h โดยไม่คำนึงถึงคำนำหน้าอื่นๆ
  12. ฟังก์ชันใบไม้ที่กำหนดไว้สำหรับPCONFIG(เลือกโดย EAX) มีดังนี้:
    อีเอเอ็กซ์การทำงาน
    0MKTME_KEY_PROGRAM: โปรแกรมรหัสและโหมดการเข้ารหัสที่จะใช้กับรหัส TME-MK Key ID
    เพิ่มด้วย TSE
    1TSE_KEY_PROGRAM: การเขียนโปรแกรมคีย์โดยตรงสำหรับ TSE
    2TSE_KEY_PROGRAM_WRAPPED: การตั้งโปรแกรมคีย์แบบ Wrapped สำหรับ TSE
    ค่าใดๆ ที่ไม่รองรับใน EAX จะทำให้เกิดข้อยกเว้น #GP(0)
  13. สำหรับCLDEMOTEคำสั่งนี้ ระดับแคชที่จะลดระดับบรรทัดแคชลงไปนั้นขึ้นอยู่กับการใช้งานของระบบเนื่องจากคำสั่งนี้ถือเป็นคำแนะนำ ดังนั้นมันจะทำงานเป็น NOP โดยไม่มีข้อยกเว้นใดๆ หากที่อยู่หน่วยความจำที่ให้มาไม่ถูกต้องหรือไม่อยู่ในแคช L1 นอกจากนี้ยังอาจทำงานเป็น NOP ในสถานการณ์อื่นๆ ที่ขึ้นอยู่กับการใช้งานของระบบด้วยเช่นกันในระบบที่ไม่รองรับส่วนขยาย CLDEMOTE มันจะทำงานเป็น NOP
  14. เอกสารของ Intel ระบุว่า Tremont และ Alder Lake เป็นโปรเซสเซอร์ที่มีการนำ CLDEMOTE มาใช้ [ 159 ]อย่างไรก็ตาม ณ เดือนพฤษภาคม 2022 ยังไม่พบว่ารุ่น Tremont หรือ Alder Lake รุ่นใดมีการตั้งค่าบิตคุณลักษณะ CPUID สำหรับ CLDEMOTE ในขณะที่หลายรุ่นมีบิต CPUID ถูกล้าง [ 164 ]ณ เดือนเมษายน 2023 พบว่าบิตคุณลักษณะ CPUID สำหรับ CLDEMOTE ถูกตั้งค่าสำหรับ Sapphire Rapids แล้ว [ 165 ]
  15. สำหรับกรณีนี้UMONITORขนาดของตัวถูกดำเนินการของอาร์กิวเมนต์ที่อยู่จะกำหนดโดยขนาดของที่อยู่ ซึ่งสามารถแทนที่ได้ด้วย67hคำนำหน้า เซ็กเมนต์เริ่มต้นที่ใช้คือ DS: ซึ่งสามารถแทนที่ได้ด้วยคำนำหน้าเซ็กเมนต์
  16. 1 2สำหรับUMWAITและTPAUSEระบบปฏิบัติการสามารถใช้IA32_UMWAIT_CONTROLMSR เพื่อจำกัดระยะเวลาสูงสุดที่UMWAIT/TPAUSEสามารถรอได้ คำUMWAITและTPAUSEจะตั้งค่าRFLAGS.CFเป็น 1 หากถึงIA32_UMWAIT_CONTROLขีดจำกัดเวลาที่กำหนดไว้ และเป็น 0 ในกรณีอื่น ๆ
  17. TPAUSEและUMWAITสามารถรันนอกวงแหวนที่ 0 ได้ก็ต่อเมื่อCR4.TSD=0.
  18. สำหรับอาร์กิวเมนต์รีจิสเตอร์ของUMWAITandTPAUSEนั้น รองรับบิตแฟล็กต่อไปนี้:
    บิตการใช้งาน
    0สถานะการปรับแต่งที่ต้องการ
    • 0 = C0.2 (การปลุกช้าลง ปรับปรุงประสิทธิภาพของเธรด SMT อื่นๆ บนคอร์เดียวกัน)
    • 1 = C0.1 (ปลุกเร็วขึ้น)
    31:1(ที่สงวนไว้)
  19. แม้ว่าการจัดลำดับการทำงาน (serialization) สามารถทำได้ด้วยคำสั่งเก่าๆ เช่น egCPUIDและIRETแต่คำสั่งเหล่านี้จะทำหน้าที่เพิ่มเติม ทำให้เกิดผลข้างเคียงและลดประสิทธิภาพเมื่อต้องการการจัดลำดับการทำงานของคำสั่งแบบแยกต่างหาก (CPUIDนอกจากนี้ ยังมีปัญหาที่ว่ามันทำให้เกิด #VMEXIT ที่จำเป็นเมื่อทำงานภายใต้การจำลองเสมือน ซึ่งทำให้เกิดค่าใช้จ่ายเพิ่มเติมจำนวนมาก)SERIALIZEคำสั่งนี้ทำการจัดลำดับการทำงานเท่านั้น จึงหลีกเลี่ยงค่าใช้จ่ายเพิ่มเติมเหล่านี้ได้
  20. แผนภาพบิตของส่วนประกอบประวัติ CPU ที่สามารถรีเซ็ตได้นั้นHRESETแสดงโดย CPUID.(EAX=20h,ECX=0):EBXณ เดือนกรกฎาคม 2023 บิตต่อไปนี้ได้รับการกำหนดไว้:
    นิดหน่อยการใช้งาน
    0ประวัติของ Intel Thread Director
    31:1(ที่สงวนไว้)
  21. คำสั่ง นี้IBHFมีผลเฉพาะใน Ring 0 เท่านั้น การดำเนินการIBHFคำสั่งใน ring 1/2/3 ได้รับอนุญาต [ 167 ]แต่จะดำเนินการโดยNOPไม่มีฟังก์ชันรั้วประวัติสาขา

    ในโปรเซสเซอร์ที่ไม่รองรับ IBHF คำสั่งจะทำงานตามปกติโดยNOPไม่คำนึงถึงวงแหวน (ring)

  22. คำสั่ง นี้IBHFถูกเพิ่มเข้าไปในโปรเซสเซอร์ Alder Lake และโปรเซสเซอร์ Intel รุ่นต่อมา พร้อมกับการอัปเดตไมโครโค้ดในเดือนพฤษภาคม 2025
  23. อาร์กิวเมนต์ register เป็นSENDUIPIดัชนีสำหรับเลือกรายการจาก UITT (User-Interrupt Target Table ซึ่งเป็นตารางที่ระบุโดย MSRUINTR_TTรุ่น)UINT_MISC
  24. บนโปรเซสเซอร์ Sapphire RapidsUIRETคำสั่งนี้จะตั้งค่า UIF (User Interrupt Flag) เป็น 1 เสมอ บน โปรเซสเซอร์ Sierra Forestและรุ่นที่ใหม่กว่าUIRETจะตั้งค่า UIF เป็นค่าของบิตที่ 1 ของค่าที่ดึงออกจากสแต็กสำหรับ RFLAGS - ฟังก์ชันนี้แสดงด้วยCPUID.(EAX=7,ECX=1):EDX[17].
  25. สำหรับENQCMDและEMQCMDSขนาดตัวถูกดำเนินการของอาร์กิวเมนต์รีจิสเตอร์จะกำหนดโดยขนาดที่อยู่ปัจจุบัน ซึ่งสามารถแทนที่ได้ด้วย67hคำนำหน้า
  26. 1 2สำหรับRDMSRLISTและWRMSRLISTที่อยู่ที่ระบุในรีจิสเตอร์ RSI และ RDI ต้องจัดเรียงให้ตรงกับ 8 ไบต์
  27. รหัสเงื่อนไขที่รองรับสำหรับคำสั่ง (opcodeที่มี x nibble ระบุเงื่อนไข) มีดังนี้: CMPccXADDVEX.128.66.0F38 Ex /r
    xซีซีเงื่อนไข ( EFLAGS )
    0โอOF=1: "โอเวอร์โฟลว์"
    1เลขที่OF=0: "ไม่เกิดการล้น"
    2บีCF=1: "ด้านล่าง"
    3หมายเหตุCF=0: "ไม่ต่ำกว่า"
    4ZF=1: "ศูนย์"
    5นิวซีแลนด์ZF=0: "ไม่ใช่ศูนย์"
    6เป็น(CF=1 หรือ ZF=1): "ต่ำกว่าหรือเท่ากับ"
    7เอ็นบีอี(CF=0 และ ZF=0): "ไม่ต่ำกว่าหรือเท่ากับ"
    8เอสSF=1: "เครื่องหมาย"
    9เอ็นเอสSF=0: "ไม่ต้องระบุเครื่องหมาย"
    เอพีPF=1: "ความเท่าเทียมกัน"
    บีNPPF=0: "ไม่ใช่พาริตี"
    ซีแอลSF≠OF: "น้อยกว่า"
    ดีเอ็นแอลSF=OF: "ไม่น้อยกว่า"
    อีแอลอี(ZF=1 หรือ SF≠OF): "น้อยกว่าหรือเท่ากับ"
    เอฟเอ็นแอลอี(ZF=0 และ SF=OF): "ไม่น้อยกว่าหรือเท่ากับ"
  28. แม้ว่าCMPccXADDคำสั่งจะดำเนินการกับหน่วยความจำที่ถูกล็อก แต่ก็ไม่ต้องการหรือยอมรับLOCK(F0h) - การพยายามใช้คำนำหน้านี้จะส่งผลให้เกิดข้อผิดพลาด #UD

เพิ่มส่วนขยายเฉพาะของ AMD อื่นๆ เข้าไปด้วย

  1. วิธีมาตรฐานในการเข้าถึงรีจิสเตอร์ CR8 คือการใช้การเข้ารหัสที่ใช้REX.Rคำนำหน้า เช่น44 0F 20 07(MOV RDI,CR8) อย่างไรก็ตามREX.Rคำนำหน้าดังกล่าวมีให้ใช้งานเฉพาะในโหมด 64 บิตเท่านั้นส่วนขยาย AltMovCr8 เพิ่มวิธีการเพิ่มเติมในการเข้าถึง CR8 โดยใช้F0(LOCK) แทนREX.R– ซึ่งช่วยให้สามารถเข้าถึง CR8 นอกโหมด 64 บิตได้
  2. 1 2เช่นเดียวกับคำสั่ง MOV รูปแบบอื่นๆ ที่ใช้กับรีจิสเตอร์ CRx การเข้ารหัส AltMovCr8 จะไม่สนใจบิต 2 บิตบนสุดของไบต์ ModR/M ของคำสั่ง และจะดำเนินการเสมือนว่าบิตทั้งสองนี้ถูกตั้งค่าเป็น null11bการเข้ารหัส AltMovCr8 สามารถใช้งานได้ในโหมด 64 บิต อย่างไรก็ตาม การรวมLOCKคำนำหน้ากับREX.Rคำนำหน้าอื่นๆ ไม่ได้รับอนุญาต และจะทำให้เกิดข้อยกเว้น #UD
  3. การรองรับ AltMovCR8 ถูกเพิ่มเข้ามาในรุ่น F ของ AMD K8 และไม่มีในรุ่นก่อนหน้า
  4. สำหรับCLZEROขนาดที่อยู่และคำนำหน้า 67h จะควบคุมว่าจะใช้ AX, EAX หรือ RAX เป็นที่อยู่หรือไม่ เซ็กเมนต์เริ่มต้น DS: สามารถถูกแทนที่ได้ด้วยคำนำหน้าเซ็กเมนต์โอเวอร์ไรด์ ที่อยู่ที่ให้มาไม่จำเป็นต้องจัดเรียง – ฮาร์ดแวร์จะจัดเรียงตามความจำเป็นนี้CLZEROมีจุดประสงค์เพื่อกู้คืนจากข้อผิดพลาด Machine Check ที่ร้ายแรง คำสั่งนี้ไม่สามารถแคชได้ ไม่สามารถใช้เพื่อจัดสรรแคชไลน์โดยไม่ต้องเข้าถึงหน่วยความจำ และไม่ควรใช้สำหรับการล้างหน่วยความจำอย่างรวดเร็ว [ 170 ]
  5. หมายเลขรีจิสเตอร์ที่ใช้โดยRDPRUอาจไม่ตรงกับของRDMSR/รีจิสเตอร์ที่รองรับโดยณ เดือนธันวาคม 2022 มีดังนี้ WRMSR:RDPRU
    อีซีเอ็กซ์ลงทะเบียน
    0MPERF (MSR 0E7h: จำนวนสัญญาณนาฬิกาความถี่ประสิทธิภาพสูงสุด)
    1APERF (MSR 0E8h: จำนวนนาฬิกาความถี่ประสิทธิภาพจริง)
    ค่าที่ไม่รองรับใน ECX จะส่งคืนค่า 0
  6. ถ้า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

  1. โคโปรเซสเซอร์ x87 (นอกเหนือจาก 8087) จัดการข้อยกเว้นในลักษณะที่ค่อนข้างผิดปกติ เมื่อคำสั่ง x87 สร้างข้อยกเว้นทางคณิตศาสตร์ที่ไม่ได้ปิดบังไว้ คำสั่งนั้นจะยังคงทำงานให้เสร็จสมบูรณ์โดยไม่ทำให้เกิดข้อผิดพลาดของ CPU – แทนที่จะทำให้เกิดข้อผิดพลาด คำสั่งนั้นจะบันทึกข้อมูลที่จำเป็นในการจัดการข้อยกเว้น (ตัวชี้คำสั่ง, รหัสการทำงาน, ตัวชี้ข้อมูลหากคำสั่งนั้นมีตัวถูกดำเนินการในหน่วยความจำ) ไว้ในโคโปรเซสเซอร์ และตั้งค่าแฟล็กสถานะคำของ FPU เพื่อระบุว่ามีข้อยกเว้นที่รออยู่ ข้อยกเว้นที่รออยู่นี้จะทำให้เกิดข้อผิดพลาดของ CPU เมื่อWAITมีการดำเนินการคำสั่ง x87, MMX หรือคำสั่งข้อยกเว้นสำหรับเรื่องนี้คือคำสั่ง "Non-Waiting" ของ x87 ซึ่งจะทำงานโดยไม่ทำให้เกิดข้อผิดพลาดดังกล่าวแม้ว่าจะมีข้อยกเว้นที่รออยู่ (โดยมีข้อควรระวังบางประการ โปรดดูหมายเหตุการใช้งาน AP-578 [ 171 ] ) คำสั่งเหล่านี้ส่วนใหญ่เป็นคำสั่งควบคุมที่สามารถตรวจสอบและ/หรือแก้ไขสถานะข้อยกเว้นที่รออยู่ของ FPU x87 ได้
  2. สำหรับคำสั่ง x87 ที่ไม่รอการตอบสนองแต่ละคำสั่งที่มีตัวย่อขึ้นต้นด้วยFNN จะมีคำสั่งเสมือนที่มีตัวย่อเดียวกัน ยกเว้นไม่มี N คำสั่งเสมือนเหล่านี้ประกอบด้วยWAITคำสั่ง (รหัสการทำงาน9B) ตามด้วยคำสั่ง x87 ที่ไม่รอการตอบสนองที่สอดคล้องกัน ตัวอย่างเช่น:
    • FNCLEXเป็นคำสั่งที่มีรหัสปฏิบัติการ จากนั้น DB E2คำสั่งเสมือนที่เกี่ยวข้องFCLEXจะถูกเข้ารหัส9B DB E2เป็น
    • FNSAVE ES:[BX+6]เป็นคำสั่งที่มีรหัสปฏิบัติการ (opcode 26 DD 77 06) จากนั้นคำสั่งเสมือนที่สอดคล้องกันFSAVE ES:[BX+6]จะถูกเข้ารหัสเป็น9B 26 DD 77 06
    คำสั่งเสมือนเหล่านี้มักได้รับการยอมรับจากแอสเซมเบลอร์และดีแอสเซมเบลอร์ของ x86 และถูกมองว่าเป็นคำสั่งเดียว แม้ว่าซีพียู x86 ทั้งหมดที่มีโคโปรเซสเซอร์ x87 จะประมวลผลคำสั่งเหล่านี้เป็นลำดับของสองคำสั่งก็ตาม
  3. 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
    รีจิสเตอร์ข้อมูลถูกทำเครื่องหมายว่าว่างเปล่า แต่ไม่ได้ถูกแก้ไขอย่างอื่น
  4. บน FPU รุ่น 80387 และรุ่นก่อนหน้า หากFNINITมีการออกคำสั่งก่อนที่คำสั่ง x87 ที่อ้างอิงหน่วยความจำก่อนหน้าจะเสร็จสมบูรณ์ รอบการทำงานของบัสหน่วยความจำที่เกี่ยวข้องกับคำสั่ง x87 ก่อนหน้านั้นอาจถูกยกเลิก [ 173 ]
  5. 1 2สำหรับการตรวจจับโคโปรเซสเซอร์ x87 บนระบบที่ไม่รองรับCPUIDมักจะออกคำสั่งFNINITตามด้วยFNSTCWหรือFNSTSWแล้วตรวจสอบว่าFNSTCW/FNSTSWเขียนค่าที่คาดหวังลงในหน่วยความจำ บน 8087 ขั้นตอนการตรวจจับดังกล่าวต้องใช้คำสั่งจำนวนเต็มอย่างน้อยสองคำสั่งคั่นระหว่าง/FNINITที่ตามมาเพื่อให้ทำงานได้อย่างถูกต้อง [ 172 ]FNSTCWFNSTSW
  6. F(N)STSWการใช้งานรีจิสเตอร์ AX เป็นปลายทางนั้นมีให้ใช้งานในรุ่น 80287 และรุ่นที่ใหม่กว่า แต่ไม่มีในรุ่น 8087
  7. 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
  8. 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 ใดๆ
  9. 1 2 3FST /FSTPที่มีปลายทาง 80 บิต (m80 หรือ st(i)) และค่าแหล่งที่มา sNaN ได้รับการบันทึกไว้ว่าจะทำให้เกิดข้อยกเว้นบน AMD FPU แต่ไม่ใช่ Intel
  10. FSTP ST(0)เป็นสำนวนที่ใช้กันทั่วไปสำหรับการดึงค่ารีจิสเตอร์เดียวออกจากสแต็กของรีจิสเตอร์ x87
  11. 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 ]
  12. 1 2บน 8087 และ 80287FBSTPคำสั่งโหลดค่าคงที่จะใช้โหมดการปัดเศษแบบปัดขึ้นเป็นค่าที่ใกล้ที่สุดเสมอ บน 80387 และหน่วยประมวลผลทศนิยม x87 รุ่นต่อมา คำสั่งเหล่านี้จะใช้โหมดการปัดเศษที่ระบุไว้ในรีจิสเตอร์ RC ของ x87
  13. 1 2 3 4 5 6 7 8 9สำหรับFADDP,FSUBP,FSUBRP,FMULP,FDIVP,FDIVRP,FCOM,FCOMPและFXCHตัวประกอบ/ตัวแยกส่วนประกอบ x86 อาจรู้จักรูปแบบต่างๆ ของคำสั่งที่ไม่มีอาร์กิวเมนต์ รูปแบบดังกล่าวเทียบเท่ากับรูปแบบที่ใช้ st(1) เป็นอาร์กิวเมนต์แรก
  14. บนโปรเซสเซอร์ Intel Pentium และรุ่นที่ใหม่กว่าFXCHคำสั่งนี้ถูกนำไปใช้ในรูปแบบของการเปลี่ยนชื่อรีจิสเตอร์ แทนที่จะเป็นการย้ายข้อมูลจริง ซึ่งไม่มีผลทางความหมาย แต่ช่วยให้การทำงานมีความหน่วงเป็นศูนย์รอบการทำงาน นอกจากนี้ยังช่วยให้คำสั่งสามารถตัดการพึ่งพาข้อมูลสำหรับค่าบนสุดของสแต็ก x87 ซึ่งช่วยปรับปรุงประสิทธิภาพที่ทำได้สำหรับโค้ดที่ปรับให้เหมาะสมกับโปรเซสเซอร์เหล่านี้
  15. 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 ]

  16. 1 2สำหรับFIST`and`FISTPหากค่าบนสุดของสแต็ก หลังจากปัดเศษเป็นจำนวนเต็มแล้ว มีค่าเล็กเกินไปหรือใหญ่เกินไปที่จะแสดงในรูปแบบหน่วยความจำปลายทาง ค่าที่จัดเก็บในหน่วยความจำจะไม่ถูกจำกัด แต่จะจัดเก็บค่า "Integer Indefinite" ของ x87 แทน ซึ่งเป็นค่าที่มีบิตบนสุดเป็น 1 และบิตอื่นๆ เป็น 0 (เช่น0x8000สำหรับจำนวนเต็ม 16 บิต) ค่า Integer Indefinite จะถูกใช้เช่นกันหากค่าบนสุดของสแต็กว่างเปล่า, NaN หรือ ±∞
  17. ผลลัพธ์ของการดำเนินการFBLDคำสั่งกับข้อมูลที่ไม่ใช่ BCD นั้นไม่สามารถระบุได้
  18. สำหรับFBSTPคำสั่งนี้ หากค่าบนสุดของสแต็กเป็น NaN หรือมีค่าที่1018{\displaystyle 10^{18}}หรือมากกว่าหลังจากปัดเศษ ค่า "BCD Indefinite" ของ x87 จะถูกจัดเก็บไว้ บน 486 และรุ่นต่อมา ค่านี้คือ0xFFFFC000000000000000ในขณะที่ FPU x87 รุ่นก่อนหน้า0xFFFF8000000000000000ใช้[ 184 ]
  19. 1 2ในโปรเซสเซอร์ Intel Pentium รุ่นแรกๆ การหารจุดลอยตัวได้รับผลกระทบจากบั๊ก Pentium FDIV ซึ่งส่งผลกระทบ ต่อคำสั่งที่ทำการหารเป็นส่วนหนึ่งของการดำเนินการFPREMเช่นFPTANและFPATAN[ 185 ]
  20. คำสั่ง นี้FXAMจะตั้งค่า C0, C2 และ C3 โดยอิงตามประเภทค่าใน st(0) ดังต่อไปนี้:
    ซี3ซี2C0การจำแนกประเภท
    000ไม่รองรับ (ผิดปกติหรือหลอก-NaN)
    001นาเอ็น
    010จำนวนจำกัดปกติ
    011อินฟินิตี้
    100ศูนย์
    101ว่างเปล่า
    110เลขผิดปกติ
    111ว่างเปล่า (อาจเกิดขึ้นเฉพาะในรุ่น 8087/80287 เท่านั้น)
    C1 จะถูกตั้งค่าเป็นบิตเครื่องหมายของ st(0) โดยไม่คำนึงว่า st(0) จะว่างเปล่าหรือไม่
  21. สำหรับ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 ]
  22. สำหรับFPREMกรณีที่ผลหาร Qมีค่ามากกว่า263{\displaystyle 2^{63}}ถ้าเช่นนั้น การคำนวณเศษเหลืออาจทำไปเพียงบางส่วนเท่านั้น ในกรณีนี้FPREMจะต้องรันคำสั่งอีกครั้งเพื่อให้การคำนวณเศษเหลือเสร็จสมบูรณ์ ซึ่งจะแสดงโดยการตั้งค่าคำสั่งC2เป็น 1 ถ้าคำสั่งคำนวณเศษเหลือเสร็จสมบูรณ์แล้ว จะตั้งค่าC2เป็น 0 และตั้งค่าสามบิต{C0,C3,C1}ล่างสุดเป็นสามบิตล่างสุดของผลหารQ บนโปรเซสเซอร์ 80387 และรุ่นที่ใหม่กว่า ถ้าคำสั่งคำนวณเศษเหลือไม่เสร็จสมบูรณ์ เศษเหลือที่คำนวณได้Qที่ใช้สำหรับการลดอาร์กิวเมนต์จะถูกปัดเศษให้เป็นพหุคูณของ 8 (หรือกำลังของ 2 ที่มากกว่า) เพื่อให้สามบิตล่างสุดของผลหารยังคงสามารถดึงได้อย่างถูกต้องในการประมวลผลครั้งต่อไปที่ทำการคำนวณเศษเหลือเสร็จสมบูรณ์
  23. การคำนวณเศษเหลือที่ดำเนินการโดยFPREMคำสั่งนี้จะแม่นยำเสมอโดยไม่มีข้อผิดพลาดจากการปัดเศษ
  24. สำหรับFSCALEคำสั่ง 8087 และ 80287 นั้น st(1) จะต้องอยู่ในช่วง215ที(1)<215{\displaystyle -2^{15}\leq st(1)<2^{15}}นอกจากนี้ ค่าสัมบูรณ์ของมันต้องเป็น 0 หรืออย่างน้อย 1 หากไม่เป็นไปตามข้อกำหนดเหล่านี้ ผลลัพธ์จะไม่มีค่าที่แน่นอนข้อจำกัดเหล่านี้ถูกยกเลิกในเวอร์ชัน 80387 แล้ว
  25. สำหรับFSCALEกรณีนี้ การปัดเศษจะใช้เฉพาะในกรณีที่ค่าเกิน ค่าต่ำกว่าค่าที่กำหนด หรือผลลัพธ์ต่ำกว่าปกติเท่านั้น
  26. คำสั่งเชิงอภิปรัชญาของ x87 ไม่ปฏิบัติตาม PC หรือ RC แต่จะคำนวณผลลัพธ์แบบเต็ม 80 บิต ผลลัพธ์เหล่านี้อาจไม่ได้ปัดเศษอย่างถูกต้องเสมอไป (ดูปัญหาของผู้สร้างตาราง ) – อาจมีข้อผิดพลาดได้ถึง ±1 ulpบน Pentiumหรือรุ่นที่ใหม่กว่า หรือถึง ±1.5 ulps บนโคโปรเซสเซอร์ x87 รุ่นก่อนหน้า
  27. 1 2สำหรับFYL2XandFYL2XP1ขอบเขตข้อผิดพลาดสูงสุด ±1 ulp จะใช้ได้เฉพาะเมื่อ st(1)=1.0 เท่านั้น สำหรับค่า st(1) อื่นๆ ขอบเขตข้อผิดพลาดจะเพิ่มขึ้นเป็น ±1.35 ulpsFYL2Xสามารถสร้าง #Z (ข้อยกเว้นการหารด้วยศูนย์) ได้หาก st(0)=0 และ st(1) เป็นค่าจำกัดที่ไม่ใช่ศูนย์FYL2XP1อย่างไรก็ตาม ไม่สามารถสร้าง #Z ได้
  28. สำหรับกรณีFPATANนี้ จะมีการปรับเปลี่ยนดังต่อไปนี้เมื่อเปรียบเทียบกับการคำนวณค่า arctangent ของอัตราส่วนที่มีอาร์กิวเมนต์เดียวที(1)ที(0){\displaystyle {\frac {st(1)}{st(0)}}}:
    • ถ้าทั้ง st(0) และ st(1) เป็น ±∞ การคำนวณ arctangent จะทำเสมือนว่า st(0) และ st(1) แต่ละตัวถูกแทนที่ด้วย ±1 ที่มีเครื่องหมายเดียวกัน ซึ่งจะทำให้ได้ผลลัพธ์ที่เป็นจำนวนคี่เท่าของπ4{\displaystyle {\frac {\pi }{4}}}.
    • ถ้าทั้ง st(0) และ st(1) เป็น ±0 การคำนวณ arctangent จะเป็นเสมือนว่า st(0) แต่ไม่ใช่ st(1) ถูกแทนที่ด้วย ±1 ที่มีเครื่องหมายเดียวกัน ทำให้ได้ผลลัพธ์เป็น ±0 หรือ±π{\displaystyle \pm \pi }.
    • ถ้า st(0) เป็นค่าลบ (มีบิตเครื่องหมายถูกตั้งค่า) แล้วผลบวกของ±π{\displaystyle \pm \pi }โดยมีเครื่องหมายเดียวกันกับ st(1) จะถูกเพิ่มเข้าไปในผลลัพธ์
  29. แม้ว่าFNOPคำสั่งนี้จะไม่มีผลใดๆ ในแง่ที่ว่าสแต็กของรีจิสเตอร์ x87 FPU จะไม่ถูกแก้ไข แต่ก็อาจยังคงแก้ไขค่า FIP และ CC ได้ และอาจเกิดข้อผิดพลาดหากมีข้อยกเว้น x87 FPU ที่รอการแก้ไขอยู่
  30. ในหน่วยประมวลผลทศนิยม 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เช่นกัน

  31. หากรีจิสเตอร์ด้านบนสุดของสแต็ก st(0) ว่างเปล่าFSTPNCEคำสั่งจะทำงานเหมือนกับFINCSTPการเพิ่มตัวชี้สแต็กโดยไม่มีการเคลื่อนย้ายข้อมูลและไม่มีการรายงานข้อยกเว้น

คำสั่ง x87 ถูกเพิ่มเข้ามาในโปรเซสเซอร์รุ่นหลังๆ

  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 ]

  2. ไม่รวมคำสั่งที่ยกเลิกไปแล้วซึ่งเฉพาะเจาะจงสำหรับรุ่น FPU ที่เข้ากันได้กับ 80387 บางรุ่น
  3. 1 2สำหรับFUCOMand นั้นFUCOMPตัวประกอบ/ตัวแยกส่วนประกอบ x86 อาจรู้จักรูปแบบต่างๆ ของคำสั่งที่ไม่มีอาร์กิวเมนต์ รูปแบบดังกล่าวเทียบเท่ากับรูปแบบที่ใช้ st(1) เป็นอาร์กิวเมนต์แรก
  4. คำสั่ง 80387FPREM1แตกต่างจากFPREM(D9 F8) รุ่นเก่าตรงที่ผลหาร Qจะถูกปัดเศษเป็นจำนวนเต็มโดยใช้การปัดเศษเป็นเลขคู่ที่ใกล้ที่สุด แทนที่จะปัดเศษเป็นศูนย์เหมือนที่ใช้โดยFPREMเช่นเดียวFPREMกับFPREM1จะคำนวณผลลัพธ์ที่แม่นยำเสมอโดยไม่มีข้อผิดพลาดจากการปัดเศษ เช่นเดียวFPREMกับ อาจทำการคำนวณบางส่วนหากผลหารมีขนาดใหญ่เกินไป ในกรณีนี้จะต้องเรียกใช้ใหม่อีกครั้ง
  5. 1 2 3เนื่องจากการลดอาร์กิวเมนต์ของ x87 FPU สำหรับ sin/cos ด้วยความแม่นยำเพียงประมาณ 68 บิต ค่าของ kที่ใช้ในการคำนวณFSIN,FCOSและFSINCOSจึงไม่ใช่ 1.0 อย่างแม่นยำ แต่จะได้รับจาก [ 188 ] [ 189 ] [ 173 ]เค=266*π266*π1.0000000000000000000012874{\displaystyle k{=}{\frac {2^{66}*\pi }{\lfloor 2^{66}*\pi \rfloor }}\approx 1.0000000000000000000012874}ความคลาดเคลื่อนในการลดข้อโต้แย้งนี้ส่งผลกระทบต่อFPTANคำแนะนำ ด้วยเช่นกัน

    ตัวอย่างของตัวเลขที่ทำให้เกิดความแตกต่างเชิงสัมพัทธ์ขนาดใหญ่ระหว่างFSINคำสั่งและฟังก์ชันไซน์ทางคณิตศาสตร์ ได้แก่:

    • สำหรับx=2646693125139304345{\displaystyle x=2646693125139304345}จะFSINให้ผลลัพธ์ประมาณ0.003407{\displaystyle -0.003407}ในขณะที่มูลค่าที่แท้จริงของบาป(x){\displaystyle \sin \left(x\right)}ประมาณ1.188*1020{\displaystyle 1.188*10^{-20}}.
    • สำหรับx=1838419787915897336{\displaystyle x=1838419787915897336}จะFSINให้ผลลัพธ์ประมาณ1.084*1019{\displaystyle 1.084*10^{-19}}ในขณะที่มูลค่าที่แท้จริงของบาป(x){\displaystyle \sin \left(x\right)}ประมาณ0.002366{\displaystyle 0.002366}.
  6. ถ้า st(0) มีค่าจำกัดและค่าสัมบูรณ์ของมันคือ263{\displaystyle 2^{63}}หรือมากกว่านั้น ค่า st(0) บนสุดของสแต็กจะไม่ถูกแก้ไข และ C2 จะถูกตั้งค่าโดยไม่มีข้อยกเว้นใดๆ สิ่งนี้ใช้ได้กับ คำสั่ง FSIN, FCOSและFSINCOSเช่นเดียวกับFPTANบน 80387 และรุ่นที่ใหม่กว่าในกรณีนี้ คำสั่ง FSINCOSและFPTANจะงดเว้นการผลักค่าลงบนสแต็กรีจิสเตอร์ x87 ด้วย
  7. คำFCOMI,FCOMIP,FUCOMIและFUCOMIPจะเขียนผลลัพธ์ลงในZF,CFและPFของEFLAGSรีจิสเตอร์ บนโปรเซสเซอร์ Intel แต่ไม่ใช่ AMD บิต ,SFและAFของOFจะEFLAGSถูกตั้งค่าเป็นศูนย์ด้วยคำสั่งเหล่านี้
  8. คำFXSAVE`and`FXRSTORถูกเพิ่มเข้ามาในรุ่น "Deschutes" ของ Pentium II และไม่มีอยู่ในรุ่น "Klamath" ก่อนหน้านี้ คำสั่งเหล่านี้มีอยู่ใน AMD K7 ด้วยนอกจากนี้ยังถือว่าเป็นส่วนสำคัญของ SSE ดังนั้นจึงมีอยู่ในโปรเซสเซอร์ทุกตัวที่มี SSE
  9. 1 2คำFXSAVE`and`FXRSTORจะบันทึก/กู้คืนสถานะ SSE เฉพาะบนโปรเซสเซอร์ที่รองรับ SSE เท่านั้น มิฉะนั้น จะบันทึก/กู้คืนเฉพาะสถานะ x87 และ MMX เท่านั้นส่วน x87 ของสถานะที่บันทึก/กู้คืนโดยFXSAVE(64)`/`FXRSTOR(64)มีโครงสร้างข้อมูลที่แตกต่างอย่างสิ้นเชิงจากF(N)SAVE`/`FRSTORทำให้สามารถบันทึก/กู้คืนได้เร็วขึ้นโดยหลีกเลี่ยงการโหลดและจัดเก็บที่ไม่ตรงแนวFXSAVEและFXRSTORต้องใช้พารามิเตอร์หน่วยความจำที่จัดเรียงแบบ 16 ไบต์
  10. 1 2เมื่อเปิดใช้งานการจำลองจุดลอยตัวด้วยCR0.EM=1และจะถือว่าเป็นคำสั่ง x87 และจะทำให้เกิดข้อยกเว้น #NM (อุปกรณ์ไม่พร้อมใช้งาน) ตามนั้นFXSAVE(64)นอกเหนือจากแล้วนี่คือรหัสคำสั่งเดียวที่อยู่นอกพื้นที่รหัสคำสั่ง ESC ที่แสดงพฤติกรรมนี้ยกเว้นบนซีพียู Netburst (ตระกูล Pentium 4) รหัสคำสั่งทั้งหมดในจะสร้าง #NMหากแม้แต่รหัสคำสั่งที่ไม่ได้กำหนดไว้ซึ่งจะสร้าง #UDในกรณีอื่นก็ตามFXRSTOR(64)WAITD8..DFD8..DFCR0.EM=1
  11. แตกต่างจาก คำสั่งเดิมนี้จะไม่เริ่มต้น FPU หลังจากบันทึกสถานะลงในหน่วยความจำ แต่จะปล่อยสถานะของโคโปรเซสเซอร์ x87 ไว้โดยไม่เปลี่ยนแปลงF(N)SAVEFXSAVE
  12. 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
  13. เช่นเดียวกับคำสั่งเก่า ๆนี้FISTTPจะจัดเก็บค่า "จำนวนเต็มไม่จำกัด" ของ x87 หากค่าบนสุดของสแต็กมีขนาดเล็ก/ใหญ่เกินกว่าที่จะแสดงในรูปแบบปลายทางของหน่วยความจำได้FISTFISTP

คำแนะนำSIMD

คำสั่งการเข้ารหัส

คำแนะนำเกี่ยวกับการจำลองเสมือน

คำแนะนำอื่นๆ

นอกจากนี้ x86 ยังรวมถึงชุดคำสั่งที่เลิกใช้แล้ว ซึ่งไม่ได้รับการสนับสนุนจาก Intel และ AMD อีกต่อไป และคำสั่งที่ไม่ได้รับการบันทึกไว้ ซึ่งสามารถทำงานได้แต่ไม่มีการบันทึกไว้อย่างเป็นทางการ

คำสั่ง x86 ที่ไม่ได้บันทึกไว้

ซีพียู x86 มีคำสั่งที่ไม่ได้รับการบันทึกไว้ซึ่งถูกนำไปใช้งานบนชิปแต่ไม่ได้ระบุไว้ในเอกสารทางการบางฉบับ สามารถค้นหาได้จากแหล่งข้อมูลต่างๆ บนอินเทอร์เน็ต เช่นรายการ Interrupt List ของ Ralf Brownและที่sandpile.org

คำสั่งเหล่านี้บางส่วนมีให้ใช้งานอย่างแพร่หลายในซีพียู x86 หลายรุ่น/ส่วนใหญ่ ในขณะที่คำสั่งอื่นๆ นั้นจำเพาะเจาะจงกับซีพียูบางรุ่นเท่านั้น

คำสั่งที่ไม่ได้รับการบันทึกไว้ แต่มีให้ใช้งานอย่างแพร่หลายในซีพียู x86 หลายรุ่น ได้แก่

คำสั่งที่ไม่ได้รับการบันทึกไว้ ซึ่งปรากฏเฉพาะในซีพียู x86 บางรุ่นเท่านั้น ได้แก่

คำสั่ง x87 ที่ไม่ได้บันทึกไว้

เทคนิคช่วยจำรหัสปฏิบัติการคำอธิบายสถานะ
FENI,

FENI8087_NOP

DB E0การเปิดใช้งานอินเตอร์รัปต์ FPU (8087)เอกสารสำหรับ Intel 80287 [ 177 ]

มีอยู่ในหน่วยประมวลผลทศนิยม (FPU) Intel x87 ทุกรุ่นตั้งแต่ 80287 เป็นต้นไป สำหรับ FPU รุ่นอื่นๆ นอกเหนือจากรุ่นที่เริ่มใช้ (8087 สำหรับFENI/ FDISIและ 80287 สำหรับFSETPM) จะทำหน้าที่เป็นNOPs

คำสั่งเหล่านี้และการทำงานของคำสั่งเหล่านี้บนซีพียูรุ่นใหม่ มักถูกกล่าวถึงในเอกสารของ Intel รุ่นหลังๆ แต่จะละเว้นรหัสคำสั่งและเว้นว่างรายการในตารางรหัสคำสั่งไว้ (เช่นIntel SDM 325462-077 เดือนเมษายน 2022กล่าวถึงคำสั่งเหล่านี้สองครั้งโดยไม่มีรหัสคำสั่ง)

อย่างไรก็ตาม Intel XED รู้จักโอเปอเรเตอร์โค้ดเหล่านี้[ 247 ]

FDISI,

FDISI8087_NOP

DB E1FPU ปิดใช้งานการขัดจังหวะ (8087)
FSETPM,

FSETPM287_NOP

DB E4FPU ตั้งค่าโหมดป้องกัน (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 ] (เอกสารประกอบสำหรับซีพียูเหล่านี้ทั้งหมดระบุรหัสคำสั่งสิบตัวเดียวกัน)

ยังไม่ทราบวิธีการทำงานที่แท้จริงของฟังก์ชันเหล่านี้ และยังไม่ทราบด้วยว่าวิธีการทำงานของฟังก์ชันเหล่านี้เหมือนกันในซีพียูทุกตัวหรือไม่

ดูเพิ่มเติม

  • เอกสารข้อมูลโปรเซสเซอร์ AMD-K6ที่เก็บถาวรเมื่อวันที่ 4 มีนาคม 2023 ที่ Wayback Machineหมายเลขคำสั่ง 20695H/0 เดือนมีนาคม 1998 ส่วนที่ 24.2 หน้า 283
  • George Dunlap,การยกระดับสิทธิ์ SYSRET ของ Intel ,โครงการ Xen, 13 มิถุนายน 2012.เก็บถาวรเมื่อ 15 มีนาคม 2019.
  • คู่มือโปรแกรมเมอร์ flat assembler 1.73ส่วนที่ 2.1.19เก็บถาวรเมื่อ 28 พฤศจิกายน 2018
  • Intel, AP-485: การระบุโปรเซสเซอร์ Intel® และคำสั่ง CPUID เก็บถาวรเมื่อ 30 มกราคม 2023 ที่ Wayback Machineหมายเลขคำสั่ง 241618-039 พฤษภาคม 2012 ส่วนที่ 5.1.2.5 หน้า 32
  • Michal Necasek, "SYSENTER, คุณอยู่ที่ไหน?" , 20 กรกฎาคม 2017.เก็บถาวรเมื่อ 29 พฤศจิกายน 2023.
  • AMD,คู่มือการเพิ่มประสิทธิภาพโค้ดโปรเซสเซอร์ Athlon x86 , เอกสารหมายเลข 22007, ฉบับแก้ไข K, กุมภาพันธ์ 2002, ภาคผนวก F, หน้า 284.เก็บถาวรเมื่อ 13 เมษายน 2017
  • Transmeta,การจดจำโปรเซสเซอร์ เก็บถาวรเมื่อ 2023-01-19 ที่ Wayback Machine , 7 พฤษภาคม 2002
  • เอกสารข้อมูลโปรเซสเซอร์ VIA C3 Nehemiah เก็บถาวรเมื่อ 2023-01-08 ที่ Wayback Machineเวอร์ชัน 1.13 วันที่ 29 กันยายน 2004 หน้า 17
  • CPU-World, CPUID สำหรับ Intel Xeon 3.40 GHz เก็บถาวรเมื่อ 2022-10-26 ที่ Wayback Machine – Nocona stepping D CPUID โดยไม่มี CMPXCHG16B
  • CPU-World, CPUID สำหรับ Intel Xeon 3.60 GHz เก็บถาวรเมื่อ 2022-10-26 ที่ Wayback Machine – CPUID รุ่น Nocona stepping E พร้อมรหัส CMPXCHG16B
  • SuperUser StackExchange,โปรเซสเซอร์ x64 รุ่นเก่าที่ไม่มีคำสั่ง cmpxchg16b แพร่หลายแค่ไหน? เก็บถาวรเมื่อ 2022-10-26 ที่ Wayback Machine
  • คำสั่ง Intel SDM หมายเลข 325462-077 เก็บถาวรเมื่อ 2023-06-02 ที่ Wayback Machineเมษายน 2022 เล่ม 2B หน้า 4-130 "MOVSX/MOVSXD-Move with Sign-Extension" ระบุว่า MOVSXD ที่ไม่มี REX.W นั้น "ไม่แนะนำ"
  • H. Peter Anvin, [ PATCH 1/1 ] x86: เพิ่ม opcode "udb" (#UD อย่างเป็นทางการถาวรในโหมด 64 บิต) เก็บถาวรเมื่อ 2025-08-20 ที่ Wayback Machineรายชื่อผู้รับจดหมาย GNU binutils 11 ส.ค. 2025
  • Anandtech,บทวิจารณ์เชิงลึก AMD Zen 3 Ryzen , 5 พฤศจิกายน 2020, หน้า 6
  • @instlatx64 (31 ตุลาคม 2020). "Saving Private Ryzen: ฟังก์ชันทดแทน PEXT/PDEP 32/64b สำหรับซีพียู #AMD (BR/#Zen/Zen+/#Zen2) โดยอิงจาก zp7 ของ @zwegner" ( ทวีต ) . สืบค้นเมื่อ20 มกราคม 2023ผ่านทางTwitter
  • Wegner, Zach (4 พฤศจิกายน 2020). "zwegner/zp7" . GitHub . เก็บถาวรจากต้นฉบับเมื่อ 20 มกราคม 2023 . เรียกดูเมื่อ20 มกราคม 2023 .
  • Intel,ข้อกำหนดเทคโนโลยีการบังคับใช้การควบคุมการไหลของโปรแกรม เก็บ ถาวรเมื่อ 2022-05-22 ที่ Wayback Machine (v3.0, หมายเลขคำสั่ง 334525-003, มีนาคม 2019)
  • Intel SDM, rev 076, ธันวาคม 2021 เก็บถาวรเมื่อ 2022-05-22 ที่ Wayback Machineเล่ม 1 ส่วนที่ 18.3.1
  • รายชื่อผู้รับจดหมาย Binutils: x86: CET v2.0: อัปเดตคำนำหน้า NOTRACK เก็บถาวรเมื่อ 2022-03-13 ที่ Wayback Machine
  • Ewan Hai, [ PATCH 2/3 ] target/i386: แนะนำโมเดล CPU ไคลเอ็นต์ Zhaoxin Shijidadao ,รายชื่อผู้รับจดหมาย qemu-devel , 22 ก.ย. 2025
  • AMD,ส่วนขยายของชุดคำสั่ง 3DNow! และ MMX เก็บถาวรเมื่อ 2023-01-01 ที่ Wayback Machineหมายเลขอ้างอิง 22466D/0 มีนาคม 2000 หน้า 11
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์สถาปัตยกรรม Intel,, หมายเลขสั่งซื้อ 253667-051, มิถุนายน 2014, รายการคำสั่งในหน้า 357 เก็บถาวรจากต้นฉบับเมื่อวันที่ 24 กรกฎาคม 2014SFENCE
  • AMD,คู่มือโปรแกรมเมอร์สถาปัตยกรรม AMD64 เล่ม 3: คำสั่งทั่วไปและคำสั่งระบบ , หมายเลขสิ่งพิมพ์ 24594, ฉบับแก้ไข 3.04, เมษายน 2546, ภาคผนวก A.2.5 หน้า 382. เก็บถาวรจากต้นฉบับเมื่อวันที่ 2 สิงหาคม 2546
  • Hadi Brais,ความสำคัญของคำสั่ง SFENCE x86 เก็บถาวรเมื่อ 2022-12-28 ที่ Wayback Machine , 26 กุมภาพันธ์ 2019
  • Intel,คู่มือสำหรับนักพัฒนาซอฟต์แวร์เก็บถาวรเมื่อ 2022-12-29 ที่ Wayback Machineหมายเลขคำสั่ง 325426-077 พฤศจิกายน 2022 เล่ม 1 ส่วนที่ 11.4.4.3 หน้า 276
  • Hadi Brais,ความสำคัญของคำสั่ง LFENCE เก็บถาวรเมื่อ 10 มิถุนายน 2023 ที่ Wayback Machine , 14 พฤษภาคม 2018
  • AMD,เทคนิคซอฟต์แวร์สำหรับการจัดการการคาดการณ์บนโปรเซสเซอร์ AMD , ฉบับปรับปรุง 3.8.22, 8 มีนาคม 2022, หน้า 4.เก็บถาวรเมื่อ 13 มีนาคม 2022.
  • Intel,คู่มือสำหรับนักพัฒนาซอฟต์แวร์ , หมายเลขสั่งซื้อ 325426-084, มิถุนายน 2024, เล่ม 3A, ส่วนที่ 11.12.3, หน้า 3411 - ครอบคลุมการใช้MFENCE;LFENCEลำดับเพื่อบังคับลำดับระหว่างการจัดเก็บหน่วยความจำและการเขียน MSR x2apic ในภายหลังเก็บถาวรเมื่อวันที่ 4 กรกฎาคม 2024
  • Intel, Prescott New Instructions Software Developer's Guide , หมายเลขสั่งซื้อ 252490-003, มิถุนายน 2546, หน้า 3-26 และ 3-38 รายการMONITORและMWAITตัวดำเนินการที่ระบุอย่างชัดเจนเก็บถาวรเมื่อวันที่ 9 พฤษภาคม 2548
  • กระดานสนทนา Flat Assembler หัวข้อ "ไวยากรณ์ BLENDVPS/BLENDVPD/PBLENDVB"ครอบคลุมถึงMONITOR/MWAITmnemonics ด้วย เก็บถาวรเมื่อ 6 พฤศจิกายน 2022
  • Intel, Intel® Xeon Phi™ Product Family x200 (KNL) โหมดผู้ใช้ (วงแหวน 3) MONITOR และ MWAIT (เก็บถาวรเมื่อ 5 มีนาคม 2017)
  • คู่มือสำหรับนักพัฒนา BIOS และ Kernel (BKDG) ของ AMD สำหรับโปรเซสเซอร์ตระกูล AMD 10h เก็บถาวรเมื่อวันที่ 8 เมษายน 2024 ที่ Wayback Machineหมายเลขคำสั่ง 31116 เวอร์ชัน 3.62 หน้า 419เก็บถาวรเมื่อวันที่ 8 เมษายน 2024ที่ Wayback Machine
  • R. Zhang และคณะ, (M)WAIT for It: การเชื่อมช่องว่างระหว่างช่องทางด้านข้างของสถาปัตยกรรมระดับจุลภาคและสถาปัตยกรรม , 3 มกราคม 2023, หน้า 5.เก็บถาวรจากต้นฉบับเมื่อ 5 มกราคม 2023
  • Intel,เอกสารอ้างอิงการเขียนโปรแกรมส่วนขยายชุดคำสั่งสถาปัตยกรรม , เลขที่สั่งซื้อ 319433-052, มีนาคม 2024, บทที่ 17.เก็บถาวรเมื่อวันที่ 7 เมษายน 2024
  • Guru3D และ VIA Zhaoxin เปิดตัวโปรเซสเซอร์ SoC x86 แบบ 4 และ 8 คอร์(เก็บถาวรเมื่อ 7 ธันวาคม 2022 ที่Wayback Machine , 22 มกราคม 2018)
  • Intel,การอัปเดตข้อมูลจำเพาะเดสก์ท็อปเจเนอเรชั่นที่ 4 , หมายเลขคำสั่ง 328899-039, เมษายน 2020, ดูข้อผิดพลาด HSD145 ในหน้า 56 เก็บถาวรจากต้นฉบับเมื่อวันที่ 6 เมษายน 2024
  • ช่องโหว่ x86: การโจมตีแบบ DoS จากการพยายามใช้ INVPCID กับที่อยู่ที่ไม่เป็นไปตามมาตรฐานเก็บถาวรเมื่อ 2022-11-08 ที่ Wayback Machine , 20 พฤศจิกายน 2018
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ของ Intel, Intel® 64 และ IA-32 Architectures เก็บถาวรเมื่อวันที่ 27 มกราคม 2023 ที่ Wayback Machineเล่มที่ 3 หมายเลขสั่งซื้อ 325384-078 ธันวาคม 2022 บทที่ 23.15
  • 1 2 Catherine Easdon,พฤติกรรม CPU ที่ไม่ได้รับการบันทึกไว้บนสถาปัตยกรรมไมโคร x86 และ RISC-V: มุมมองด้านความปลอดภัยเก็บถาวรเมื่อ 2023-03-07 ที่ Wayback Machine , 10 พฤษภาคม 2019, หน้า 39
  • Instlatx64, Zhaoxin Kaixian KX-6000G CPUID dump เก็บถาวรเมื่อ 2023-07-25 ที่ Wayback Machine , 15 พฤษภาคม 2023
  • Intel,คู่มือสำหรับนักพัฒนาซอฟต์แวร์โปรเซสเซอร์ Willamette , หมายเลขสั่งซื้อ 245355-001, กุมภาพันธ์ 2000, ส่วนที่ 3.5.3, หน้า 294 - รายการHWNT/HSTตัวย่อสำหรับคำนำหน้าคำแนะนำสาขา เก็บถาวรจากต้นฉบับเมื่อวันที่ 5 กุมภาพันธ์ 2005
  • Intel,คู่มือสำหรับนักพัฒนาซอฟต์แวร์เก็บถาวรเมื่อ 2024-05-12 ที่ Wayback Machineหมายเลขคำสั่ง 325462-083 มีนาคม 2024 - เล่ม 1 บทที่ 11.4.5 หน้า 281 และเล่ม 2A บทที่ 2.1.1 หน้า 525
  • ซอร์สโค้ด Intel XED, src/dec/xed-disas.c, บรรทัดที่ 325 , 11 พฤศจิกายน 2024.เก็บถาวรเมื่อ 24 พฤศจิกายน 2024.
  • Alan Modra,คำแนะนำเกี่ยวกับสาขา Pentium4 ,รายชื่อผู้รับจดหมาย binutils , 10 มิถุนายน 2001.เก็บถาวรเมื่อ 28 ธันวาคม 2025.
  • คู่มืออ้างอิงการเพิ่มประสิทธิภาพสถาปัตยกรรม Intel,สั่งซื้อ 248966-050US เมษายน 2024 บทที่ 2.1.1.1 หน้า 46เก็บถาวรเมื่อ 25 มกราคม 2025
  • 1 2 3 Intel,สถาปัตยกรรม Intel® Software Guard Extensions (Intel® SGX) สำหรับการจัดสรรหน่วยความจำที่ปลอดภัยเกินขีดจำกัดในสภาพแวดล้อมเสมือนจริง , 25 มิถุนายน 2017.เก็บถาวรเมื่อ 31 มีนาคม 2023
  • Intel,การอัปเดตไมโครโค้ดรันไทม์ด้วยส่วนขยาย Intel® Software Guard , กันยายน 2021, หมายเลขคำสั่ง 648682 rev 1.0.เก็บถาวรจากต้นฉบับเมื่อวันที่ 31 มีนาคม 2023
  • Intel,เอกสารข้อมูลจำเพาะของโปรเซสเซอร์ Intel® Core™ เจนเนอเรชั่นที่ 11 สำหรับเดสก์ท็อป เล่มที่ 1พฤษภาคม 2022 หมายเลขสั่งซื้อ 634648-004 ส่วนที่ 3.5 หน้า 65เก็บถาวรเมื่อวันที่ 19 กุมภาพันธ์ 2025
  • Intelแพลตฟอร์มใดบ้างที่รองรับ Intel® Software Guard Extensions (Intel® SGX) SGX2? เก็บถาวรเมื่อวันที่ 25 พฤษภาคม 2024
  • 1 2 Intel, Intel Architecture Instruction Set Extensions and Future Features , เลขที่สั่งซื้อ 319433-044, พฤษภาคม 2021, หน้า 20. เก็บถาวรจากต้นฉบับเมื่อวันที่ 3 มกราคม 2022
  • InstLatx64, Intel Core i7-1065G7 CPUID dump — มีการตั้งค่าบิตคุณสมบัติการโอเวอร์ซับสคริปชัน SGX ( CPUID.(EAX=12h,ECX=0) .EAX[6:5])เก็บถาวรเมื่อ 6 ธันวาคม 2019
  • Intel, Trust Domain CPU Architectural Extensions , เลขที่สั่งซื้อ 343754-002, พฤษภาคม 2021.เก็บถาวรเมื่อ 26 ธันวาคม 2022.
  • Intel,การแจ้งเตือนการออกจาก Enclave แบบอะซิงโครนัสและฟังก์ชัน EDECCSSA User Leaf , 30 มิถุนายน 2022.เก็บถาวรเมื่อ 21 พฤศจิกายน 2022.
  • Intel, คำสั่ง Intel Architecture Instruction Set Extensions and Future Featuresเลขที่ 319433-057, มีนาคม 2025, บทที่ 14.เก็บถาวรเมื่อ 6 เมษายน 2025
  • @InstLatX64 (3 พฤษภาคม 2022). "เรื่องราวของ CLDEMOTE" ( ทวีต ) . สืบค้นเมื่อ 23 มกราคม 2023ผ่านทางTwitter .
  • @Instlatx64 (17 เมษายน 2023). " ข้อมูล CPUID ของ Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 แบบ 20 คอร์" ( ทวีต ) . สืบค้นเมื่อ20 เมษายน 2023ผ่านทางTwitter
  • Intel,การโจมตีแบบ Branch History Injection และ Intra-mode Branch Target Injection / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598 , ID 824191, 12 พฤษภาคม 2025, เวอร์ชัน 1.0, ดูส่วน "Addressing Intra-Mode Branch Target Injection via cBPF" สำหรับคำอธิบายของคำสั่ง IBHF ใหม่เก็บถาวรเมื่อวันที่ 19 พฤษภาคม 2025
  • ซอร์สโค้ด Intelเวอร์ชันภายนอก v2026.02.17เก็บถาวรเมื่อวันที่ 24 กุมภาพันธ์ 2026
  • Intel,ข้อกำหนดสถาปัตยกรรม Intel Data Streaming Accelerator , เลขที่สั่งซื้อ 341204-004, กันยายน 2022, หน้า 13 และ 23.เก็บถาวรเมื่อ 20 กรกฎาคม 2023.
  • InstLatx64,การดัมพ์ CPUID ของ Lunar Lake — มีบิตคุณสมบัติสำหรับ PBNDKB ตั้งค่าไว้ ( CPUID.(EAX=7,ECX=1) .EBX[1])เก็บถาวรเมื่อวันที่ 14 พฤษภาคม 2025
  • Wikichip, CLZERO – x86 เก็บถาวรเมื่อ 2021-05-09 ที่ Wayback Machine
  • Intel,เอกสารประกอบการใช้งาน AP-578: ข้อควรพิจารณาด้านซอฟต์แวร์และฮาร์ดแวร์สำหรับตัวจัดการข้อยกเว้น FPU สำหรับโปรเซสเซอร์สถาปัตยกรรม Intel เก็บถาวรเมื่อ 2023-03-07 ที่ Wayback Machineหมายเลขคำสั่ง 243291-002 เดือนกุมภาพันธ์ 1997
  • 1 2 3 Intel, Application Note AP-113: การเริ่มต้นใช้งานโปรเซสเซอร์ข้อมูลเชิงตัวเลขเก็บถาวรเมื่อ 2022-10-24 ที่ Wayback Machine , กุมภาพันธ์ 1981 - ดูหน้า 7 สำหรับการตรวจจับ FPU x87 และFNINITค่าคำควบคุมบน 8087 และหน้า 24-25 สำหรับการจัดการการขัดจังหวะและแฟล็กเปิดใช้งานการขัดจังหวะของ 8087
  • 1 2 3 Intel, 80387 Programmer's Reference Manual เก็บถาวรเมื่อ 2025-01-30 ที่ Wayback Machineหมายเลขสั่งซื้อ 231917-001 ดูส่วนที่ 4.4.12 ในหน้า 89 และส่วนที่ C.5 ในหน้า 190 สำหรับข้อมูลเกี่ยวกับFXTRACTกรณีพิเศษส่วนที่ 4.4.9 ในหน้า 87 สำหรับข้อมูลเกี่ยวกับFPTAN(และโดยขยายความFSIN/FCOS/FSINCOS) และส่วนที่ 4.8.1 ในหน้า 99 สำหรับFNINITความสามารถในการยกเลิกวงจรบัสหน่วยความจำสำหรับคำสั่ง x87 ก่อนหน้า
  • Intel, 8087 Math Coprocessor เก็บถาวรเมื่อ 2022-10-24 ที่ Wayback Machineตุลาคม 1989 หมายเลขคำสั่งซื้อ 285385-007 หน้า 3-100 รูปที่ 9
  • Intel, 80287 ส่วนขยายโปรเซสเซอร์ตัวเลข HMOS 80 บิตเก็บถาวรเมื่อ 24 ตุลาคม 2022 ที่ Wayback Machineกุมภาพันธ์ 1983 หมายเลขคำสั่ง 201920-001 หน้า 14
  • คู่มือผู้ใช้ Intel iAPX86 88 เก็บถาวรเมื่อ 2022-12-05 ที่ Wayback Machine , 1981 (หมายเลขสั่งซื้อ 210201-001), หน้า 797
  • 1 2 3 คู่มืออ้างอิงสำหรับโปรแกรมเมอร์ Intel 80286 และ 80287 เก็บถาวรเมื่อ 2022-06-29 ที่ Wayback Machine , 1987 (หมายเลขสั่งซื้อ 210498-005) ดูหน้า 439 สำหรับความจำเป็นในการใช้เพื่อWAITซิงโครไนซ์ตัวดำเนินการหน่วยความจำบน 80287 และหน้า 485 สำหรับรหัสคำสั่งนามแฝงบน 80287
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ของ Intelเก็บถาวรเมื่อวันที่ 5 มกราคม 2022 ที่ Wayback Machineเล่ม 3B ฉบับแก้ไข 064 ส่วนที่ 22.18.9
  • "GCC Bugzilla – 37179 – GCC ปล่อยรหัสคำสั่ง 'ffreep' ที่ไม่ถูกต้อง"" . เก็บถาวรจากต้นฉบับเมื่อ 2022-04-09 . เรียกดูเมื่อ2022-07-26 .
  • Michael Steil, FFREEP – คำสั่งประกอบที่ไม่เคยมีอยู่จริง , 26 มิถุนายน 2006.เก็บถาวรเมื่อ 11 ตุลาคม 2025.
  • Agner Fog,วิธีการปรับแต่งประสิทธิภาพสำหรับตระกูลไมโครโปรเซสเซอร์ Pentium , 3 กรกฎาคม 2000, ดูหัวข้อ 27.8. เก็บถาวรจากต้นฉบับเมื่อ 21 พฤศจิกายน 2000
  • คลังเก็บข้อมูล Github ของ Dosbox-staging,ปัญหาที่ 1231: เกมที่มีเส้นแนวตั้ง เก็บ ถาวร เมื่อ 2025-12-05 ที่ Wayback Machine , 29 ส.ค. 2021
  • คลังเก็บข้อมูล Github ของ Dosbox-pure,ปัญหาที่ 156: (Android) ลายเส้นแนวตั้งทั่ว Carmageddon เก็บถาวรเมื่อ 2025-12-09 ที่ Wayback Machine , 10 พฤษภาคม 2021
  • Norbert Juffa,ทุกสิ่งที่คุณอยากรู้เกี่ยวกับตัวประมวลผลร่วมทางคณิตศาสตร์ , v1.6a, 1 ตุลาคม 1994.เก็บถาวรเมื่อ 18 ตุลาคม 2021.
  • ดุสโก คอนคาลิเยฟ,แมลง Pentium FDIVเก็บข้อมูลเมื่อ 22 มกราคม 1998.
  • Intel,คู่มืออ้างอิงสำหรับโปรแกรมเมอร์ i486 , 1990, หมายเลขสั่งซื้อ 240486-001, หน้า 612
  • IBM,เอกสารอ้างอิงทางเทคนิคเกี่ยวกับอินเทอร์เฟซฮาร์ดแวร์ Personal System/2 - อินเทอร์เฟซทั่วไปเก็บถาวรเมื่อ 2025-12-15 ที่ Wayback Machineหมายเลขสั่งซื้อ 84F9735 ฉบับพิมพ์ครั้งแรก ตุลาคม 1990 หน้า 16 และ 22
  • บรูซ ดอว์สัน,อินเทลประเมินขอบเขตความคลาดเคลื่อนต่ำเกินไป 1.3 ควินทิลเลียน , 9 ต.ค. 2014.เก็บถาวรเมื่อ 1 ก.ย. 2025.
  • เอกสาร Intel SDM ฉบับแก้ไข 053 เก็บถาวรเมื่อวันที่ 11 กุมภาพันธ์ 2022 ที่ Wayback Machineและเอกสารฉบับต่อมา อธิบายขั้นตอนการลดอาร์กิวเมนต์ที่ใช้สำหรับFSIN,FCOS,FSINCOSและFPTANในเล่มที่ 1 ส่วนที่ 8.3.8
  • Michal Necasek, Failing to fail , 16 มิถุนายน 2023, OS/2 Museum , ดูภาคผนวกเก็บถาวรเมื่อ 1 ตุลาคม 2024
  • ตัวติดตามปัญหาของ VirtualBox,ตั๋วหมายเลข 12646: XP Guest GPF ใน WIN87EM.DLL ที่ 0001:02C9 หรือ 0001:02C6เก็บถาวรเมื่อวันที่ 13 มีนาคม 2016
  • Robert Collins, Undocumented OpCodes: AAM .เก็บถาวรเมื่อ 21 กุมภาพันธ์ 2544
  • Retrocomputing StackExchange, 0F1h opcode-prefix บน i80286เก็บถาวรเมื่อ 13 เมษายน 2023
  • 1 2 Frank van Gilluwe, "The Undocumented PC – Second Edition", หน้า 93-95
  • Michal Necasek, Intel 486 Errata? , 6 ธันวาคม 2015.เก็บถาวรเมื่อ 29 พฤศจิกายน 2023.
  • โรเบิร์ต ฮัมเมล, "คู่มืออ้างอิงทางเทคนิคสำหรับโปรแกรมเมอร์ของนิตยสารพีซี" ( ISBN) 1-56276-016-5) หน้า 728
  • Raúl Gutiérrez Sanz,รหัสปฏิบัติการ 8086 ที่ไม่ได้บันทึกไว้, ตอนที่ 1 , 27 ธันวาคม 2017.เก็บถาวรเมื่อ 29 พฤศจิกายน 2023.
  • 1 2 "Asm, opcode 82h" . 24 ธันวาคม 1998. เก็บถาวรจากต้นฉบับเมื่อ 14 เมษายน 2023.
  • Intel Corporation 2022 , หน้า 3698.
  • Intel,คู่มือผู้ใช้ตระกูล 8086, ตุลาคม 1979 เก็บถาวรเมื่อ 2018-04-04 ที่Wayback Machine , ละเว้นโอเปอเรเตอร์โค้ดในหน้า 4-25 และ 4-31
  • Retrocomputing StackExchange,คำสั่งที่ไม่ได้รับการบันทึกในซีพียู x86 ก่อน 80386? , 4 มิถุนายน 2021.เก็บถาวรเมื่อ 18 กรกฎาคม 2023.
  • Daniel B. Sedory,การตรวจสอบ MBR มาตรฐาน , 2000.เก็บถาวรเมื่อ 6 ตุลาคม 2023.
  • AMD,คู่มือการปรับแต่งซอฟต์แวร์สำหรับโปรเซสเซอร์ AMD64 เก็บถาวรเมื่อ 30 มกราคม 2023 ที่Wayback Machine (เอกสารเผยแพร่หมายเลข 25112, ฉบับแก้ไข 3.06, กันยายน 2005), ส่วนที่ 6.2, หน้า 128
  • GCC bugzilla,บั๊กหมายเลข 48227 – "rep ret" ถูกสร้างขึ้นสำหรับ -march=core2เก็บถาวรเมื่อวันที่ 9 เมษายน 2023
  • Raymond Chen,โอ้ คุณมี NOP ที่แปลกประหลาดจัง! , 12 ม.ค. 2011.เก็บถาวรเมื่อ 20 พ.ค. 2023.
  • Jeff Parsons,ข้อมูลเกี่ยวกับซีพียู Intel 80386 (ส่วนแก้ไขข้อผิดพลาด B1, รายการที่ 7)เก็บถาวรเมื่อวันที่ 13 พฤศจิกายน 2023
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ ของ Intelเล่ม 2B เก็บถาวรเมื่อ 2022-03-04 ที่Wayback Machine (มกราคม 2006 หมายเลขสั่งซื้อ 235667-018 ไม่มี NOP แบบยาว)
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ ของ Intelเล่ม 2B เก็บถาวรเมื่อ 2022-01-07 ที่Wayback Machine (มีนาคม 2006 หมายเลขสั่งซื้อ 235667-019 มี NOP ยาว)
  • Agner Fog,ตารางคำสั่งที่เก็บถาวรเมื่อ 2020-01-10 ที่Wayback Machine , ส่วน AMD K7
  • "579838 – glibc ไม่เข้ากันกับ AMD Geode LX"เก็บถาวรจากต้นฉบับเมื่อวันที่ 30 กรกฎาคม 2023
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ ของ Intelเล่ม 2B เก็บถาวรเมื่อ 31 มีนาคม 2022 ที่Wayback Machine (เมษายน 2005 หมายเลขสั่งซื้อ 235667-015 ไม่ได้ระบุ 0F0D-nop)
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ ของ Intelเล่ม 2B เก็บถาวรเมื่อ 31 มีนาคม 2022 ที่Wayback Machine (มิถุนายน 2005 หมายเลขสั่งซื้อ 235667-016 ระบุ 0F0D-nop ในตารางรหัสคำสั่ง แต่ไม่อยู่ในNOPคำอธิบายคำสั่ง)
  • คู่มือสำหรับนักพัฒนาซอฟต์แวร์ ของ Intelเล่ม 2B เก็บถาวร เมื่อวัน ที่ 8 มกราคม 2022 ที่Wayback Machine (หมายเลขคำสั่ง 253667-060 เดือนกันยายน 2016) ไม่ได้ระบุUD0และUD1
  • "PCJS : pcjs/x86op0F.js (ตัวจัดการโอเปรนด์ x86 สองไบต์), บรรทัด 1647–1651" . GitHub . 17 เมษายน 2022. เก็บถาวรจากต้นฉบับเมื่อ 13 เมษายน 2023. 
  • "ข้อผิดพลาดในการป้องกันเพจจิ้ง 80486? \ VOGONS" . เก็บถาวรจากต้นฉบับเมื่อวันที่ 9 เมษายน 2022
  • "การจัดการโอเปรนด์ที่ไม่ถูกต้อง \ VOGONS"เก็บถาวรจากต้นฉบับเมื่อวันที่ 9 เมษายน 2022
  • "คำสั่งที่ไม่ถูกต้องทำให้โปรแกรมออก แม้ว่า Int 6 จะถูกดักจับไว้ก็ตาม \ VOGONS"เก็บถาวรจากต้นฉบับเมื่อวันที่ 9 เมษายน 2022
  • "บทช่วยสอน – การเรียกใช้ Win32 จาก DOS" . Ragestorm . 17 กันยายน 2005. เก็บถาวรจากต้นฉบับเมื่อ 9 เมษายน 2022.
  • "การเข้าถึงไดรเวอร์อุปกรณ์ Windows จากโปรแกรม DOS"เก็บถาวรจากต้นฉบับเมื่อวันที่ 8 พฤศจิกายน 2011
  • 1 2 "การถอดประกอบไมโครโค้ด 8086"บล็อกของ Reenigne 3 กันยายน 2020 เก็บถาวรจากต้นฉบับเมื่อ 8 ธันวาคม 2023 เรียกดูเมื่อ 26 กรกฎาคม 2022การใช้คำนำหน้า REP หรือ REPNE กับคำสั่ง MUL หรือ IMUL จะทำให้ผลคูณเป็นค่าลบ การใช้คำนำหน้า REP หรือ REPNE กับคำสั่ง IDIV จะทำให้ผลหารเป็นค่าลบ
  • "เรื่อง: รหัสคำสั่งที่ไม่ได้รับการบันทึก (HINT_NOP)"เก็บถาวรจากต้นฉบับเมื่อ 2004-11-06 เรียกดูเมื่อ2010-11-07
  • "เรื่อง: โอเปอเรเตอร์โค้ด 0Fh บางส่วนที่ไม่ได้บันทึกไว้"เก็บถาวรจากต้นฉบับเมื่อ 2003-06-26 เรียกดูเมื่อ2010-11-07
  • ไลบรารี RCCEของ Intelสำหรับ SCC ใช้โอเปอเรเตอร์โค้ดสำหรับคำสั่งการยกเลิกข้อความของ SCC0F 0A
  • Intel Labs, SCC External Architecture Specification (EAS), Revision 0.94 , หน้า 29.เก็บถาวรเมื่อวันที่ 22 พฤษภาคม 2022.
  • "คำสั่ง x86 ที่ไม่ได้บันทึกไว้สำหรับควบคุม CPU ในระดับสถาปัตยกรรมไมโครในโปรเซสเซอร์ Intel รุ่นใหม่" (PDF) 9 กรกฎาคม 2021
  • Robert R. Collins, Undocumented OpCodes: UMOV .เก็บถาวรเมื่อ 21 กุมภาพันธ์ 2544
  • Herbert Oppmann, NXOP (Opcode 0Fh 55h) เก็บถาวรเมื่อ 2022-04-09 ที่Wayback Machine
  • Herbert Oppmann, NexGen Nx586 Hypercode Source , ดูที่ COMMON.INC.เก็บถาวรเมื่อ 9 เมษายน 2023
  • Herbert Oppmann, Inside the NexGen Nx586 System BIOS .เก็บถาวรเมื่อ 29 ธันวาคม 2023
  • Intel, XuCode: เทคโนโลยีล้ำสมัยสำหรับการใช้งานกระบวนการคำสั่งที่ซับซ้อน , 6 พฤษภาคม 2021.เก็บถาวรเมื่อ 7 มกราคม 2026.
  • Grzegorz Mazur, AMD 3DNow! คำแนะนำที่ไม่ได้บันทึกไว้
  • 1 2 "คำแนะนำ 3DNow! ที่ไม่ได้บันทึกไว้" . grafi.ii.pw.edu.pl . เก็บถาวรจากต้นฉบับเมื่อวันที่ 30 มกราคม 2546 . เรียกดูเมื่อวันที่ 22 กุมภาพันธ์ 2565 .
  • OPCODE.LST ของกลุ่มแฮกเกอร์ Potemkin เวอร์ชัน 4.51วันที่ 15 ตุลาคม 1999เก็บถาวรเมื่อวันที่ 21 พฤษภาคม 2001
  • " [การวิเคราะห์ CPU ของ UCA ]ต้นแบบ CPU UMC Green U5S-SUPER33" 25 พฤษภาคม 2020 เก็บถาวรจากต้นฉบับเมื่อ 9 มิถุนายน 2023
  • Agner Fog,สถาปัตยกรรมไมโครของซีพียู Intel, AMD และ VIA , ส่วนที่ 3.4 "การทำนายสาขาใน P4 และ P4E"เก็บถาวรเมื่อ 7 มกราคม 2024
  • 1 2 Christopher Domas,การเจาะระบบ x86 ISA , 27 กรกฎาคม 2017.เก็บถาวรเมื่อ 27 ธันวาคม 2023.
  • 1 2 Xixing Li และคณะ, UISFuzz: วิธีการทดสอบแบบฟัซซิ่งที่มีประสิทธิภาพสำหรับการค้นหาคำสั่งที่ไม่ได้รับการบันทึกไว้ใน CPU , 9 ตุลาคม 2019, หน้า 9.เก็บถาวรเมื่อ 21 กุมภาพันธ์ 2026 ที่ Wayback Machine
  • รายงานไมโครโปรเซสเซอร์, MediaGX มุ่งเป้าไปที่พีซีราคาประหยัด (เล่มที่ 11, ฉบับที่ 3, 10 มีนาคม 1997).เก็บถาวรเมื่อ 6 มิถุนายน 2022.
  • "ยินดีต้อนรับสู่โครงการ OpenSSL" . GitHub . 21 เมษายน 2022. เก็บถาวรจากต้นฉบับเมื่อ 4 มกราคม 2022.
  • LKML, (PATCH) crypto: Zhaoxin: ไดรเวอร์ฮาร์ดแวร์สำหรับ SHA1/256/384/512 , 2 ส.ค. 2023.เก็บถาวรเมื่อ 17 ม.ค. 2024.
  • Kary Jin, PATCH: อัปเดตกลไก PadLock สำหรับซีพียู VIA C7 และ Nano ,รายชื่อผู้รับจดหมาย openssl-dev , 10 มิถุนายน 2011.เก็บถาวรเมื่อ 11 กุมภาพันธ์ 2022.
  • 1 2 รายชื่อผู้รับจดหมาย OpenEuler, PATCH kernel-4.19 v2 5/6  : x86/cpufeatures: เพิ่มบิตคุณสมบัติ Zhaoxinเก็บถาวรเมื่อ 9 เมษายน 2022
  • USPTO/Zhaoxin,คำขอสิทธิบัตร US2023/006718: โปรเซสเซอร์ที่มีอัลกอริทึมการเข้ารหัสแบบแฮชและการประมวลผลข้อมูลหน้า 13 และ 45, 2 มีนาคม 2023เก็บถาวรเมื่อ 12 กันยายน 2023
  • LKML, (PATCH) crypto: x86/sm2 -add การใช้งานอัลกอริทึม Zhaoxin SM2 , 11 พ.ย. 2023.เก็บถาวรเมื่อ 17 ม.ค. 2024.
  • 1 2 InstLatx64,ข้อมูล CPUID สำหรับ Zhaoxin KaiXian KX-6000G – มีการตั้งค่าบิตคุณสมบัติ SM2 และ xmodx ( CPUID leaf C0000001:EDX:bits 0 และ 29)เก็บถาวรเมื่อวันที่ 25 กรกฎาคม 2023
  • คำขอแก้ไข โค้ด OpenEulerหมายเลข 2602: x86/delay: เพิ่มการสนับสนุนคำสั่ง ZXPAUSE ของ Zhaoxin Gitee 26ตุลาคม 2023เก็บถาวรเมื่อ 22 มกราคม 2024
  • ไฟล์ข้อมูล ISA สำหรับ Intel XED เก็บถาวรเมื่อวันที่ 15 มิถุนายน 2022 ที่Wayback Machine (17 เมษายน 2022) บรรทัดที่ 916-944
  • เอกสารข้อมูลโปรเซสเซอร์ Cyrix 6x86 เก็บถาวรเมื่อ 2022-08-27 ที่Wayback Machineหน้า 6-34
  • เอกสารข้อมูลโปรเซสเซอร์ AMD Geode LX เก็บถาวรเมื่อวันที่ 15 มีนาคม 2019 ที่Wayback Machine , เอกสารหมายเลข 33234H, หน้า 670
    • บริษัท อินเทล คอร์ปอเรชั่น (เมษายน 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
    • รายการคำสั่งแอสเซมเบลอร์แบบเน็ตไวด์ (จากเน็ตไวด์ แอสเซมเบลอร์ )
    ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=List_of_x86_instructions&oldid=1361173850 "

    สรุปเนื้อหา

    ข้อมูลสำคัญจากบทความ

    ข้อมูลสำคัญเกี่ยวกับ รายการคำสั่ง x86

    ชุดคำสั่งx86 หมายถึงชุดคำสั่งที่ไมโครโปรเซสเซอร์ที่เข้ากันได้กับ สถาปัตยกรรม x86รองรับ โดยปกติแล้วคำสั่งเหล่านี้จะเป็นส่วนหนึ่งของ โปรแกรม

    คำสั่งจำนวนเต็ม x86

    ด้านล่างนี้คือ ชุดคำสั่ง 8086 / 8088 แบบเต็ม ของ Intel (คำสั่งทั้งหมด 81 คำสั่ง) [ 2 ] คำสั่งเหล่านี้ยังมีให้ใช้งานในโหมด 32 บิต ซึ่งจะทำงานกับรีจิสเตอร์ 32 บิต ( eax , ebx , เป็นต้น) และค่าต่างๆ แทนที่จะเป็นค่า 16 บิต ( ax , bx , เป็นต้น)...

    คำแนะนำดั้งเดิมสำหรับ 8086/8088

    นี่คือชุดคำสั่งดั้งเดิม ในคอลัมน์ 'หมายเหตุ' r หมายถึง รีจิสเตอร์ m หมาย ถึง ที่อยู่หน่วยความจำ และ imm หมายถึง ค่า คงที่ (immediate value)

    เพิ่มในโปรเซสเซอร์เฉพาะบางรุ่น

    มีการเพิ่มคำสั่งและรูปแบบคำสั่งใหม่ในโปรเซสเซอร์ Intel 80186 และ 80188 นอกจากนี้ยังพบใน โปรเซสเซอร์ NEC V20 /V30 และรุ่นต่อๆ มาด้วย