作者:手机用户2502854967 | 来源:互联网 | 2023-01-30 19:24
英特尔软件开发手册对此说明进行了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> Peter Cordes..:
neg
将所有标志设置为与sub
从0 获得的标志相同.
这一系列指令将所有标志(包括AF和CF)设置为neg %eax
:
xor %ecx, %ecx
sub %eax, %ecx # ecx = 0 - eax
英特尔的文档实际上确实指定了这一点,但没有在伪代码操作部分或指令集参考(第2卷)条目中的标志影响部分中指定neg
.
描述部分neg
的文本包含此块:
此操作相当于从0减去操作数.
在第1卷中:
7.3.2.4比较和符号变更指令
[关于CMP的段落]
NEG(否定)指令从零中减去有符号整数操作数.
这个文件的存在是通过对这个问题的早期副本的评论来指出的,而这个副本并不是直接措辞的.
我不知道vol.1有一整节解释说明.事实证明,并非英特尔对个别指令所说的一切都在第2卷insn set参考中.
有一些证据表明neg
内部解码为与sub
Intel CPU上的指令相同的uop .(例如,neg [mem]
可以使用ALU op对负载进行微熔合,以及对存储地址和存储数据微操作inc [mem]
进行微融合. 只能对存储进行微融合,因此它是3个完整的融合域uops).