在移动指令以填充MIPS中的分支延迟时隙时处理立即偏移

时间:2012-11-01 07:06:43

标签: assembly mips

某些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

1 个答案:

答案 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)。这是lwaddi之间的重新排序,它影响了立即数(addi无法移动到延迟槽,因为分支取决于$ 3的新值。)