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

91zkwejq  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(147)

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。它设置了符号位,但是在imul指令之后SF标志被清除。这是怎么回事?
这是一段时间前的cross-posted to the Intel forums

e4eetjau

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未定义,因此这解决了该问题。

相关问题