我正在为大学编写一些MIPS代码,以了解函数中的函数如何工作,并且起初一切正常。
然后,在我打开BTB之后,一切都崩溃了(它陷入了第二个函数的无限循环中。)>
我一直在发疯,直到意识到这是因为BTB(其中一个功能中有b,我想减少因此而出现的某些Branch Taken Stalls)。当我关闭它时,一切再次正常。
我包括以下一些代码。
.data tabla: .byte 1,4,5 res: .space 3 cont: .word 3 num: .word 0 .text daddi $a0, $0, tabla # offset element table daddi $a1, $0, res # offset results table lb $a2, cont($0) # $a2 = 3 (array size) daddi $sp, $0, 0x400 # $sp = 0x400 jal dobles # $ra = 0x14 sd $v1, num($0) # offset element count halt dobles: #first function daddi $sp, $sp, -8 # make space in stack $sp = 0x3f8 sd $ra, 0($sp) # 0x3f8 = $ra (0x14) loop: lb $s0, 0($a0) # saving element from table in $s0 daddi $a0, $a0, 1 # add 1 byte displacement to $a0 daddi $sp, $sp, -8 # $sp = 0x3f0 sd $s0, 0($sp) # 0x3f0 = tabla element jal multi # $ra = 0x38 sb $v0, 0($a1) # saving result to res daddi $a1, $a1, 1 # displacement + 1 byte daddi $a2, $a2, -1 # counter -1 bnez $a2, loop # loop till counter is 0 ld $ra, 0($sp) # load $ra from stack daddi $sp, $sp, 8 jr $ra multi: # second function ld $t0, 0($sp) # load element from stack daddi $sp, $sp, 8 daddi $v1, $v1, 1 # count numer of elements dadd $v0, $t0, $t0 # element * 2 jr $ra
为什么会这样?对函数的调用是否会对缓冲区产生某种影响(我认为这只是用于分支)?如果打开了BTB,是否可以在函数内调用函数而不会出现问题?如果要在函数中使用BTB和函数调用,我需要更改什么?
这不在我们的程序中,所以我在这里问。
我正在为大学编写一些MIPS代码,以了解函数中的函数如何工作,并且起初一切正常。然后,在我打开BTB之后,一切都崩溃了(它卡在了一个...
BTB是分支预测结构。它对正确性的影响为零,仅对性能有影响。在架构上不可见。