Проблема при переводе с MIPS на C - PullRequest
1 голос
/ 10 августа 2011

Я пытался решить это домашнее задание, но не смог найти решение. Ниже проблема,

Переведите следующий код MIPS в языковую программу высокого уровня. Предположим, что $ t0, $ t1 и $ t2 содержат базовые адреса массивов A, B и С соответственно.

add $t4, $zero, $zero
Loop:
add $t5, $t4, $t1
lw $t6, 0($t5)
add $t5, $t4, $t2
lw $t7, 0($t5)
add $t6, $t6, $t7
add $t5, $t4, $t0
sw $t6, 0($t5)
addi $t4, $t4, 4
slti $t5, $t4, 256
bne $t5, $zero, Loop
Also find the decimal value in the offset field of bne

инструкция.

Вот то, что я пробовал, но пока не нахожу позицию 256.

int *temp4 = 0;
while(1)
{
    *int temp5 = temp4 +B[0];
    a:
        *int temp6 = temp5;
        temp5 = C[0] + temp4;
        *temp7 = temp5;
        temp6 = temp6 + temp7;
        temp5 = temp4 + A[0];
        temp6 = temp5;
        temp4 += 4;
        if(temp5 < temp4)
            goto __;
        if(temp5 != 0)
            goto a;
}

1 Ответ

4 голосов
/ 10 августа 2011

Я думаю, что вы слишком много думаете.

То, что делает этот код, выглядит примерно так

for (int i =0 ; i< 64; i++){

   A[i] = B[i] + C[i];

}

Не буду объяснять, почему, так как это очень похоже на , это домашнее задание.

Вот то, что я пробовал, но пока не могу найти позицию 256.

Вы все путаете. Видите, что i в конце slti? Это означает, что он использует промежуточный операнд, в данном случае 256. Поэтому инструкция slti $t5, $t4, 256 устанавливает 1 в регистре $t5, если содержимое $t4 меньше 256. В противном случае $t5 получает 0.

Следовательно, цикл будет проходить 256/4 итерации, поскольку bne будет проходить (то есть не прыгать) только тогда, когда содержимое $t4 больше 256.

...