1

一些 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
4

1 回答 1

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) 加载。它是影响即时(不能移动到延迟槽,因为分支取决于 $3 的新值)之间lw的重新排序。addiaddi

于 2012-11-01T11:22:34.920 回答