某些MIPS指令具有即时偏移。
例如,在移动lw
命令填充beq
下方的分支延迟槽时,其立即偏移量从100变为96.
PC Loop: lw $2, 100($3)
PC+4 addi $3, $3, 4
PC+8 beq $3, $4, Loop
转化为
PC Loop: addi $3, $3, 4
PC+4 beq $3, $4, Loop
PC+8 lw $2, 96($3) # branch delay slot
是因为PC总是PC + 4,所以它是100 - 8 + 4 = 96吗? 如果指令正在上升会发生什么? 例如,
PC Loop: xxxxxxxxxxxxx
PC+4 addi $5, 4($5)
这是正确的吗?
PC Loop: addi $5, 4($5)
PC+4 xxxxxxxxxxxxx
答案 0 :(得分:2)
立即改变与PC无关。
Loop: lw $2, 100($3)
addi $3, $3, 4
beq $3, $4, Loop
在原件中,您从地址($ 3 + 100)加载,然后将4加到$ 3.
Loop: addi $3, $3, 4
beq $3, $4, Loop
lw $2, 96($3) # branch delay slot
在转换过的那个中,你加4到$ 3,然后从地址加载($ 3 + 96)=(original_ $ 3 + 4 + 96)=(original_ $ 3 + 100)。这是lw
和addi
之间的重新排序,它影响了立即数(addi
无法移动到延迟槽,因为分支取决于$ 3的新值。)