1

一年前我参加了计算机组织课程,现在我将其作为“计算机体系结构”进行跟进,我正在使用 John Hennessy 的《计算机体系结构的定量方法》一书的第三版,我通过了 MIPS ISA但仍需要一些帮助,你能更详细地解释一下这行代码吗?

源代码:

for(i=1000; i>0; i--)
    x[i] = x[i] + s;

汇编代码:

   Loop:      L.D         F0, 0(R1)          ; F0 = array element
              ADD.D       F4, F0, F2        ; add scalar
              S.D         F4, 0(R1)          ; store result
              DADDUI      R1, R1,# -8      ; decrement address pointer
              BNE         R1, R2, Loop    ; branch if R1 != R2

这是作为循环展开以利用 ILP 的示例给出的,我有一些疑问。我确实知道数组从 Mem[0+R1] 开始并向后直到 Mem[R+8](如文中给出) ,这是什么原因,或者他们只是随机取了这个位置?

另外,当我们添加有符号数 (-8) 时,为什么要使用 DADDUI (unsigned ) ?

请对此进行详细概述,以便我可以关注其余主题。谢谢

4

1 回答 1

4

内存访问是按照源代码中循环指定的顺序对地址进行的。

daddiu指令足以执行这种地址算术。“负”值在二进制补码中完成减法。地址既不是消极的也不是积极的;它们只是位模式。请参阅ISA 参考以了解有关 MIPS 和说明的更多信息。

将 16 位有符号立即数添加到 GPR rs 中的 64 位值,并将 64 位算术结果放入 GPR rt 中。在任何情况下都不会发生整数溢出异常。

…</p>

指令名称中的术语“无符号”是用词不当;此操作是 64 位模运算,不会在溢出时陷入陷阱。它适用于无符号算术(例如地址算术)或忽略溢出的整数算术环境(例如 C 语言算术)。

该示例未优化或展开。这只是源的字面翻译。

于 2015-03-29T08:36:00.550 回答