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;
}
这些局部变量 temp
和 lastA
在 MIPS 汇编中工作得很好,每个 CPU 寄存器。
我是 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;
}
这些局部变量 temp
和 lastA
在 MIPS 汇编中工作得很好,每个 CPU 寄存器。