Индексирование массива в цикле for в сборке MIPS - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно реализовать этот код в эмуляторе MARS:

int x[10] = { /* initial values */ } ;
int i;

for(i=0; i<10; i++){
    print i;
}

for (i=0; i<10; i++){
    x[i] = 2*i+1;
    print x[i];
}

Вот что у меня есть:

.data

i:  .word 0
x:  .word 1,2,3,4,5,6,7,8,9,10

    .align 2

    .text
    .globl main
main:
lw  $t0, i
lw  $t1, x
li  $t4, 4

        jal L0 
        li  $t0, 0
        jal L1
        li $v0, 10            # terminate 
        syscall


L0:
    li $v0, 1
    la $a0, ($t0)
    syscall
    addi    $t0, $t0, 1
        bge    $t0,10, RETURN         #goto L1 if NOT n<0
        b L0

L1:
    li $v0, 1
    la $a0, ($t1)
    syscall
    mul $t2, $t0, $t4
    lw $t1, x + ($t2)    #########this line#########
    addi    $t0, $t0, 1
    bge $t0,10, RETURN
    b L1

RETURN:
    jr $ra

Я прокомментировал рядом со строкой, что я считаю источником моей проблемы. По сути, это строка, которая ссылается на x [i]. Я умножил i на 4 и добавил это значение к x, пытаясь сослаться на соответствующее слово в массиве. Я не знаю, как правильно реализовать эту концепцию.

Спасибо за помощь.

1 Ответ

1 голос
/ 12 апреля 2019

Вам нужно сделать что-то вроде этого:

L1:
    la $a1,x          # $a1 = &x
L2:                   # do {
    addu $a0,$t0,$t0  #   $a0 = i*2
    addiu $a0,$a0,1   #   $a0 = i*2 + 1
    sw $a0,($a1)      #   x[i] = i*2 + 1
    addiu $a1,$a1,4   #   a1 = &x[i+1]
    li $v0,1          #   print_int
    syscall           #   print_int(i*2 + 1)
    addiu $t0,$t0,1   #   i++
    bne $t0,10,L2     # } while (i != 10)
    jr $ra

А такие вещи, как la $a0, ($t0), выглядят действительно странно.Пожалуйста, используйте вместо этого более ясное move $a0, $t0.

...