Сборка — Преобразован C ++ в MIPS. Помоги мне проверить немного

Мой ответ ниже, просто помогите мне немного проверить. Спасибо вам большое!

Переведите следующее на язык ассемблера MIPS

 void sort(int v[], int n)

{    int i,j;

for (i=1; i<n; i++) {
j=i-1;
while (  (j >=0) && (v[j] >v[j+1])) {
swap (v[j], v[j+1]);
j=j-1:
}
}
}

Начало массива в $4, п передается в $5, Предположим, что процедура подкачки существует, она ожидает адрес v[j] в $4 и адрес v[j+1] в $5

Это то, что у меня есть

        lw $8, 0($4)
li $6, 1
loop    beq $6, $5, exit
addi $6, $6, 1
addi $7, $6, -1

bltz $7, eit
lw  $9, 0($4)
slti $10, $9, $8
beq $10, $0, exit
swap
addi $7, $7, -1
j   loop

выход

Кроме того, qn, кажется, предполагает, что мне может понадобиться использовать указатель стека для этого. Но я не знаю, как это сделать, и думаю, что его можно собрать без использования стекового регистра. Что, вы парни, думаете?

-4

Решение

Несколько вещей…
Во-первых, я предполагаю, что это должен быть выход, а не выход.

bltz $7, eit

Во-вторых, что вы пытаетесь сделать здесь? Если я правильно понимаю, начало массива v [] в $ 4. Итак, вы загружаете v [0] в $ 9.

lw  $9, 0($4)

В-третьих, вы не можете использовать slti с 3-мя регистрами. Это «установлено меньше, чем немедленно».

slti $10, $9, $8

В-четвертых, о регистре стека. Когда вы вызываете процедуру (например, функцию подкачки в вашем коде), вы должны сохранить аргументы в правильных регистрах. Вы говорите, что он ожидает v [j] в $ 4 и v [j + 1] в $ 5. В вашей функции сортировки n хранится в $ 5, поэтому вам нужно будет сохранить n в стеке, чтобы убедиться, что он не перезаписывается вызовом вложенной функции.
Это можно сделать так:

addi $sp, $sp, -4    # makes room for one word on stack
sw $5, 0($sp)        # store n on the stack

В этом конкретном примере после первого вызова подкачки значение n будет перезаписано аргументом, предоставленным для перестановки в $ 5, и ваш цикл for будет неправильным, поскольку он не может оценить

i < n

должным образом.
Когда вы возвращаетесь из свопа, вы восстанавливаете значение из стека:

lw $5, 0($sp)       # restore n
addi $sp, $sp, 4    # readjust stack pointer

Вам нужно сделать еще несколько необходимых шагов, прежде чем вы сможете безопасно вызывать swap …
Также кажется, что адресация вашего массива выключена. Может быть, вернитесь и посмотрите, как правильно обращаться с массивами в MIPS. При этом я здесь, чтобы помочь, поэтому любые дополнительные вопросы не стесняйтесь задавать.

1

Другие решения

Пытаться этот? Это конвертер кода.

0

По вопросам рекламы [email protected]