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

zne*_*eak 5 x86 assembly

imul文档指出:

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

对于64位操作,那么,我的理解是SF = (a * b) >> 63,或者更简单的是,如果ab签名,SF = a * b < 0.

但是,我得到一个意想不到的结果乘以两个大数:

mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
Run Code Online (Sandbox Code Playgroud)

结果0x9090909090909095 * 0x40404040404040430xefcba7835f3b16ff.它设置了符号位,但SF imul指令在指令后被清除.这是怎么回事?


这是不久前交叉发布到英特尔论坛的.

zne*_*eak 5

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

编辑:使用 Archive.org 的 Wayback Machine,我发现文档从 SF is undefined 更改为 SF is defined 在2014 年 9 月的修订版中。之前的修订版(2014 年 6 月)仍然表示 SF 未定义。这在随附的文档更改文档中进行了记录,但更改的基本原理没有。

编辑 2我的 CPU 是 i7 M 620。我可以使用更旧的 Core2Duo P7550,并且能够确认它imul也没有设置SF

编辑 3从 2016 年 9 月版开始,IMUL说 SF 是未定义的,所以这解决了这个问题。

  • @RossRidge,[更改历史文档](http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software- developer-manual.pdf) 关于它,但我 [挖出一个 2003 版本](http://flint.cs.yale.edu/cs422/doc/24547112.pdf) 指出在 `imul` 之后 `SF` 是未定义的`. 我仍在寻找这种变化发生的确切时间。Archive.org 拥有自 2012 年(以及 [2013 年 3 月](https://web.archive.org/web/20130426220016/http://download.intel.com/products/processor/manual/253666 .pdf) 版本还说 SF 未定义)。 (2认同)
  • 问题是知道手册中的更改时间并没有告诉我们任何事情。过去对手册进行了这样的更改,这些更改不是行为改变的结果,只是描述了以前没有记录的旧行为。 (2认同)