繁体   English   中英

用汇编语言计算指令的成本

[英]Calculating cost of an instruction in assembly language

我正在阅读龙书中的代码生成。 它提供了一种将成本与每个目标语言关联相关联的简单方法。

我们假设每个目标语言指令都有相关的成本。 为简单起见,我们将指令的成本加上与操作数的寻址模式相关的成本加上一个。 该成本对应于指令的单词长度。 涉及寄存器的寻址模式具有零附加成本,而涉及存储器位置或其中的常量的那些具有额外成本1, 因为这些操作数必须存储在指令之后的字中。

一些例子:

  • 指令LD R0,R1将寄存器R1的内容复制到寄存器R0中。 该指令的成本为1,因为不需要额外的存储器字。
  • 指令LD R0,M将存储器位置M的内容加载到寄存器R0中。 由于存储器位置M的地址在指令之后的字中,因此成本为2。
  • 指令LD R1,* 100(R2)将由内容(内容(100 +内容(R2)))给出的值加载到寄存器R1中。 成本是3,因为常数100存储在指令之后的字中。 这里内容(x)表示由x表示的寄存器或存储器位置的内容。

我理解前两个例子的成本计算。 我没有得到第三个。 费用3怎么样? 另外,我不明白上面引用文字中的粗体部分。

在我部分理解的内容中,我认为BLTZ * R3的成本,R0为3,因为对于上面类似的第三个例子,它是如此。 但这个成本是1.如何?

注意如果寄存器r中的值小于零,则BLTZ r,L会跳转到标记L,如果不是,则允许控制传递到下一个机器指令。

我相信其他人可以更好地解释这一点。 但是,这里有一些灵感:

成本不是真实的,它们是根据龙书的定义来假设的。 要了解实际成本,您必须检查目标体系结构的表。 请参阅SO维基以获取相应的链接。

因此,通过与上述引用相关的三个示例:

我们把指令的成本作为一个

因此,假设每条指令的成本为1

涉及内存位置或常量的那些额外成本为1

所以例子1到3都有

  • 1条指令+ 0 mem / const = 1
  • 1条指令+ 1条记忆= 2条
  • 1条指令+ 1条记忆+ 1条1条const = 3条

存储器地址和常数分别在指令的附加字中被编码在指令OpCode中,该指令延长了要获取的影响CPU Op / microOp处理的OpCode字节。

我没有得到第三个。 费用3怎么样?

  • 1表示指令
  • 1用于从下一个单词中获取常量100
  • 1用于从R2 + 100获取值

对于上面类似的第三个例子,BLTZ * R3的成本,R0为3。 但这个成本是1.如何?

因为: 涉及寄存器的寻址模式没有额外的成本

我不明白上面引用文字中的粗体部分。

显然,这种架构的机器代码使用一个字来指定操作码和寄存器操作数,如果需要一个常量则使用另一个字。

例如, LD R1,*100(R2)需要2个字。 第一个指定操作(具有寄存器相对偏移的LD )以及目标寄存器R1和基址寄存器R2 这些是字中的位域。 然后第二个字包含cpu知道要获取的100 ,因为第一个字中的操作码。

一些固定长度的体系结构将常量包装到第一个单词中,但显然它们只能具有有限的范围。 使用单独的单词允许全范围。

龙书中有一个错误列表 您所说的问题在我的书中的第515页,列表在第515页说明

指令的成本是两个,而不是三个

这本书是一个错误。

成本模型仅涉及指令长度

该长度对应于指令的字长

内存操作不会增加成本,例如LD R1, *R2成本为1,因为

涉及寄存器的寻址模式没有额外的成本

并且没有涉及的常量(偏移或文字内存地址)。

由于指令访问存储器,因此没有提及额外的成本。

这也解释了为什么BLTZ *R3, R0的成本是1:因为指令长度是一个字而寻址模式( *R3 )也不涉及常数。

相对而言,自龙书以来,情况发生了很大变化。 乘法从40个周期(int)下降到1/2个周期,从200-300个周期(浮动)到......好吧,我记不清了,但我认为不到10个。

然而,内存访问的成本已经超过了,因为处理器加速而内存与这些增加不匹配。 现在大量的优化工作是面向缓存行(确保具有相互位置的指令,如果可能的话,从单个缓存行中访问数据),并且因为您无法预测哪些内存访问将是缓存未命中,您可以不再容易从编译器中预测执行时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM