【问题标题】:How is the sign flag calculated with the imul instruction?使用 imul 指令如何计算符号标志?
【发布时间】:2015-04-27 16:51:40
【问题描述】:

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

【问题讨论】:

  • 我在该文档中发现了一个错误:SF ← TMP_XP[32];,显然应该是31。顺便说一句,英特尔对这条指令有什么看法?
  • @Jongware,这是真的。我会检查最新的第 2A 卷是否仍然存在。该文档是从 2014 年 9 月的版本中自动提取的,所以这就是当时英特尔不得不说的。
  • @Jongware,最新版本的第 2A 卷仍然有这个错误。
  • @PeterCordes,我编辑了我的答案来这么说。关于我网站上 IMUL 翻译的当前状态,我正在努力,几天后可能会有更好的展示。 HJLebbink 的转换脚本是我的一个分支,并且有一些问题(例如,列表已损坏;这可能是缺失的一个步骤,但这种类型的错误翻译是我正在研究它的新版本的原因)。关于最新的,我找不到这显然来自 2017 年 12 月的修订版;我能找到的最近的是 2016 年 9 月。
  • 我敏锐地意识到我所做的最新更新存在很多问题,我相信我可以解决很多问题。如果你想谈论它,你可以通过克隆项目的 git repo 并检查 git log 来获取我检查的电子邮件。

标签: assembly x86


【解决方案1】:

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

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

【讨论】:

  • 五年并不老,英特尔在那段时间没有对他们的架构进行任何根本性的改变。
  • 请务必发布您发现的任何更好的解释。你知道跟踪文档集之间变化的任何地方吗?
  • 嗯,文档声明它适用于处理器,一直到奔腾。应该记录处理器之间的变化。所以它要么是你的处理器中的一个错误,要么是文档中的一个错误,你没有使用英特尔处理器,或者是其他原因。
  • @RossRidge,change history document 中没有任何内容,但我 dug up a 2003 version 指出 SFimul 之后未定义。我仍在寻找这种变化究竟是什么时候发生的。 Archive.org 拥有自 2012 年以来的所有手册的副本(March 2013 版本也表示 SF 未定义)。
  • 问题是知道它何时在手册中更改并不能告诉我们任何事情。过去曾对手册进行过类似的更改,这些更改不是由于行为改变而导致的,只是描述了以前没有记录的旧行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多