我正在阅读龙书中的代码生成。它提供了一种将成本与每种目标语言关联相关联的简单方法。
我们假设每个目标语言指令都有相关的成本。为简单起见,我们将指令的成本视为一 加上与操作数的寻址模式相关的成本。 此费用与指令的字数相对应。 涉及寄存器的寻址模式没有额外的成本,而 涉及内存位置或常量的那些有一个 额外费用为1,因为这些操作数必须存储在 按照说明书的话。
一些例子:
我理解前两个例子的成本计算。我没有得到第三个。费用3怎么样?另外,我不理解上面引用文字中的粗体部分。
在我部分理解的内容中,我认为 BLTZ * R3,R0 的成本为3,因为对于上面类似的第三个例子,它是如此。但这个成本是1.如何?
注意如果寄存器r中的值为,则BLTZ r,L会跳转到标记L. 小于零,并允许控制传递给下一个机器指令 如果没有。
答案 0 :(得分:1)
我没有得到第三个。成本如何3?
对于类似的第三个例子,BLTZ * R3的成本,R0为3 以上。但这个成本是1.如何?
因为:涉及寄存器的寻址模式没有额外的成本。
我不理解上面引用文字中的粗体部分。
显然,这种架构的机器代码使用一个字来指定操作码和寄存器操作数,如果需要,则使用另一个字。
例如LD R1,*100(R2)
需要2个单词。第一个指定操作(LD
具有寄存器相对偏移量)以及目标寄存器R1
和基址寄存器R2
。这些是字中的位域。然后第二个单词包含cpu知道要获取的100
,因为第一个单词中的操作码。
一些固定长度的体系结构将常量打包到第一个单词中,但显然它们只能具有有限的范围。使用单独的单词允许全范围。
答案 1 :(得分:1)
我相信其他人可以更好地解释这一点。但是,这里有一些灵感:
费用 NOT 是真实的,根据龙书的定义,它们假定。要了解 real < / em>成本,您必须检查目标体系结构的表。请参阅SO维基以获取相应的链接。
通过与上述引用相关的三个例子来说:
我们将指令的成本视为一个
因此,假设每条指令的成本为一个!
涉及内存位置或常量的那些额外成本为
所以示例1到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个。
但是,内存访问的成本已经上升,因为处理器加速而内存与这些增加不匹配。现在大量的优化工作是面向缓存行(确保具有相互位置的指令,如果可能的话,从单个缓存行中访问数据),并且因为您无法预测哪些内存访问将是缓存未命中,您无法再轻松地从编译器中预测执行时间。