c - 使用 MIPS 指令集时,为什么使用逻辑左移比使用加载/存储字中的偏移量更有益?

标签 c mips logical-operators bit-shift

我有一个家庭作业问题:

假设变量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 的直接翻译。

第二 block 代码需要一点静态分析(即编译器必须考虑到 $s7 保存数组 B 的基地址,并且还要考虑到您将寻址这种数组的八个位置。

我的猜测是任何现代编译器都会执行最少的静态分析,因此会发出第二条指令而不是第一段代码。

关于c - 使用 MIPS 指令集时,为什么使用逻辑左移比使用加载/存储字中的偏移量更有益?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28598869/

相关文章:

r - 根据 2 个不同变量的值从矩阵中选择

PHP基本运算符

c - 如何比较两个字符数组?

c - 使用 POSIX 共享内存和信号量以 block 的形式传输文件

c++ - 在 C/C++ 中迭代字母表

c - 如何在 Qt Creator 中为 Clang 静态分析器设置语言标准 (-std)

assembly - 如何在 MIPS 中访问一个字的各个位的状态?

c - 这个typedef是什么意思?

assembly - MIPS 上的嵌套子程序调用

assembly - 从键盘输入 MIPS 程序集失败