NEG指令如何影响x86上的标志?

时间:2017-06-30 01:20:53

标签: assembly x86 intel twos-complement negation

“英特尔软件开发手册”对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。

1 个答案:

答案 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)。