documentation for imul声明:
SF根据目标中操作数大小截断结果的最高有效位进行更新。
对于一个64位操作,我的理解是SF = (a * b) >> 63
,或者更简单地说,如果a
和b
是有符号的,SF = a * b < 0
。
但是,我得到了两个大数相乘的意外结果:
mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
0x9090909090909095 * 0x4040404040404043
的结果是0xefcba7835f3b16ff
。它设置了符号位,但是在imul
指令之后SF标志被清除。这是怎么回事?
这是一段时间前的cross-posted to the Intel forums。
1条答案
按热度按时间e4eetjau1#
Other sources说在
imul
之后SF是未定义的。这很可能意味着SF的结果在较新的处理器上是定义良好的,但较旧的处理器不提供该功能。我的电脑已经使用了5年,我可能属于第二类。EDIT:使用Archive.org的Wayback Machine,我发现文档从声明SF是未定义的更改为SF是在September 2014修订版中定义的。上一个修订版June 2014仍然声明SF是未定义的。这在随附的Documentation Changes文档中有记录,但没有说明更改的理由。
编辑2我的CPU是i7 M 620。我访问了一个更旧的Core2Duo P7550,并能够确认
imul
也没有在上面设置SF
。EDIT 3从2016年9月版开始,
IMUL
表示SF未定义,因此这解决了该问题。