【问题标题】:Intel instruction set: multiply with EAX, EBX, ECX or EDX?英特尔指令集:与 EAX、EBX、ECX 或 EDX 相乘?
【发布时间】:2013-07-23 07:00:25
【问题描述】:

你怎么知道'mul ecx'什么时候被执行。 ECX 会与 EAX 相乘吗?而不是 EBX 或 EDX?

mul ecx, eax

不过会更有意义。

【问题讨论】:

  • RTFM 是你知道的 :) Volume 2
  • 这是由于 35 年的 16 位架构的 25 年的 32 位扩展。 Haswell 架构具有更“现代”的mulx 指令。
  • 如果您查看一些基于堆栈的架构或具有累积寄存器的架构,您会发现堆栈或累积寄存器几乎总是隐含在指令中。这仅仅是因为指令的编码是不可能/不需要的
  • 您建议的mul ecx, eax 语法并不表示隐式输出的高半部分,EDX。

标签: assembly x86 intel instructions instruction-set


【解决方案1】:

指令集就是这样定义的。

英特尔可以用其他方式定义它,包括允许您完全指定输入和输出寄存器的方式,但他们没有。

可以说,当各种乘法指令被添加到 CPU 的指令集时(我认为是 8086 年份),现有指令没有任何明显的地方可以将乘法放在可以共享的地方其他指令可用的通用解码方案(例如,mov、add、xor 等),没有很多可用的晶体管来执行花哨的解码方案以启用其他方式来编码通用操作数,并且任何晶体管可用更好地专用于乘法/除法逻辑。

最后,与一般指令(mov、add、xor)相比,需要乘法指令的频率要低得多,因此将操作数移动到固定位置/结果的努力不会导致大量代码膨胀或影响性能很多。设计者确实找到了一种包含源操作数的方法。您应该认为它很幸运,它没有简单地定义为将 EAX 和 EDX 相乘以产生 EDX:EAX,这是许多早期计算机体系结构中使用的历史悠久的方案。从那以后,x86 指令集中整数乘法的需求并没有太大变化。

浮点/向量算术是完全不同的事情。

【讨论】:

  • 为什么不使用 'mul ecx, eax'?
  • 该指令只有位来表示单个操作数。您可以编写 mul ecx 或 mul eax,但不能同时编写。
猜你喜欢
  • 2017-03-29
  • 2016-02-09
  • 1970-01-01
  • 2012-12-10
  • 2020-03-10
  • 2012-05-21
  • 2011-02-02
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多