Массив MIPS Ввод от пользователя - PullRequest
0 голосов
/ 04 августа 2020

У меня вопрос. Как поместить введенные пользователем данные в массив? Пользователь поместил ввод в другую функцию, и я хочу, чтобы он был моим вводом в свой массив.

1 Ответ

1 голос
/ 04 августа 2020

Сначала создайте массив - например, глобальный массив объявлен в разделе .data с использованием метки и резервирования памяти, возможно, с помощью .space 40, чтобы зарезервировать 10 слов памяти. Если массив находится после строк (для подсказок и распечаток), используя .align 2 перед глобальным массивом, чтобы убедиться, что массив правильно выровнен в памяти.

        .data
        ...
        .align 2
array:  .space 40

Мы также можем использовать динамическое c хранилище для массива через системный вызов 9, sbrk или используйте пространство стека, опуская указатель стека.

Во-вторых, мы делаем ссылки на массив, вычисляя адрес интересующего элемента и используя загрузку или сохранение для этот адрес. Интересующий адрес можно вычислить по формуле array + index * scale, где scale - размер в байтах элементов массива (т.е. 4 для массивов слов). Например, предположим, что индекс массива i находится в регистре $t0, и мы хотим сослаться на массив [i]. Умножение на 4 (что является второй степенью двойки) выполняется с помощью инструкции сдвига.

la $t1, array      # load base address of the array into $t1
sll $t2, $t0, 2    # multiply i by 4 to scale for element size of 4 bytes each
addu $t2, $t2, $t1 # sum base address and scaled i -- $t2 now points to array[i]
lw $t3, ($t2)      # fetch from memory the value referred to by address in $t2

или для присваивания аналогично просто измените загрузку на хранилище, например array [i] = t3

la $t1, array      # load base address of the array into $t1
sll $t2, $t0, 2    # multiply i by 4 to scale for element size of 4 bytes each
addu $t2, $t2, $t1 # sum base address and scaled i -- $t2 now points to array[i]
sw $t3, ($t2)      # store value into memory at array[i]

Используйте эти последовательности внутри al oop, который увеличивает индекс, т.е. Обратите внимание, что мы можем хранить адрес массива в регистре на время l oop, поэтому псевдо-инструкция la может находиться до и за пределами l oop.

Мы можем также используйте указатели вместо индексации. Для этого измените регистр, который ссылается на массив. Вместо того, чтобы каждый раз вычислять array + index * scale, увеличивайте регистр, здесь $t0, на 4 в теле l oop, чтобы указать на следующий элемент в массиве.

loop:
    ...
    lw -or- sw $t3, ($t0)
    ...
    addiu $t0, $t0, 4
    ...
    j loop

другие части корпуса l oop должны будут выполнять операции запроса и ввода данных пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...