-2

正如我所注意到的,0xF3二进制前缀被用作:
1)重复并减少ecx直到在, , ,指令中ecx等于并称为 2)重复并减少直到等于或在,指令中设置并称为或0INSOUTSMOVSLODSSTOSrep
ecxecx0ZFCMPSSCASrepzrepe

0xF3二进制前缀用作:
1) 重复和减少,ecx直到ecx等于0或未ZFCMPS,SCAS指令中设置并调用repnzrepne

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

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

还有0xF3 mov byte ptr [ecx],0x0会怎么做?(将在ZFset\not set 处停止,或者它将仅在ecx等于处停止0
0xF2 mov byte ptr [ecx],0x0会做什么?

4

1 回答 1

6

引用英特尔软件开发人员手册 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 前缀,这些前缀在 whereXACQUIREXRELEASE有效的指令中被忽略。

指令 like0xF3 mov byte ptr [ecx],0x0将执行 as mov byte ptr [ecx],0x0, as today,因为前缀被忽略。

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

有时指令有一个明确的名称并且替代语义很接近(例如movs,或事实 that is ) repe movs,有时指令没有明确的名称并且替代不太明显(例如is , is , is )。repne movstzcnt0xf3 bsfmulsd0xf2 mulpsmulss0xf3 mulpsmulpd0x66 mulps

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

于 2017-09-29T11:42:05.097 回答