首页 文章

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

提问于
浏览
3

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

我们将假设每个目标语言指令都有相关的成本 . 为简单起见,我们将指令的成本加上与操作数的寻址模式相关的成本加上一个 . 该成本对应于指令的单词长度 . 涉及寄存器的寻址模式具有零附加成本,而涉及存储器位置或其中的常量的那些具有额外成本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,如果不是,则允许控制传递到下一个机器指令 .

5 回答

  • 1

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

    • 1表示指令

    • 1用于从下一个单词中获取常量100

    • 1用于从R2 100获取值

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

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

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

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

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

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

  • 1

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

    The costs are NOT real, they are assumed by definition of the Dragon book. 要了解实际成本,您必须检查目标体系结构的表 . 请参阅SO维基以获取相应的链接 .

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

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

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

    那些涉及内存位置或常量的内容需要额外付费

    所以例子1到3都有

    • 1指令0 mem / const = 1

    • 1指令1 mem = 2

    • 1指令1 mem 1 one const = 3

    存储器地址和常量分别在指令OpCode中编码,在延长,待取,影响CPU Op / microOp处理的OpCode字节中 .

  • 0

    有一个list of errors in dragon book . 您所说的问题在我的书中的第515页,列表在第515页说明

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

  • 0

    这本书是一个错误 .

    成本模型仅涉及指令长度

    此长度对应于指令的字长

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

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

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

    由于指令访问,因此没有提及额外的成本记忆 .

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

  • 1

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

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

相关问题