Assembly 小分支预测练习(非家庭作业)
这不是家庭作业。我在读一本书,IMO,它对分支预测有很好的介绍,并决定在讲座结束后尝试解决一个问题: 考虑以下代码[无分支延迟插槽]:Assembly 小分支预测练习(非家庭作业),assembly,branch-prediction,micro-architecture,Assembly,Branch Prediction,Micro Architecture,这不是家庭作业。我在读一本书,IMO,它对分支预测有很好的介绍,并决定在讲座结束后尝试解决一个问题: 考虑以下代码[无分支延迟插槽]: add $2, $0, $0 addi $11, $0, 5 addi $12, $0, 3 outer: addi $2, $2, 1 add $1, $0, $0 inner: addi $1, $1, 1 bne $1, $11, inner bne $2, $12, outer 第一条add指令位于地址0处 如果
add $2, $0, $0
addi $11, $0, 5
addi $12, $0, 3
outer:
addi $2, $2, 1
add $1, $0, $0
inner:
addi $1, $1, 1
bne $1, $11, inner
bne $2, $12, outer
第一条add指令位于地址0处
两个人。预测失误率为13/5(13次预测失误,5次预测)
熟悉这门学科的人能检查一下吗?只是想知道我是否真的理解了讲座的内容。 谢谢。$0(也称为r0或$0)是一个始终为零的寄存器。便于比较和设置变量,在您的示例中,它用于设置变量。请注意,“add$2,$0,$0”相当于“addi$2,$0,0”,即(在类C表示法中)“$2=0;”。使用不同格式的mips指令编码的相同表达式 如果我们以类似于C的方式编写汇编代码,它将如下所示:
$11 = 5;
$12 = 3;
$2 = 0;
while ($2 != $12){
$2++;
$1 = 0;
while ($1 != $11)
$1++;
}
希望这有帮助。寄存器$0可能总是0,类似于
addi$11,0,0
的内容将是非法的,因为没有CPU支持带有两个立即操作数的指令,因为它们实际上没有用处。同意。我是说smth。比如addi$2,$0,0。但是,在这个上下文中必须是相同的。asm有do{}while()
循环,就像asm的普通循环一样。启用优化后,您可能希望您的C循环能够在第一次迭代之前优化掉检查,因为它可以证明循环至少运行一次。但是,如果您不打算使用与asm相同的循环结构来编写它,那么您可以将其作为for
循环来编写。这是公平的。然而,我的目标是让代码更容易理解,我觉得while循环比whiles更干净。这当然是有争议的。我觉得理解do{}while()
循环对于理解正常的asm()是至关重要的。一旦习惯了阅读asm,就可以轻松地阅读C中的do/while循环。