Assembly 组装x86 REP、REPZ、REPNZ、XACQUIRE和XRELEASE说明

Assembly 组装x86 REP、REPZ、REPNZ、XACQUIRE和XRELEASE说明,assembly,x86,binary,machine-code,intel-tsx,Assembly,X86,Binary,Machine Code,Intel Tsx,正如我所注意到的,0xF3二进制前缀用作: 1) 重复并减少ecx,直到INS、OUTS、MOVS、LODS、STOS指令中的ecx等于0,并调用rep 2) 重复并减少ecx,直到ecx等于0或ZF在CMPS,SCAS指令中设置,并调用repz或repe 0xF3二进制前缀用作: 1) 重复并减少ecx,直到ecx等于0或ZF未在CMP,SCAS说明中设置,并调用repnz或repne 最近注意到XACQUIRE/XRELEASE前缀也有相同的二进制值(0xF2,0xF3) 那么XACQUIR

正如我所注意到的,
0xF3
二进制前缀用作:
1) 重复并减少
ecx
,直到
INS
OUTS
MOVS
LODS
STOS
指令中的
ecx
等于
0
,并调用
rep

2) 重复并减少
ecx
,直到
ecx
等于
0
ZF
CMPS
SCAS
指令中设置,并调用
repz
repe

0xF3
二进制前缀用作:
1) 重复并减少
ecx
,直到
ecx
等于
0
ZF
未在
CMP
SCAS
说明中设置,并调用
repnz
repne

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

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

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

还有什么
0xF2 mov byte ptr[ecx],0x0将起作用?

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

使用这些前缀 仅使用字符串和I/O指令(
MOV、CMP、SCA、LOD、STO、INS
OUTS
)。重复前缀的使用 和/或保留带有其他英特尔64或IA-32指令的未定义操作码;这种使用可能导致不可预测的后果 行为。
一些指令可能使用
F2H、F3H
作为表示不同功能的强制前缀

在非字符串非IO指令中使用重复前缀是未定义的行为,这正是您刚刚发现的原因:Intel将重复前缀用于表示同一“指令”的不同风格或实现新的扩展

对于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
指令的详细信息,请参阅《英特尔软件开发人员手册》或。

查阅《指令集参考》。您将看到以下内容:“F3H前缀为以下指令定义,其余指令未定义”和“XACQUIRE前缀提示只能与以下说明一起使用“。这些集合不重叠,也不包括
mov
。因此这是未定义的。至于
XACQUIRE
/
XRELEASE
正在做什么,请参阅《英特尔64和IA-32体系结构软件开发人员手册》第1卷:基本体系结构》中的“软件接口”一节