C到MIPS - 翻译一个简单的代码

时间:2012-06-05 19:52:11

标签: c mips

int i;
void set_array(int num) {
    for (i=0; i<10;i++) {
        A[i] = compare(num,i);
    }
}

int compare (int a, int b) {
    if ((a-b) >= 0)
        return 1;
    else return 0
}

在这里遇到一些问题。

我的主要问题是:如何将比较(num,i)插入A [i]?

顺便说一句,我完全是初学者,很抱歉,如果它太容易被问到了。

2 个答案:

答案 0 :(得分:1)

在C中,您无法“插入”值。首先,您必须使用

声明[global]表A.
int A[10];

假设10是大小,基于for循环限制或

int *A;

然后代码中的其他地方:

A = malloc (10 * sizeof *A);

所以你将为10个元素分配一个空间。然后你可以设置w每个元素的值(就像你使用compare()赋值)。

答案 1 :(得分:1)

这是一个多步骤的过程。第一部分是传递参数来比较和调用它。完成比较后,它将返回一个值。这个返回值将存储在A [i]中。

您可以将其视为:

int temp = compare(num,i);
A[i] = temp;

其中temp不超过$ v0(返回值)。

A [i]的地址的内存位置A + i的地址是A元素的大小。对于这个答案,因为你没有真正指定A的类型,我会假设它是一个int阵列。此外,我还假设你的MIPS机器上的int是4字节(或一个字)。

考虑到这一点,A [0]是A + 0的地址.A [1]是A + 4的地址.A [2]是A + 8的地址。依此类推。

粗略的轮廓是:

set_array:
    # save $ra to stack
    la      $s1, A         # assuming $s1 isn't used for anything
    # loop code starts here
                           # A[i] = compare(num,i);
    move    $a0, $a0       # num (Here for completeness, it does nothing)
    move    $a1, $s0       # I am just assuming variable 'i' is in $s0
    jal     compare        # call compare
    sw      $v0, 0($s1)    # store the return value in A+4*i
    addiu   $s1, $s1, 4    # inc it by 4, for the next element
    # i = i + 1
    # jump back up
    # restore $ra
    jr      $ra

# ...

compare:
    # code to compare and
    # return 1 or 0 in $v0
    jr      $ra