cmove:条件传输数据,避免分支,CPU无需猜测将执行哪个代码,从而避免了分支预测错误的代价,但是,CPU无法知道eax中的值是否会更改,这意味着依赖于条件移动结果的后续指令必须等待条件移动完成(而不是通过有条件地执行假定值而不是停转)。
预测分支是计算机体系结构中的一种技术,用于提高程序执行效率。在程序中存在条件分支语句(如if语句、循环等)时,预测分支技术会尝试预测分支的结果,并根据预测结果来执行相应的指令。
数据传输 | |
指令 | 作用(Intel 格式) |
MOV | mov destination(目的),source(源) 在通用寄存器之间移动数据; 在存储器和通用寄存器或段寄存器之间移动数据; 将立即数移动到通用寄存器。 mov reg,reg mov mem,reg mov reg,mem mov mem,imm mov imm,reg 注意: 1:两个操作数必须同样大小,如果源大小 > 目的大小可使用 ptr指令 mov dest,ptr souce,(PTR:复制source 同等大小的数据到dest 中,从低位开始) 2: 两个操作数不能都是内存操作数, 3:指令指针寄存器(IP,EIP,RIP) 不能作为目的操作数 |
CMOVE/CMOVZ | 条件移动: (待深入理解) CMOVE: 根据ZF(零标志=1)状态进行条件转移 CMOVZ:ZF(零标志=1)状态进行条件转移 |
CMOVNE/CMOVNZ | CMOVNE: 如果不相等 CMOVNZ:if ZF 标志 != 1 |
CMOVA/CMOVNBE | CMOVA:如果高于则条件移动 CMOVNBE:如果不低于或等于则条件移动。 |
CMOVAVE/CMOVNB | CMOVAVE:如果高于或等于 CMOVNB: 不低于 |
CMOVB/CMOVNAE | 如果低于则条件移动/如果不高于或等于则条件移动。 |
CMOVBE/CMOVNA | (如果低于或等于)/条件移动(不高于)。 |
CMOVG/CMOVNLE | 如果大于/条件移动如果不小于或等于。 |
CMOVGE/CMOVNL | 如果大于或等于)/条件移动(如不小于)。 |
CMOVL/CMOVNGE | 如果小于则条件移动/如果不大于或等于则条件移动。 |
CMOVLE/CMOVNG | 如果小于或等于则条件移动/如果不大于则条件移动。 |
CMOVC | 如果进位。CF = 1 |
CMOVNC | 如果不进位。CF = 0 |
CMOVO | 溢出时有条件移动。 OF = 1 |
CMOVNO | 如果未溢出 OF = 0 |
CMOVS | if符号(负)。SF = 1 |
CMOVNS | 无符号条件移动(非负数)。SF = 0 |
CMOVP/CMOVPE | CMOVPE奇偶校验条件移动/奇偶校验偶数条件移动。PF =1 |
CMOVNP/CMOVPO | 如果不是奇偶校验则条件移动/如果奇偶校验为奇数则条件移动。 PF = 0 |
XCHG | 交换数据, XCHG destination,source 不能两个内存直接直接交换 XCHG 指令是原子操作,即在执行过程中不会被中断或其他线程干扰。这确保了交换操作的完整性和一致性。 |
BSWAP | 字节交换: 将目标寄存器中的字节按照逆序重新排列,BSWAP reg; 不能直接内存 |
XADD | 用于执行原子的交换和加法操作,指令将源操作数的值与目标操作数进行交换,并将两个操作数的和存储到目标操作数中 |
CMPXCHG | cmpxchg dest,src 将AL、AX、EAX或RAX寄存器中的值与第一个操作数dest(目标操作数)进行比较。 如果两个值相等,则将第二个操作数src(源操作数)加载到目标操作数中。 如果不相等,则目标操作数被加载到AL、AX、EAX或RAX寄存器中 |
CMPXCHG8B | 比较 EDX:EAX 中的 64 位值与操作数(目标操作数),如果相等则交换 |
PUSH | |
POP | |
PUSHA/PUSHAD | PUSHA 指令会按照以下顺序将当前 CPU 寄存器中的值依次压入栈中:AX、CX、DX、BX、SP、BP、SI、DI。这样可以保存这些寄存器的值,以便在后续需要时进行恢复 PUSHAD 指令会按照以下顺序将当前 CPU 寄存器中的值依次压入栈中:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI,这样可以保存这些寄存器的值,以便在后续需要时进行恢复 |
POPA/POPAD | |
CWD/CDQ | CWD 指令将 AX 寄存器中的值视为一个 16 位的有符号数,并将其符号位(最高位)扩展到 DX 寄存器中的所有位。这样可以将 AX 寄存器中的有符号数扩展为一个 32 位的有符号数,存储在 DX:AX 寄存器对中 CDQ 指令将 EAX 寄存器中的值视为一个 32 位的有符号数,并将其符号位(最高位)扩展到 EDX 寄存器中的所有位。这样可以将 EAX 寄存器中的有符号数扩展为一个 64 位的有符号数,存储在 EDX:EAX 寄存器对中。 |
CBW/CWDE | CBW:指令用于将 AL 寄存器中的一个 8 位有符号数扩展为 AX 寄存器中的 16 位有符号数 CWDE:指令用于将 AX 寄存器中的一个 16 位有符号数扩展为 EAX 寄存器中的 32 位有符号数 |
MOVSX | 用于将一个有符号数或零扩展为更大的寄存器。 |
MOVZX | 用于将一个无符号数扩展为更大的寄存器。 |
二进制算术指令 | |
ADCX | 带进位的无符号整数加法。 ADC 指令使用通用寄存器作为目标操作数,而 ADCX 指令使用 XMM 寄存器作为目标操作数。因此,ADCX 主要用于执行 SIMD(单指令多数据)操作,而 ADC 用于通用目的的加法运算。 |
ADOX | 带溢出的无符号整数加法。 |
ADD | 整数加法。 |
ADC | 带进位加法。 add al 0ffh adc dl,0 例子中:al + 0ffh 的值存入al中,然后dl + add al,0ffh 的CF |
SUB | 减法。 |
SBB | 借项减法。 sub eax,2 sbb edx,0 ; edx - (上一个指令产生的进位CF) |
IMUL | 有符号乘法。 |
MUL | 无符号乘法。 |
IDIV | 有符号除法。 |
DIV | 无符号除法。 |
INC | 自增 |
DEC | 自减 |
NEG | 取反 |
CMP | 对比 |
十进制算术指令 | |
DAA | 加法后的十进制调整:用于在进行十进制调整后修正二进制编码的结果。 mov al, 35h add al, 48h ; AL = 7Dh (2进制编码,16进制数据) daa ; AL = 83h (调整后的结果,10进制显示数据) |
DAS | 减法后的十进制调整, mov bl,48h sub al,85h ; AL = 3Dh das ; AL = 37h |
AAA | 加法后的ASCII 调整 mov ah, 0 ; mov al , '8' ;AX = 0038h add al,'2' ;AX = 006Ah , ‘2’ = 32h, aaa ; AX = 0100h (对结果做ASCII 调整), or ax,3030h ; AX = 3130 = '10' (转为ASCII码) 把 AX 寄存器的高字节和低字节分别与 30h 进行按位或运算,将其转换为 ASCII 码表示的字符 |
AAS | 减法后的ASCII 调整 |
AAM | 乘法后的ASCII 调整 |
AAD | 除法后的ASCII 调整 |
逻辑指令 | |
AND | 与 |
OR | 或 |
XOR | 异或 |
NOT | 非 |
移位和旋转指令 | |
SHL | 左移 SHL dest,soucre CF = dest 最后移出的值, |
SHR | 右移操作,并在最高位上填充 0。 SHR destination, count CF = dest 最后移出的值 |
SAL | 算术左移操作,二进制数向左移动指定的位数,并在最低位上填充 0 SAL destination, count 符号位时会保持其原始值 |
SAR | 算术右移: 保持符号位的值不变 |
SHLD | SHLD destination, source, count (dest 左移count位,然后将source 的高count位填充到dest 的count 个低位) dest 移出的最后地位 复制给cf |
SHRD | SHRD destination, source, count (dest 右移count位,然后将source 的低count位填充到dest 的count 个高位) dest 移出的最后地位 复制给cf |
ROR | 循环右移, 循环右移动count 位, 每移动一次,低位的值复制到CF 和最高位中 roR dest,count |
ROL | 循环左移 rol dest,count |
RCR | 带进位循环右移: CF 的值填充到高位,低位的填充到CF,循环移动 |
RCL | 带进位循环左移: CF 的值填充到低位,高位的填充到CF,循环移动 |
位和字节指令 | |
BT | 用于测试一个位是否被设置为 1 BT source, bit MOV AL, 0b10101011 ; 将二进制数 10101011 装载到 AL 寄存器中 BT AL, 2 ; 测试 AL 的第 3 位(从右往左数,从 0 开始计数) |
BTS | 用于将指定位设置为 1 BTS destination, bit MOV AL, 0b10101011 ; 将二进制数 10101011 装载到 AL 寄存器中 BTS AL, 2 ; 设置 AL 的第 3 位(从右往左数,从 0 开始计数) |
BTR | 用于将指定位清零 BTR destination, bit MOV AL, 0b10101011 ; 将二进制数 10101011 装载到 AL 寄存器中 BTR AL, 2 ; 清除 AL 的第 3 位(从右往左数,从 0 开始计数) |
BTC | 将指定位取反 BTC destination, bit MOV AL, 0b10101011 ; 将二进制数 10101011 装载到 AL 寄存器中 BTC AL, 2 ; 切换 AL 的第 3 位(从右往左数,从 0 开始计数) |
BSF | 用于在一个操作数中查找并返回最低位(最右边)的置位位 BSF destination, source MOV AX, 0b00110000 ; 将二进制数 00110000 装载到 AX 寄存器中 BSF BX, AX ; 在 AX 中扫描最低位开始扫描到1 的位数, BX = 4 |
BSR | |
SETE/SETZ | 根据 ZF(零标志位)的值设置一个目标操作数为 1 或 0。 SETE destination SETZ destination CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETE CX ; 如果 AX 等于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETNE/SETNZ | 用于根据 ZF(零标志位)的值设置一个目标操作数为 1 或 0。 SETNE destination SETNZ destination CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETNE CX ; 如果 AX 不等于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETA/SETNBE | 用于根据 CF(进位标志位)和 ZF(零标志位)的值设置一个目标操作数为 1 或 0。 CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETA CX ; 如果 AX 大于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETAE/SETNB/SETNC | 它会检查 CF 标志位的值。如果 CF 为 0,则将目标操作数设置为 1;否则将目标操作数设置为 0。 SETAE destination SETNB destination SETNC destination CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETAE CX ; 如果 AX 大于等于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETB/SETNAE/SETC | SETB destination SETNAE destination SETC destination 检查 CF 标志位的值。如果 CF 为 1,则将目标操作数设置为 1;否则将目标操作数设置为 0 CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETB CX ; 如果 AX 小于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETBE/SETNA | 检查 CF 和 ZF 标志位的值。如果 CF 为 1 或者 ZF 为 1, 则将目标操作数设置为 1;否则将目标操作数设置为 0。 CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETBE CX ; 如果 AX 小于等于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETG/SETNLE | 检查 SF 和 ZF 标志位的值。如果 SF 为 0 并且 ZF 为 0,则将目标操作数设置为 1;否则将目标操作数设置为 0。 CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETG CX ; 如果 AX 大于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETGE/SETNL | 检查 SF 和 ZF 标志位的值。如果 SF 等于 OF,则将目标操作数设置为 1;否则将目标操作数设置为 0 CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETGE CX ; 如果 AX 大于等于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETL/SETNGE | 检查 SF 标志位的值。如果 SF 为 1,则将目标操作数设置为 1;否则将目标操作数设置为 0 CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETL CX ; 如果 AX 小于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETLE/SETNG | 检查 SF 和 ZF 标志位的值。如果 SF 不等于 OF 或者 ZF 为 1,则将目标操作数设置为 1;否则将目标操作数设置为 0。 CMP AX, BX ; 比较寄存器 AX 和 BX 的值 SETLE CX ; 如果 AX 小于等于 BX,则将 CX 设置为 1;否则将 CX 设置为 0 |
SETS | 会检查 SF 和 ZF 标志位的值。如果 SF 为 0,则将目标操作数设置为 1;否则将目标操作数设置为 0。 SETS destination |
SETNS | 检查 SF 标志位的值。如果 SF 为 0,则将目标操作数设置为 1;否则将目标操作数设置为 0 SETNS destination |
SETNO | 检查 OF 标志位的值。如果 OF 为 0,则将目标操作数设置为 1;否则将目标操作数设置为 0 |
SETPE/SETP | 检查 PF 标志位的值。如果 PF 为 1,则将目标操作数设置为 1;否则将目标操作数设置为 0 |
SETPO/SETNP | 检查 PF 标志位的值。如果 PF 为 0,则将目标操作数设置为 1;否则将目标操作数设置为 0 |
控制跳转指令 | |
JMP | 无条件跳转指令 |
JE/JZ | 如果相等则跳转/如果为零则跳转。 |
JNE/JNZ | 如果不相等则跳转/如果不为零则跳转。 |
JA/JNBE | 如果高于则跳转/如果不低于或等于则跳转。 |
JAE/JNB | 如果高于或等于则跳跃/如果不低于则跳跃。 |
JB/JNAE | 如果低于则跳/不高于或等于则跳。 |
JBE/JNA | 如果低于或等于则跳转/如果不高于则跳转。 |
JG/JNLE | 如果大于则跳转/如果不小于或等于则跳转。 |
JGE/JNL | 如果大于或等于则跳转/如果不小于则跳转。 |
JL/JNGE | 如果小于则跳转/如果不大于或等于则跳转。 |
JLE/JNG | 如果小于或等于则跳转/如果不大于则跳转。 |
JC | 根据进位标志 CF(进位标志位 = 1) 的值进行跳转。 |
JNC | 根据进位标志 CF(进位标志位 = 0) 的值进行跳转。 |
JO | 根据溢出标志 OF =1 的值进行跳转。 |
JS | 根据符号标志 SF=1 的值进行跳转。 |
JNS | 根据符号标志 SF=0 的值进行跳转。 |
JPO/JNP | 根据奇偶标志 PF = 0 的值进行跳转。 |
JPE/JP | 根据奇偶标志 PF = 1 的值进行跳转。 |
JCXZ/JECXZ | 检查寄存器 CX 或 ECX 的值。如果 CX 或 ECX 的值为零 |
LOOPZ/LOOPE | 根据寄存器 CX >0 的值和 ZF= 1 标志位进行循环。 |
LOOPNZ/LOOPNE | 根据寄存器 CX >0 的值和 ZF= 0 标志位进行循环。 |
CALL | 于调用(跳转到)一个子程序或函数。 CALL destination 当执行 CALL 指令时,处理器会将当前指令的下一条指令的地址(即 CALL 指令后面的指令地址)压入栈中,并跳转到 destination 指定的目标地址开始执行子程序或函数 |
RET | 从子程序或函数返回到调用它的地方。 |
IRET | 用于从中断处理程序返回到被中断的程序或任务。 |
INT | 触发软件中断。 INT n 当执行INT指令时,处理器会暂停当前程序的执行,并跳转到中断向量表中对应的中断服务例程 |
INTO | 用于在发生溢出时触发软件中断。 |
BOUND | 检查数组索引是否在边界范围内 BOUND destination, lower_bound, upper_bound lower_bound 和 upper_bound 是两个操作数,分别表示数组索引的下界和上界。 当执行 BOUND 指令时,处理器会将 destination 的值与 lower_bound 和 upper_bound 进行比较。如果 destination 的值小于 lower_bound 或大于等于 upper_bound,则触发异常(通常是边界检查异常)。 |
ENTER | 用于在过程,开始时建立栈帧 ENTER size, nesting_level size 表示要分配的局部变量空间大小,nesting_level 表示嵌套层级。 |
LEAVE | ,用于在过程(procedure)结束时清理栈帧(stack frame)。 执行 LEAVE 指令会恢复调用者的栈帧,并释放当前过程建立的栈空间。 |
字符串指令 | |
MOVS/MOVSB | 用于在内存之间复制字符串或字节数据。 一个字节(8位) MOVSB destination, source destination 和 source 可以是寄存器或内存操作数,表示要复制的目标地址和源地址 |
MOVS/MOVSW | MOVSW 指令用于复制2个字(16位)的数据, |
MOVS/MOVSD | MOVSD 指令用于复制4个字(32位)的数据, |
CMPS/CMPSB | 比较两个字符串中对应位置的字节数据。 一个字节(8位) |
CMPS/CMPSW | 比较两个字符串中对应位置的字节数据。 2个字节(16位) |
CMPS/CMPSD | 比较两个字符串中对应位置的字节数据。 4个字节(32位) |
SCAS/SCASB | 用于在字符串中扫描特定字节数据。一个字节(8位) |
SCAS/SCASW | 用于在字符串中扫描特定字节数据。2个字节(16位) |
SCAS/SCASD | 用于在字符串中扫描特定字节数据。4个字节(32位) |
LODS/LOSB | 从内存中加载字符串或字节数据到寄存器中。 一个字节(8位) |
LODS/LOSW | 从内存中加载字符串或字节数据到寄存器中。 2个字节(16位) |
LODS/LOSD | 从内存中加载字符串或字节数据到寄存器中。 4个字节(32位) |
STOS/STOSB | 用于将寄存器中的数据存储到内存中的字符串或字节数据。 一个字节(8位) |
STOS/STOSW | 用于将寄存器中的数据存储到内存中的字符串或字节数据。 2个字节(16位) |
STOS/STOSD | 用于将寄存器中的数据存储到内存中的字符串或字节数据。 4个字节(32位) |
REP | 用于重复执行带有重复前缀的字符串指令。 当 REP 前缀与字符串指令一起使用时,它会根据 CX 或 ECX 寄存器中的计数值,重复执行该字符串指令。在每次执行后,CX 或 ECX 寄存器的值会递减,直到计数值为零才停止循环。 REP <指令> |
REPE/REPZ | 用于在条件满足时重复执行带有重复前缀的字符串指令。 REPE <指令> 当 REPE/REPZ 前缀与字符串指令一起使用时,它会根据 CX 或 ECX 寄存器中的计数值和零标志位的状态,重复执行该字符串指令。在每次执行后,CX 或 ECX 寄存器的值会递减,同时检查零标志位的状态。只有当计数值不为零且零标志位为真时,才会继续循环执行。如果计数值为零或零标志位为假,则停止循环。 |
REPNE/REPNZ | 在条件满足时重复执行带有重复前缀的字符串指令。 REPNZ <指令> 当 REPNE/REPNZ 前缀与字符串指令一起使用时,它会根据 CX 或 ECX 寄存器中的计数值和零标志位的状态,重复执行该字符串指令。在每次执行后,CX 或 ECX 寄存器的值会递减,同时检查零标志位的状态。只有当计数值不为零且零标志位为假时,才会继续循环执行。如果计数值为零或零标志位为真,则停止循环。 |
I/O 指令 | |
IN | 用于从输入/输出(I/O)端口读取数据并将其存储到目标操作数中。 IN destination, source |
OUT | 用于将数据从寄存器或内存位置输出到指定的输入/输出(I/O)端口。 OUT source, destination |
INS/INSB | 用于从输入/输出(I/O)端口读取数据并将其存储到目标操作数中。 1个字节 |
INS/INSW | 用于从输入/输出(I/O)端口读取数据并将其存储到目标操作数中。 2个字节 |
INS/INSD | 用于从输入/输出(I/O)端口读取数据并将其存储到目标操作数中。 4个字节 |
OUTS/OUTSB | 用于将数据从寄存器或内存位置输出到指定的输入/输出(I/O)端口。 1个字节 |
OUTS/OUTSW | 用于将数据从寄存器或内存位置输出到指定的输入/输出(I/O)端口。 2个字节 |
OUTS/OUTSD | 用于将数据从寄存器或内存位置输出到指定的输入/输出(I/O)端口。 4个字节 |
EFLAG 控制指令 | |
STC | 设置进位标志。 |
CLC | 清除进位标志。 |
CMC | 补充进位标志。 |
CLD | 清除方向标志。 |
STD | 设置方向标志。 |
LAHF | 将标志加载到AH寄存器中。 |
SAHF | 将AH寄存器存储到标志中。 |
PUSHF/PUSHFD | 将EFLAGS推到堆栈上。 |
POPF/POPFD | 从堆栈弹出EFLAGS。 |
STI | 设置中断标志。 |
CLI | 清除中断标志 |
段寄存器指令 Segment Register Instructions | |
LDS | 用于将一个16位段寄存器加载为内存位置的内容。 DS 段寄存器 LDS destination, source “destination”是一个16位通用寄存器,用于保存内存位置的偏移部分,“source”是一个内存操作数,指定了包括段和偏移部分在内的内存位置的完整地址 |
LES | 用于将一个16位段寄存器加载为内存位置的内容。 ES 段寄存器 LDS destination, source “destination”是一个16位通用寄存器,用于保存内存位置的偏移部分,“source”是一个内存操作数,指定了包括段和偏移部分在内的内存位置的完整地址 |
LFS | 用于将一个16位段寄存器加载为内存位置的内容。 FS 段寄存器 LDS destination, source “destination”是一个16位通用寄存器,用于保存内存位置的偏移部分,“source”是一个内存操作数,指定了包括段和偏移部分在内的内存位置的完整地址 |
LGS | 用于将一个16位段寄存器加载为内存位置的内容。 GS 段寄存器 LDS destination, source “destination”是一个16位通用寄存器,用于保存内存位置的偏移部分,“source”是一个内存操作数,指定了包括段和偏移部分在内的内存位置的完整地址 |
LSS | 用于将一个16位段寄存器加载为内存位置的内容。 SS 段寄存器 LDS destination, source “destination”是一个16位通用寄存器,用于保存内存位置的偏移部分,“source”是一个内存操作数,指定了包括段和偏移部分在内的内存位置的完整地址 |
用户模式扩展状态保存/恢复 指令 | |
XSAVE | 将处理器扩展状态保存到内存中。 |
XSAVEC | 通过压缩将处理器扩展状态保存到内存中。 |
XSAVEOPT | 将处理器扩展状态保存到内存中,进行优化。 |
XRSTOR | 从内存中恢复处理器扩展状态。 |
XGETBV | 读取扩展控制寄存器的状态。 |
随机数生成器指令 | |
RDRAND | 检索从硬件生成的随机数。 |
RDSEED | 检索从硬件生成的随机数。 |
BMI1 and BMI2 Instructions: | |
ANDN | 它执行源操作数取反与目标操作数的按位逻辑与操作,并将结果存储在目标操作数中。 换句话说,如果我们有两个操作数A和B,ANDN指令计算的结果为~(A) & B,其中~表示A的按位取反(补码)。 |
BEXTR | 连续逐位提取。 BEXTR destination,source,start,len 它从指定的位位置开始,从源操作数中提取指定范围的位,并将其存储在目标操作数中。 |
BLSI | 提取最低设置位。 BLSI destination_operand, source_operand 执行BLSI指令时,它会扫描源操作数,找到最低置位的位,并将该位设置为零。然后,结果会存储在目标操作数中。 |
BLSMSK | 将第一个设置位以下的所有低位设置为1。 BLSMSK destination_operand, source_operand 扫描源操作数,找到最低置位的位,并创建一个掩码,其中最低置位以下的所有位都被设置为1。然后,结果会存储在目标操作数中。 |
BLSR | BLSR destination_operand, source_operand 扫描源操作数,找到最低置位的位,并将该位设置为零。然后,结果会存储在目标操作数中。 |
BZHI | BZHI destination_operand, source_operand, index_operand |
LZCNT | |
MULX | |
PDEP | |
PEXT | |
RORX | 循环右移而不影响算术标志。 |
SARX | 右移算术运算。 SARX destination_operand, source_operand, count_operand 允许通过寄存器指定位移数量,提供了更大的灵活性以进行可变的位移操作。 |
SHLX | |
SHRX | |
TZCNT |
其他 | |
LEA | 加载有效地址 LEA dest,source 其中源操作数可以是一个内存操作数或一个表达式,用于指定要计算有效地址的地址 |
NOP | 空操作 |
UD | 未定义的指令。 |
XLAT/XLATB | 表格查找转换。是x86指令集体系结构中用于基于表格进行字节转换的指令 |
CPUID | 处理器标识。允许程序获取关于正在运行的处理器的信息。它提供了有关CPU功能和特性的详细信息。 |
MOVBE1 | 交换数据字节后移动数据。 通过将源操作数中的字节按照相反的顺序复制到目标操作数中来实现字节交换 |
PREFETCHW | 将数据预取到缓存中,以备写入。 用于将数据从内存预取到CPU缓存中,特别针对修改状态 PREFETCHW指令旨在通过在实际需要之前将数据预取到缓存中来提高缓存性能。它通常在程序预期在预取操作后不久修改预取的数据的情况下使用。 通过将数据以修改状态预取到缓存中, |
PREFETCHWT1 | ,代表"将数据预取到修改状态的缓存中,并带有T1提示"。它用于将数据从内存预取到CPU缓存中,特别针对修改状态,并提供了T1提示。 T1提示表示预取的数据将很快且频繁地被访问。这意味着程序将在不久的将来再次访问这些数据,并且这些数据具有较高的重复性。 通过使用T1提示,CPU可以根据这一信息优先处理预取的数据,并相应地分配缓存资源 |
CLFLUSH | 用于将缓存行(cache line)中的数据写回到内存并使其无效。这意味着该指令会清除缓存行中的数据,并将其写回到主存中。 |
CLFLUSHOPT | 代表"优化缓存行刷新"。它用于从CPU缓存中刷新一个缓存行并使其无效,类似于CLFLUSH指令。然而,CLFLUSHOPT提供了一个经过优化的缓存刷新版本。 CLFLUSHOPT指令旨在通过优化缓存刷新操作来提高性能。通常在程序员希望显式刷新缓存行以确保数据一致性或在不同线程或处理器之间进行同步的情况下使用。 |