【问题标题】:How does the NEG instruction affect the flags on x86?NEG 指令如何影响 x86 上的标志?
【发布时间】:2017-12-03 20:51:26
【问题描述】:

英特尔软件开发手册中提到了neg 指令:

如果源操作数为 0,则 CF 标志设置为 0;否则设置为 1。根据结果设置 OF、SF、ZF、AF 和 PF 标志。

我以为 AF 和 CF 会被设置为好像 neg %eax 被替换为,

not %eax   # bitwise negation
add $1, %eax

但事实并非如此,在真正的 CPU 上否定 0x6ffffef5 会设置 AF 和 CF。

【问题讨论】:

  • @EvanCarroll:您为什么将这个问题从 AT&T 改为 Intel 语法?现在我的回答看起来很奇怪。
  • @PeterCordes 我不想参加那场圣战,退出(恢复为 GAS)。虽然我确实认为将 [intel] 或 [x86] 标签标准化是件好事。
  • @EvanCarroll :[Intel] 标签与 Intel 汇编语言语法没有太大关系。它通常是英特尔架构。有 [intel-syntax] 和 [att] 标签用于针对特定于 Intel 或 AT&T 汇编语言语法的问题。
  • @MichaelPetch:[intel] 标签用于询问英特尔制造的任何东西,例如他们的数学库、图形硬件/快速同步、计算机视觉库等等。 (我按照标签查找错误标记的 asm 问题。相当多的 [intel] 问题与 asm 无关。)关于 x86 汇编语言或 x86 ISA 的问题通常应该只有 [intel] 标记,如果它专门关于英特尔对该 ISA 的实现,例如有关 Skylake 或 . Ryzen 的等效问题将有一个 [amd] 标签。
  • @MichaelPetch:啊,我明白了。对我来说,标签措辞听起来像是将范围限制为英特尔特定的 x86 扩展(如事务内存),而不是一般的 x86 ISA 问题。 (这就是我阅读您的评论的方式。我也不确定您是否说它仅限于此,或者这只是它所涵盖的一部分,抱歉我很迂腐)。鉴于这些主题已经有[x86][itanium] 标签,我认为这是合适的。我认为我们同意我们肯定希望 x86 问题标记为 x86,以便它们可以被找到,而不是分散在 [intel][x86] 中。

标签: assembly x86 intel twos-complement negation


【解决方案1】:

neg 设置 all 标志与使用 sub 从 0 获得的标志相同。

此指令序列将所有标志(包括 AF 和 CF)设置为与 neg %eax 相同:

xor  %ecx, %ecx
sub  %eax, %ecx     # ecx = 0 - eax

英特尔的文档确实指定了这一点,但没有在伪代码操作部分或neg 本身的指令集参考(第 2 卷)条目的标志影响部分中指定。

the Description section for neg 的文字包括这个金块:

这个操作相当于从0中减去操作数。

Volume 1:

7.3.2.4 比较和换号说明

[关于 CMP 的一段]

NEG(取反)指令从零中减去一个有符号整数操作数。

a comment on an earlier duplicate of this question 指出了该文档的存在,但措辞并不直接。

我不知道第 1 卷有一整节解释说明。事实证明,并非英特尔对单个指令所说的所有内容都在第 2 卷 insn 集参考中。


有一些证据表明,neg 在内部解码为与 Intel CPU 上的 sub 指令相同的微指令。 (例如,neg [mem] 可以将负载与 ALU 运算进行微融合,以及将存储地址和存储数据微融合。inc [mem] 只能对存储进行微融合,所以它总共是 3 个融合域微秒)。

【讨论】:

  • “有一些证据表明 neg 在内部解码为与 Intel CPU 上的子指令相同的 uop。” 有趣……这让 the behavior I recently questioned 更加令人惊讶。如果neg 在内部被解码为sub,那么neg+add 不可能比sub 更有优势。也许我应该正式将其报告为错误。英特尔有问题跟踪器吗?
  • @CodyGray:我很确定他们接受某种形式的错过优化错误报告。如果没有公共错误跟踪器,也许可以通过论坛帖子。除了在 Godbolt 上,我没有使用过 ICC。
  • @tbodt:事实证明它毕竟被记录在案,只是不是你看的地方。 >.
猜你喜欢
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2013-05-18
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多