作者:奋怒的小超_656 | 来源:互联网 | 2023-01-16 10:27
正如我已经注意到0xF3
二进制前缀被用作:
1)重复和减小ecx
直至ecx
等于0
在INS
,OUTS
,MOVS
,LODS
,STOS
指令和称为rep
2)重复和减小ecx
直至ecx
等于0
或ZF
在设置CMPS
,SCAS
指令和称为repz
或repe
该0xF3
二进制前缀被用作:
1)重复和减小ecx
直至ecx
等于0
或ZF
不在集合中CMPS
,SCAS
指令和称为repnz
或repne
最近注意到XACQUIRE
/ XRELEASE
前缀也有相同的二进制值(0xF2
,0xF3
)
那是什么XACQUIRE
/ XRELEASE
正在做什么(我读了一些关于锁定内存地址的东西,但它们不是工作线lock
(我相信))?
还会怎么0xF3 mov byte ptr [ecx],0x0
做?(将停在ZF
设定\未设置或将停止只ecx
等于0
)
什么0xF2 mov byte ptr [ecx],0x0
会做什么?
1> Margaret Blo..:
引用英特尔软件开发人员手册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
前缀提示,并且不会执行任何省略,因为这些前缀对应于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
,mulpd
是0x66 mulps
).
有关该xacquire
指令的更多信息,请参阅"英特尔软件开发人员手册"或本文.