MIPS - Помощь при инициализации массива - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь инициализировать массив памяти значениями 1, 2, 3 .. 10. Хотя у меня возникли некоторые проблемы.Вот моя работа на данный момент:

.data
myarray: .space 10
.text
la $t3, myarray  # Load the address of myarray 
addi $t2, $zero, 1  # Initialize the first data value in register.
addi $t0, $zero, 10  # Initialize loop counter $t0 to the value 10

top:

sw $t2, 0($t3)   # Copy data from register $t2 to address [ 0 +
# contents of register $t3]
    addi $t0, $t0, -1   # Decrement the loop counter
    bne $t0, $zero, top  

Любая помощь будет высоко ценится.

1 Ответ

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

Есть несколько проблем с вашим кодом.

  1. Если вы используете sw (сохранить слово), вы принимаете массив "word". Его размер должен быть 4 * 10. Если вы используете байтовый массив, используйте sb.

  2. Вы не увеличиваете указатель массива в $t3

  3. Та же проблема для значений массива в $ t2

.data
  myarray: .space 10
.text
    la $t3, myarray     # Load the address of myarray 
    addi $t2, $zero, 1  # Initialize the first data value in register.
    addi $t0, $zero, 10 # Initialize loop counter $t0 to the value 10
top:
    sb $t2, 0($t3)      # Copy data from register $t2 to address [ 0 +
                        # contents of register $t3]
    addi $t0, $t0,-1    # Decrement the loop counter
    addi $t3, $t3, 1    # next array element
    addi $t2, $t2, 1    # value of next array element
    bne $t0, $zero, top  

Как предполагает @PeterCordes, это можно оптимизировать, объединив счетчик цикла и регистр значений массива, чтобы исключить одну инструкцию в цикле. Соответствующий цикл в C будет

for(i=1, ptr=array; i!=11; ptr++,i++) *ptr=i;

и соответствующий код

.data
  myarray: .space 10
.text
    la $t3, myarray     # Load the address of myarray 
    addi $t2, $zero, 1  # Initialize the first data value in register.
    addi $t0, $zero, 11 # Break the loop when array value reaches 11 
top:
    sb $t2, 0($t3)      # Copy data from register $t2 to address [ 0 +
                        # contents of register $t3]
    addi $t2, $t2, 1    # Increment array value/loop counter
    addi $t3, $t3, 1    # next array element
    bne $t0, $t2, top  
...