我注意到0xF3
二进制前缀用作:
1)重复并减少ecx
,直到ecx
等于0
,INS
,OUTS
,MOVS
,{LODS
{1}}说明并致电STOS
2)重复并减少rep
,直到ecx
等于ecx
或0
设置在ZF
,CMPS
指令中并调用SCAS
}或repz
repe
二进制前缀用作:
1)重复并减少0xF3
,直到ecx
等于ecx
或0
未在ZF
,CMPS
指令中设置并调用{{1} }或SCAS
最近注意到repnz
/ repne
前缀也具有相同的二进制值(XACQUIRE
,XRELEASE
)
那么0xF2
/ 0xF3
正在做什么(我读过一些关于锁定内存地址的内容,但它们不是工作行XACQUIRE
(我相信))?
XRELEASE
会做什么? (将在lock
设置\未设置时停止,或仅在0xF3 mov byte ptr [ecx],0x0
等于ZF
时停止)
ecx
会做什么?
答案 0 :(得分: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支持的硬件将忽略
XACQUIRE
和XRELEASE
前缀提示,并且不会执行任何操作 elision,因为这些前缀对应于REPNE/REPE
IA-32前缀,这些前缀在指令中被忽略 其中XACQUIRE
和XRELEASE
有效。
像0xF3 mov byte ptr [ecx],0x0
这样的指令将作为mov byte ptr [ecx],0x0
,作为今天,因为前缀会被忽略。
明确重申:重复前缀用于为指令选择不同的语义。
有时,指令具有明确的名称,替代语义紧密相连(例如movs
,repe movs
,repne movs
或tzcnt
为0xf3 bsf
的事实})有时指令没有明确的名称,替代品也不那么明显(例如mulsd
是0xf2 mulps
,mulss
是0xf3 mulps
,{{1是} mulpd
)。
有关0x66 mulps
指令的更多信息,请参阅“英特尔软件开发人员手册”或this post。