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

Assembly 如何使用imul指令计算符号标志?,assembly,x86,Assembly,X86,缔约国指出: SF根据目标中操作数大小截断结果的最高有效位进行更新 对于64位操作,我的理解是SF=(a*b)>>63,或者更简单地说,如果a和b都有符号,SF=a*b

缔约国指出:

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

对于64位操作,我的理解是
SF=(a*b)>>63
,或者更简单地说,如果
a
b
都有符号,
SF=a*b<0

但是,我得到了一个意外的结果,将两个大数字相乘:

mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
0x9095*0x404040404040403
的结果是
0xefcba7835f3b16ff
。它设置了符号位,但是在执行
imul
指令后,SF标志被清除。发生什么事了


这是很久以前的事了。

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

编辑:使用Archive.org的Wayback机器,我发现文档从声明SF未定义更改为SF已在修订版中定义。先前的修订版仍然说SF是未定义的。随附文件对此进行了记录,但未说明变更的理由

编辑2我的CPU是i7 M 620。我访问了更旧的Core2Duo P7550,并且能够确认
imul
也没有在其上设置
SF


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

我发现该文档中有一个错误:
SF← TMP_XP[32]
,显然应该是
31
。顺便问一下,英特尔对这条指令有什么看法?@Jongware,没错。我来看看最新的2A卷是否还有这个。此文档是从2014年9月的版本中自动提取的,因此英特尔当时对此的解释是这样的。@Jongware,第2A卷的最新版本仍然存在此错误。@PeterCordes,我编辑了我的答案来说明这一点。关于我网站上IMUL翻译的当前状态,我正在努力,几天后可能会有更好的东西展示。HJLebbink的转换脚本是我的一个分支,它与我有一些共同的问题(例如,列表被破坏了;这可能是从缺失中提高了一步,但这种类型的错误翻译是我正在开发新版本的原因)。关于最新版本,我找不到2017年12月的版本,这显然是来自;我能找到的最新更新是2016年9月。我敏锐地意识到我所做的最新更新存在很多问题,我相信我可以解决很多问题。如果你想谈论它,你可以抓到一封电子邮件,我可以通过克隆项目的git repo并检查git日志来检查。五年并不是那么久,Intel在这段时间里没有对其架构进行任何根本性的更改。请务必发布你找到的任何更好的解释。你知道有什么地方可以跟踪文档集之间的变化吗?文档中说,它适用于奔腾处理器。应记录处理器之间的变化。因此,要么是处理器中的错误,要么是文档中的错误,要么是您没有使用英特尔处理器,要么是发生了其他事情。@RossRidge,文档中没有关于它的任何内容,但我声明
SF
imul
之后是未定义的。我仍在寻找这种变化到底发生在什么时候。自2012年以来,Archive.org拥有每一本手册的副本(该版本还说SF未定义)。问题在于知道手册中的内容何时发生变化并不能告诉我们任何事情。过去对手册所做的更改并非行为改变的结果,只是描述了以前未记录的旧行为。