从 c 到 mips 的翻译

translation from c to mips

你能帮我把这段代码从c翻译成mips吗?下周我要考试,但我不能做这部分,这对我来说很难:( 这是代码:

int A[4] = { 2, 3, 4, 5 };
int B[4] = { 1, 1, 2, 3 };
int C[4] = { 0, 0, 0, 0 };

void
main()
{
    int actualizacion = 1;

    updateValues(4);
    actualizacion = actualizacion + 1;
}

void
updateValues(int var)
{

    switch (var) {
    case 4:
        do {
            var = var - 1;
            A[var] = B[var] - C[var];
        } while (var != 0);
        break;

    default:
        var = var * 2;
        break;
    }
}

您没有提及您使用的 IDE(例如 spimmips 等)。所以,我用了 mars.

在 C 中,当您对数组进行索引时,编译器会根据元素的大小 [以字节为单位] 计算偏移量(例如,对于 int,这是 4)。所以,如果代码是:

x = C[var]

“有效”代码为:

x = *(int *) (((char *) C) + (var * 4));

在汇编程序中,我们必须做同样的事情。

这是带注释的代码:

    .data
A:  .word   2, 3, 4, 5
B:  .word   1, 1, 2, 3
C:  .word   0, 0, 0, 0

    .text
    .globl  main
# s0 -- actualizacion
main:
    li      $s0,1                   # actualizacion = 1

    li      $a0,4
    jal     updateValues

    addi    $s0,$s0,1               # actualizacion += 1

    li      $v0,10
    syscall

    .globl  updateValues
# a0 -- var (array index)
# t0 -- var << 2 (byte offset)
# t1 -- array address
# t2 -- B value
# t3 -- C value
updateValues:
    li      $t0,4
    bne     $a0,$t0,update_default

update_loop:
    addi    $a0,$a0,-1              # var -= 1
    sll     $t0,$a0,2               # convert index into byte offset

    la      $t1,B                   # base address of B
    addu    $t1,$t1,$t0             # add in byte offset
    lw      $t2,0($t1)              # load value

    la      $t1,C                   # base address of C
    addu    $t1,$t1,$t0             # add in byte offset
    lw      $t3,0($t1)              # load value

    sub     $t2,$t2,$t3             # B - C

    la      $t1,A                   # base address of A
    addu    $t1,$t1,$t0             # add in byte offset
    sw      $t2,0($t1)              # store value

    bnez    $a0,update_loop         # loop until var == 0
    b       update_exit

update_default:
    li      $t0,2
    mul     $a0,$a0,$t0             # var = var * 2

update_exit:
    jr      $ra                     # return