我有一个家庭作业问题:
假设变量fghij分别分配给寄存器$s0$s1$s2$s3$s4。假设数组的基址AB分别位于寄存器$s6$s7中。

B[8] = A[i–j];

对于上面的c语句,对应的mips程序集代码是什么?
答案是:
SUB $t0, $s3, $s4

SLL $t0, $t0, 2

ADD $t0, $t0, $s6

lw $t1, 0($t0)  # A[i - j] in is $t1


ADDI $t0, $zero, 8

SLL $t0, $t0, 2

ADD $t0, $t0, $s7

SW $t1, 0($t0)  # $t1 is Stored in B[8]

我的问题是,为什么还要费心处理第二个代码块的前3行呢?如果您知道$t1将存储在array B的第八个元素中,那么所需的唯一指令就是SW $t1, 32($s7)。如果我没弄错的话,这相当于第二段代码。

最佳答案

我想答案是即使两段代码产生相同的结果,也就是说。

  ADDI $t0, $zero, 8
  SLL $t0, $t0, 2
  ADD $t0, $t0, $s7
  SW $t1, 0($t0)  # $t1 is Stored in B[8]


  SW $t1, 32($s7)  # $t1 is Stored in B[8]

第一个消耗更多的CPU周期。
任何简单的编译器都可以发出第一段代码,因为它是高级语句B[8] = result_of_calculation的直接翻译。
第二段代码需要进行一点静态分析(即编译器必须考虑到$s7保存数组b的基址,同时还要考虑到您将处理该数组的8个位置。
我的猜测是,任何现代编译器都会执行最小的静态分析,因此会发出第二条指令,而不是第一段代码。

10-06 10:24