Я писал код MIPS для колледжа, чтобы посмотреть, как работают функции внутри функций, и сначала все работало нормально. Я использую WinMIP64 симулятор .
Затем, после того, как я включил BTB, все ломалось (он застрял в бесконечном цикле во второй функции).
Я сходил с ума, пока не понял, что это произошло из-за BTB (в одной из функций была буква ab, и я хотел уменьшить количество возникающих в результате остановок Branch Taken). Когда я его выключил, все снова заработало нормально.
Я включил часть кода ниже.
.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 и вызовы функций внутри функций?
Это не было включено в нашу программу, поэтому я спрашиваю здесь.