用汇编语言

时间:2016-05-02 14:47:59

标签: assembly compiler-construction

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

  

我们假设每个目标语言指令都有相关的成本。为简单起见,我们将指令的成本视为一   加上与操作数的寻址模式相关的成本。   此费用与指令的字数相对应。   涉及寄存器的寻址模式没有额外的成本,而   涉及内存位置或常量的那些有一个   额外费用为1,因为这些操作数必须存储在   按照说明书的话。

一些例子:

  • 指令 LD R0,R1 将寄存器R1的内容复制到寄存器R0中。这个 指令的成本为1,因为没有额外的记忆单词 必需的。
  • 指令 LD R0,M 将存储单元M的内容加载到寄存器R0中。自地址以来成本是两个 内存位置M在指令后面的单词中。
  • 的 指令 LD R1,* 100(R2)将给定的值加载到寄存器R1中 通过内容(内容(100 +内容(R2)))。费用是三 因为常数100存储在指令后面的字中。这里 contents(x)表示由x。
  • 表示的寄存器或存储单元的内容

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

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

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

5 个答案:

答案 0 :(得分:1)

  

我没有得到第三个。成本如何3?

  • 1表示
  • 1用于从下一个单词
  • 获取常量100
  • 1用于从R2 + 100
  • 获取值
  对于类似的第三个例子,BLTZ * R3的成本,R0为3   以上。但这个成本是1.如何?

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

  

我不理解上面引用文字中的粗体部分。

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

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

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

答案 1 :(得分:1)

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

费用 NOT 是真实的,根据龙书的定义,它们假定要了解 real < / em>成本,您必须检查目标体系结构的表。请参阅SO维基以获取相应的链接。

通过与上述引用相关的三个例子来说:

  

我们将指令的成本视为一个

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

  

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

所以示例1到3有

  • 1指令+ 0 mem / const = 1
  • 1指令+ 1 mem = 2
  • 1指令+ 1 mem + 1 one const = 3

内存地址和常量在指令OpCode中分别在指令 的附加 字中进行编码,从而延长了要获取的,影响CPU Op的OpCode字节/ microOp处理。

答案 2 :(得分:1)

有一个list of errors in dragon book。您所说的问题,请参阅我的书中的第515页,清单第515页

  

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

答案 3 :(得分:0)

这本书是错误的。

成本模型仅涉及指令长度

  

此长度对应于指令的单词长度

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

  

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

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

没有提及额外费用,因为指令访问内存。

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

答案 4 :(得分:0)

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

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