MIPS 上的数组操作和循环

Array operations and loops on MIPS

我是 Assembly 的新手,我需要一些帮助通过 C 循环将其转换为 MIPS 代码。我有以下循环:

int A[40], B[40], i;
for (i=1; i < 40; i++) {
    B[i] = A[i] + A[i-1];
    A[i] = 5*B[i] ;
}

我对这个例子中带有变化变量的数组操作一无所知,比如我。

I dont have any clue about array operations with changing variables such as i in this example.

按照 C 代码中的说明操作即可,不必担心数组内容在循环过程中会发生变化。对于 B[i] = A [i] + A[i-1] ===> 计算 i*4+A,加载它,计算 (i-1)*4+A,加载它,将它们相加,计算 i*4+B,将相加结果存储在那里...

稍后您可能会看到 A[i]A[i-1]B[i] 可以共享一些地址计算(例如,它们都使用 i*4),但事实并非如此第一步是必要的——所以,只要按照 C 代码所说的去做:逐字翻译每一小段。您的第一个 objective 是让汇编与 C 一样工作 — 不要在转换为汇编时尝试优化 C 算法。

如果要优化算法,请先在 C 中执行,然后将其转换为汇编。

在汇编中你会看到一些微优化,所以你可以在翻译成汇编后做更多的机器代码优化,但这可能不是你应该优化算法本身的地方。


让您了解我们如何在 C:

中对其进行优化
int A[40], B[40], i;
for (i=1; i < 40; i++) {
    int temp = A[i] + A[i-1];
    B[i] = temp;
    A[i] = 5*temp;
}

我们像上面一样做了一些小改动。然后也许:

int A[40], B[40], i;
int lastA = A[0];
for (i=1; i < 40; i++) {
    int temp = A[i] + lastA;
    B[i] = temp;
    lastA = 5*temp;
    A[i] = lastA; 
}

这些局部变量 templastA 在 MIPS 汇编中工作得很好,每个 CPU 寄存器。