英特尔软件开发手册就neg指令说明了这一点:



我以为可以将AF和CF设置为好像用neg %eax替换了,

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

但是事实并非如此,在实际CPU上取反0x6ffffef5会设置AF和CF。

最佳答案

neg的所有标志设置为与从0开始的sub相同。

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

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

英特尔的文档实际上确实指定了此名称,但未在neg本身的指令集引用(第2卷)条目的伪代码“操作”部分或“受标志影响”部分中指定。

the Description section for neg 的文本包含此块:



Volume 1中:



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

我不知道第1卷的整个章节都对说明进行了说明。事实证明,第2卷insn set引用中并没有提到Intel关于单个指令的所有内容。

有证据表明neg在内部解码为与Intel CPU上的sub指令相同的uop。 (例如neg [mem]可以与ALU op微融合负载,以及微融合存储地址和存储数据uops。inc [mem]只能微融合存储,因此总共有3个融合域uops)。

09-25 19:16