如何使用imul指令计算符号标志?

时间:2015-04-27 16:51:40

标签: assembly x86

documentation for imul表示:

  

根据目标中操作数大小截断结果的最高位更新SF。

对于64位操作,我的理解是SF = (a * b) >> 63,或更简单的是ab签名,SF = a * b < 0

然而,我得到一个意想不到的结果乘以两个大数字:

mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx

0x9090909090909095 * 0x4040404040404043的结果是0xefcba7835f3b16ff。它具有符号位设置,但SF标志在imul指令后被清除。发生了什么事?

前一段时间是cross-posted to the Intel forums

1 个答案:

答案 0 :(得分:4)

Other sources说在imul之后SF未定义。这很可能意味着SF的结果在较新的处理器上定义良好,但较旧的处理器不提供该功能。我的电脑已经5岁了,我可能属于第二类。

编辑:使用Archive.org的Wayback Machine,我发现文档已更改,说明SF未定义为SF,在September 2014修订版中定义。之前的修订版June 2014仍然说SF未定义。这在随附的Documentation Changes文档中有记录,但更改的基本原理不是。

编辑2 我的CPU是i7 M 620.我可以访问更旧的Core2Duo P7550并且能够确认imul未设置SF它要么。

编辑3 从2016年9月版开始,IMUL表示SF未定义,因此解决了此问题。