根据目标中操作数大小截断结果的最高位更新SF.
对于64位操作,那么,我的理解是SF = (a * b) >> 63,或者更简单的是,如果a和b签名,SF = a * b < 0.
但是,我得到一个意想不到的结果乘以两个大数:
mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
Run Code Online (Sandbox Code Playgroud)
结果0x9090909090909095 * 0x4040404040404043是0xefcba7835f3b16ff.它设置了符号位,但SF imul指令在指令后被清除.这是怎么回事?
这是在不久前交叉发布到英特尔论坛的.
其他消息来源说 SF 在 之后是未定义的imul。这很可能意味着 SF 的结果在较新的处理器上定义良好,但较旧的处理器不提供该功能。我的电脑已经 5 岁了,我可能属于第二类。
编辑:使用 Archive.org 的 Wayback Machine,我发现文档从 SF is undefined 更改为 SF is defined 在2014 年 9 月的修订版中。之前的修订版(2014 年 6 月)仍然表示 SF 未定义。这在随附的文档更改文档中进行了记录,但更改的基本原理没有。
编辑 2我的 CPU 是 i7 M 620。我可以使用更旧的 Core2Duo P7550,并且能够确认它imul也没有设置SF。
编辑 3从 2016 年 9 月版开始,IMUL说 SF 是未定义的,所以这解决了这个问题。