x86-64 汇编通用指令简单介绍

 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
CMOVSif符号(负)。SF = 1
CMOVNS无符号条件移动(非负数)。SF  = 0
CMOVP/CMOVPECMOVPE奇偶校验条件移动/奇偶校验偶数条件移动。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。
SETA destination
SETNBE destination

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/MOVSWMOVSW 指令用于复制2个字(16位)的数据,
MOVS/MOVSDMOVSD 指令用于复制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指令旨在通过优化缓存刷新操作来提高性能。通常在程序员希望显式刷新缓存行以确保数据一致性或在不同线程或处理器之间进行同步的情况下使用。

  • 30
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值