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

时间:2017-09-29 11:04:31

标签: assembly binary x86 instructions

我注意到0xF3二进制前缀用作:
1)重复并减少ecx,直到ecx等于0INSOUTSMOVS,{LODS {1}}说明并致电STOS
2)重复并减少rep,直到ecx等于ecx0设置在ZFCMPS指令中并调用SCAS }或repz

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

最近注意到repnz / repne前缀也具有相同的二进制值(XACQUIREXRELEASE

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

XRELEASE会做什么? (将在lock设置\未设置时停止,或仅在0xF3 mov byte ptr [ecx],0x0等于ZF时停止) ecx会做什么?

1 个答案:

答案 0 :(得分:5)

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

  

使用这些前缀   仅限字符串和I / O指令(MOVS, CMPS, SCAS, LODS, STOS, INSOUTS)。使用重复前缀   和/或其他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, XADDXCHG一起使用 - 这些说明不允许重复前缀,因此不会出现歧义。

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

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

  

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

0xF3 mov byte ptr [ecx],0x0这样的指令将作为mov byte ptr [ecx],0x0作为今天,因为前缀会被忽略。

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

有时,指令具有明确的名称,替代语义紧密相连(例如movsrepe movsrepne movstzcnt0xf3 bsf的事实})有时指令没有明确的名称,替代品也不那么明显(例如mulsd0xf2 mulpsmulss0xf3 mulps,{{1是} mulpd)。

有关0x66 mulps指令的更多信息,请参阅“英特尔软件开发人员手册”或this post