addiu t0, $0, 100 // (1)
addiu t0, t0, 1 // (2)
LOOP:
addiu t0, t0, -1 // (3)
bne t0, $0, LOOP // (4)
load ra, 28(sp) // (5)
首先画出这条指令的五级流水线时空图
当执行到第三条指令时,要决定是否跳转,但是这个跳转最多只能在译码阶段才能知道是否发生,如果条件成立就要发生跳转,那么(5)指令的取值就得清空,如果不清空,(6)第6条指令(就是跳转后的指令)就开始执行那么就多执行了一条指令(5)这就会导致程序算出来结果是错的
但是要清空这条指令,就会耗费一定的时间,而清空后的(5)指令的取值 这块就会产生一个空格(专业术语叫bubble),即下面这张图
那么如何才能消除这种情况(要清理(4)那条指令,需要时间,并且会产生bubble)
那就是接下来要引出的延迟槽指令:
首先把程序调整为如下
addiu t0, $0, 100 // (1)
LOOP:
bne t0, $0, LOOP // (2)
addiu t0, t0, -1 // (3)
load ra, 28(sp)
修改后的指令的五级流水线时空图
这样的话,因为(3)指令是一定要执行的,即使(2)指令只能在译码完成之后才能决定是否跳转,也就是(4)指令不管咋执行,就不需要去清空3指令了,这就是延迟槽,(3)指令叫延迟槽指令