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

Assembly x86 REP, REPZ, REPNZ, XACQUIRE and XRELEASE instructions

我注意到 0xF3 二进制前缀用作:
1) 重复并减少 ecx 直到 ecx 等于 0INS,OUTS,MOVS,LODS,STOS 指令并调用了 rep
2) 重复递减ecx直到ecx等于0ZFCMPS,SCAS指令中设置并调用repzrepe

0xF3二进制前缀用作:
1) 重复并减少 ecx 直到 ecx 等于 0ZF NOT 在 CMPS,SCAS 指令中设置并调用 repnzrepne

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

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

还有0xF3 mov byte ptr [ecx],0x0会做什么? (将停止在 ZF set\not 设置或仅在 ecx 等于 0 时停止)
0xF2 mov byte ptr [ecx],0x0 会做什么?

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

Use these prefixes only with string and I/O instructions (MOVS, CMPS, SCAS, LODS, STOS, INS, and OUTS). Use of repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable behavior.
Some instructions may use F2H,F3H as a mandatory prefix to express distinct functionality.

将重复前缀与非字符串非 IO 指令一起使用是未定义的行为,正是因为您刚刚发现的原因:英特尔重复使用它来表达相同 "instruction" 的不同风格或实现新的扩展。

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

一般来说,不相关的前缀会被忽略,因此虽然向指令添加前缀可能会在未来的处理器中导致未定义的行为,但在较旧的处理器中可以安全地忽略它。

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

Hardware without HLE support will ignore the XACQUIRE and XRELEASE prefix hints and will not perform any elision since these prefixes correspond to the REPNE/REPE IA-32 prefixes which are ignored on the instructions where XACQUIRE and XRELEASE are valid.

0xF3 mov byte ptr [ecx],0x0 这样的指令将像今天 mov byte ptr [ecx],0x0 一样执行 ,因为前缀被忽略了。

明确重申:重复前缀用于为指令选择不同的语义。

有时指令有一个明确的名称,并且替代语义很接近(例如 movsrepe movsrepne movstzcnt0xf3 bsf),有时指令没有明确的名称,替代方案不太明显(例如 mulsd0xf2 mulpsmulss0xf3 mulpsmulpd0x66 mulps).

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