汇编 x86 REP、REPZ、REPNZ、XACQUIRE 和 XRELEASE 指令
Assembly x86 REP, REPZ, REPNZ, XACQUIRE and XRELEASE instructions
我注意到 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
NOT 在 CMPS
,SCAS
指令中设置并调用 repnz
或 repne
最近注意到 XACQUIRE
/XRELEASE
前缀也有相同的二进制值 (0xF2
,0xF3
)
那么 XACQUIRE
/XRELEASE
在做什么(我读了一些关于锁定内存地址的内容,但它们不是工作行 lock
(我相信))?
还有0xF3 mov byte ptr [ecx],0x0
会做什么? (将停止在 ZF
set\not 设置或仅在 ecx
等于 0
时停止)
0xF2 mov byte ptr [ecx],0x0
会做什么?
引用英特尔软件开发人员手册 2,第 2.1.1 节
Use these prefixes
only with string and I/O instructions (MOVS, CMPS, SCAS, LODS, STOS, INS
, and OUTS
). Use of repeat prefixes
and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable
behavior.
Some instructions may use F2H,F3H
as a mandatory prefix to express distinct functionality.
将重复前缀与非字符串非 IO 指令一起使用是未定义的行为,正是因为您刚刚发现的原因:英特尔重复使用它来表达相同 "instruction" 的不同风格或实现新的扩展。
对于 HLE 指令(如 xacquire
),它们仅对一组特定指令有效。
例如,xacquire
只能与 ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD
和 XCHG
一起使用 - 这些指令不允许重复前缀,因此不会出现歧义。
一般来说,不相关的前缀会被忽略,因此虽然向指令添加前缀可能会在未来的处理器中导致未定义的行为,但在较旧的处理器中可以安全地忽略它。
这就是为什么不需要明确检查对 HLE 的支持:
Hardware without HLE support will ignore the XACQUIRE
and XRELEASE
prefix hints and will not perform any
elision since these prefixes correspond to the REPNE/REPE
IA-32 prefixes which are ignored on the instructions
where XACQUIRE
and XRELEASE
are valid.
像 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
指令的更多信息,请参阅英特尔软件开发人员手册或 。
我注意到 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
NOT 在 CMPS
,SCAS
指令中设置并调用 repnz
或 repne
最近注意到 XACQUIRE
/XRELEASE
前缀也有相同的二进制值 (0xF2
,0xF3
)
那么 XACQUIRE
/XRELEASE
在做什么(我读了一些关于锁定内存地址的内容,但它们不是工作行 lock
(我相信))?
还有0xF3 mov byte ptr [ecx],0x0
会做什么? (将停止在 ZF
set\not 设置或仅在 ecx
等于 0
时停止)
0xF2 mov byte ptr [ecx],0x0
会做什么?
引用英特尔软件开发人员手册 2,第 2.1.1 节
Use these prefixes only with string and I/O instructions (
MOVS, CMPS, SCAS, LODS, STOS, INS
, andOUTS
). Use of repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable behavior.
Some instructions may useF2H,F3H
as a mandatory prefix to express distinct functionality.
将重复前缀与非字符串非 IO 指令一起使用是未定义的行为,正是因为您刚刚发现的原因:英特尔重复使用它来表达相同 "instruction" 的不同风格或实现新的扩展。
对于 HLE 指令(如 xacquire
),它们仅对一组特定指令有效。
例如,xacquire
只能与 ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD
和 XCHG
一起使用 - 这些指令不允许重复前缀,因此不会出现歧义。
一般来说,不相关的前缀会被忽略,因此虽然向指令添加前缀可能会在未来的处理器中导致未定义的行为,但在较旧的处理器中可以安全地忽略它。
这就是为什么不需要明确检查对 HLE 的支持:
Hardware without HLE support will ignore the
XACQUIRE
andXRELEASE
prefix hints and will not perform any elision since these prefixes correspond to theREPNE/REPE
IA-32 prefixes which are ignored on the instructions whereXACQUIRE
andXRELEASE
are valid.
像 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
指令的更多信息,请参阅英特尔软件开发人员手册或