我正在为大学写一些 MIPS 代码,看看函数中的函数是如何工作的,一开始一切都很好。我正在使用WinMIP64 模拟器。
然后,在我打开 BTB 之后,一切都崩溃了(它在第二个函数中陷入了无限循环)。
我快疯了,直到意识到这是因为 BTB(其中一个函数中有 ab,我想减少一些因此出现的 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 和函数调用,我需要更改什么?
这不在我们的计划中,所以我在这里问。