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

tbo*_*odt 7 x86 assembly intel negation twos-complement

英特尔软件开发手册对此说明进行了neg说明:

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

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

not %eax   # bitwise negation
add $1, %eax
Run Code Online (Sandbox Code Playgroud)

但事实并非如此,在实际CPU上设置AF和CF时否定0x6ffffef5.

Pet*_*des 6

neg所有标志设置为与sub从0 获得的标志相同.

这一系列指令将所有标志(包括AF和CF)设置为neg %eax:

xor  %ecx, %ecx
sub  %eax, %ecx     # ecx = 0 - eax
Run Code Online (Sandbox Code Playgroud)

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

描述部分neg的文本包含此块:

此操作相当于从0减去操作数.

第1卷中:

7.3.2.4比较和符号变更指令

[关于CMP的段落]

NEG(否定)指令从零中减去有符号整数操作数.

这个文件的存在是通过对这个问题的早期副本的评论来指出的,而这个副本并不是直接措辞的.

我不知道vol.1有一整节解释说明.事实证明,并非英特尔对个别指令所说的一切都在第2卷insn set参考中.


有一些证据表明neg内部解码为与subIntel CPU上的指令相同的uop .(例如,neg [mem]可以使用ALU op对负载进行微熔合,以及对存储地址和存储数据微操作inc [mem]进行微融合. 只能对存储进行微融合,因此它是3个完整的融合域uops).