【发布时间】:2015-04-27 16:51:40
【问题描述】:
SF 根据目标中操作数大小截断结果的最高有效位进行更新。
那么,对于 64 位操作,我的理解是 SF = (a * b) >> 63,或者更简单地说,如果 a 和 b 已签名,则 SF = a * b < 0。
但是,我得到了一个意外的结果,将两个大数相乘:
mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
0x9090909090909095 * 0x4040404040404043 的结果是0xefcba7835f3b16ff。它设置了符号位,但是在imul 指令之后清除SF 标志。怎么回事?
【问题讨论】:
-
我在该文档中发现了一个错误:
SF ← TMP_XP[32];,显然应该是31。顺便说一句,英特尔对这条指令有什么看法? -
@Jongware,这是真的。我会检查最新的第 2A 卷是否仍然存在。该文档是从 2014 年 9 月的版本中自动提取的,所以这就是当时英特尔不得不说的。
-
@Jongware,最新版本的第 2A 卷仍然有这个错误。
-
@PeterCordes,我编辑了我的答案来这么说。关于我网站上 IMUL 翻译的当前状态,我正在努力,几天后可能会有更好的展示。 HJLebbink 的转换脚本是我的一个分支,并且有一些问题(例如,列表已损坏;这可能是缺失的一个步骤,但这种类型的错误翻译是我正在研究它的新版本的原因)。关于最新的,我找不到这显然来自 2017 年 12 月的修订版;我能找到的最近的是 2016 年 9 月。
-
我敏锐地意识到我所做的最新更新存在很多问题,我相信我可以解决很多问题。如果你想谈论它,你可以通过克隆项目的 git repo 并检查 git log 来获取我检查的电子邮件。