Мой ответ ниже, просто помогите мне немного проверить. Спасибо вам большое!
Переведите следующее на язык ассемблера 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, кажется, предполагает, что мне может понадобиться использовать указатель стека для этого. Но я не знаю, как это сделать, и думаю, что его можно собрать без использования стекового регистра. Что, вы парни, думаете?
Несколько вещей…
Во-первых, я предполагаю, что это должен быть выход, а не выход.
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. При этом я здесь, чтобы помочь, поэтому любые дополнительные вопросы не стесняйтесь задавать.
Пытаться этот? Это конвертер кода.