有谁能以更简单的方式解释这个问题?

时间:2015-03-29 08:18:19

标签: c assembly mips computer-architecture loop-unrolling

一年前我参加了一个计算机组织课程,现在我已经跟进了它,计算机体系结构' ,我正在使用John Hennessy的第3版“计算机体系结构的定量方法”,我通过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(无符号)?

请详细了解这一点,以便我可以按照其他主题进行操作。 感谢

1 个答案:

答案 0 :(得分:4)

对addesses执行内存访问,并按源代码中的循环指定的顺序执行。

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

  

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

     

...

     

指令名称中的“无符号”一词用词不当;这个操作是64位模运算,但没有   陷阱溢出。它适用于无符号算术,如地址算术或忽略溢出的整数算术环境,如C语言算术。

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