汇编x86 REP,REPZ,REPNZ,XACQUIRE和XRELEASE指令

ARI*_*TOS -2 binary x86 assembly instructions

正如我已经注意到0xF3二进制前缀被用作:
1)重复和减小ecx直至ecx等于0INS,OUTS,MOVS,LODS,STOS指令和称为rep
2)重复和减小ecx直至ecx等于0ZF在设置CMPS,SCAS指令和称为repzrepe

0xF3二进制前缀被用作:
1)重复和减小ecx直至ecx等于0ZF不在集合中CMPS,SCAS指令和称为repnzrepne

最近注意到XACQUIRE/ XRELEASE前缀也有相同的二进制值(0xF2,0xF3)

那是什么XACQUIRE/ XRELEASE正在做什么(我读了一些关于锁定内存地址的东西,但它们不是工作线lock(我相信))?

还会怎么0xF3 mov byte ptr [ecx],0x0做?(将停在ZF设定\未设置或将停止只ecx等于0)
什么0xF2 mov byte ptr [ecx],0x0会做什么?

Mar*_*oom 5

引用英特尔软件开发人员手册2,第2.1.1节

仅将这些前缀用于字符串和I/O指令(MOVS, CMPS, SCAS, LODS, STOS, INS,和OUTS).保留使用重复前缀和/或未定义的操作码与其他Intel 64或IA-32指令; 这种使用可能会导致不可预测的行为.
某些指令F2H,F3H可用作表示不同功能的强制前缀.

由于您刚刚发现的原因,重复前缀与非字符串非IO指令的使用是完全不确定的行为:英特尔重复使用它来表达相同"指令"的不同风格或实现新扩展.

对于HLE指令(例如xacquire),它们仅对特定指令集有效.
例如,xacquire只能使用ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD,和XCHG- 这些指令不允许重复前缀,因此不会出现歧义.

通常,忽略不相关的前缀,因此在向指令添加前缀时可能会在将来的处理器中导致未定义的行为,在旧处理器中可以安全地忽略它.

这就是为什么不需要明确检查对HLE的支持:

没有HLE支持的硬件将忽略XACQUIREXRELEASE前缀提示,并且不会执行任何省略,因为这些前缀对应于REPNE/REPEIA-32前缀,这些前缀在指令中被忽略XACQUIREXRELEASE有效.

一个指令就像0xF3 mov byte ptr [ecx],0x0会做的mov byte ptr [ecx],0x0,今天,因为前缀被忽略.

重申一下:重复前缀用于为指令选择不同的语义.

有时指令有一个明确的名称和替代语义接近在一起(例如movs,repe movs,repne movs或这一事实tzcnt0xf3 bsf),有时指令并没有一个明确的名称,而且替代品不太明显(例如mulsd0xf2 mulps,mulss0xf3 mulps,mulpd0x66 mulps).

有关该xacquire指令的更多信息,请参阅"英特尔软件开发人员手册"或本文.