C to MIPS - функции и массивы - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь перевести следующий код C в сборку MIPS.

Базовый адрес массива хранится в $ a0.Индекс переменной хранится в $ a1.Переменная x хранится в $ t0.

void ld_array(char array[], int index) {
  x = array[index];
}

Когда индекс был определенным целым числом (например, 5), я сделал

lbu $t0, 5($a0) 

Однако, lbu $t0, $a1($a0) - неправильный синтаксис.

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете использовать арифметику указателей для вычисления адреса данных, к которым вы пытаетесь получить доступ.

array[index] эквивалентно *(array+index).Вы можете сделать то же самое в mips, используя инструкцию addu.

Предполагая, что $a0 является указателем массива, а $a1 является индексом, который вы можете использовать:

addu $t0, $a0, $a1 # tmp = array+index
lbu  $t0, ($t0)    # x = *tmp

Мыиспользуют addu, потому что это операция без знака, так как указатели - это слова без знака.Это означает, что он не вызовет исключение переполнения.

Предполагая, что ваш массив будет массивом слов, вы использовали бы тот же подход, но сначала умножьте индекс на 4 (так как слова в 32-битных имеют длину 4 байта).

sll  $t0, $a1, 2   # index << 2 = index * 4
addu $t0, $a0, $t0 # tmp = array+index
lw   $t0, ($t0)    # x = array[index]
...