“英特尔软件开发手册”对neg
指令说明了这一点:
如果源操作数为0,则CF标志设置为0;否则设置为1. OF,SF,ZF,AF和PF标志根据结果设置。
我认为AF和CF会被设置为好像neg %eax
被替换为
not %eax # bitwise negation
add $1, %eax
但事实并非如此,在实际CPU上设置AF和CF时否定0x6ffffef5。
答案 0 :(得分:6)
neg
将所有标记设置为与您从{0}获得的sub
相同的标记。
这一系列指令将所有标志(包括AF和CF)设置为neg %eax
:
xor %ecx, %ecx
sub %eax, %ecx # ecx = 0 - eax
英特尔的文档实际上确实指定了这一点,但没有在伪代码操作部分或neg
本身的指令集参考(第2卷)条目的受标志影响部分中指定。 / p>
the Description section for neg
的文字包括这个金块:
此操作相当于从0减去操作数。
在Volume 1:
7.3.2.4比较和签署更改说明
[关于CMP的段落]
NEG(否定)指令从零中减去有符号整数操作数。
a comment on an earlier duplicate of this question指出了这份文件的存在,并不是直接措辞。
我不知道vol.1有一整节解释说明。事实证明,并非所有英特尔对单个指令都要说的都在第2卷insn set reference中。
有一些证据表明neg
内部解码到与Intel CPU上的sub
指令相同的uop。 (例如neg [mem]
可以将负载与ALU op进行微熔合,以及对存储地址和存储数据微操作进行微融合。inc [mem]
只能对存储进行微融合,因此它&# 39; s 3个完全融合域uops)。