我有一个家庭作业问题:
假设变量f
、g
、h
、i
和j
分别分配给寄存器$s0
、$s1
、$s2
、$s3
和$s4
。假设数组的基址A
和B
分别位于寄存器$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个位置。我的猜测是,任何现代编译器都会执行最小的静态分析,因此会发出第二条指令,而不是第一段代码。