【问题标题】:Assembly x86 REP, REPZ, REPNZ, XACQUIRE and XRELEASE instructions汇编 x86 REP、REPZ、REPNZ、XACQUIRE 和 XRELEASE 指令
【发布时间】:2018-03-11 06:45:14
【问题描述】:

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

0xF3 二进制前缀用作:
1) 重复并减少ecx 直到ecx 等于0ZF 未在CMPS,SCAS 指令中设置并调用repnzrepne

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

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

还有0xF3 mov byte ptr [ecx],0x0 会做什么? (将停在ZF 设置\未设置或将仅停在ecx 等于0
0xF2 mov byte ptr [ecx],0x0 会做什么?

【问题讨论】:

  • 查阅指令集参考。您将看到如下内容:“F3H 前缀为以下指令定义,其余为未定义”和“XACQUIRE 前缀提示只能与以下指令一起使用”我>。这些集合不重叠,也不包括mov。所以这是未定义的。至于XACQUIRE/XRELEASE在做什么,参见Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture中的HLE软件接口部分>

标签: assembly x86 binary machine-code intel-tsx


【解决方案1】:

引用英特尔软件开发人员手册 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 前缀提示并且不会执行任何 省略,因为这些前缀对应于指令中忽略的 REPNE/REPE IA-32 前缀 其中XACQUIREXRELEASE 有效。

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

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

有时指令有一个明确的名称,而替代语义很接近(例如movsrepe movsrepne movstzcnt0xf3 bsf),有时指令没有一个明确的名称和替代不太明显(例如mulsd0xf2 mulpsmulss0xf3 mulpsmulpd0x66 mulps)。

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

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 2013-08-11
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2017-10-23
    • 2012-01-15
    相关资源
    最近更新 更多