根据目标中操作数大小截断结果的最高位更新SF。
对于64位操作,我的理解是SF = (a * b) >> 63
,或更简单的是a
和b
签名,SF = a * b < 0
。
然而,我得到一个意想不到的结果乘以两个大数字:
mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
0x9090909090909095 * 0x4040404040404043
的结果是0xefcba7835f3b16ff
。它具有符号位设置,但SF标志在imul
指令后被清除。发生了什么事?
答案 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未定义,因此解决了此问题。