Mips одинарной точности (с использованием метода Ньютона) - PullRequest
1 голос
/ 27 марта 2012

Я нахожусь в классе компьютерных арок, и мы делаем мип, используя одинарную точность. Домашнее задание предполагает создание метода Ньютона. Я написал все необходимые функции, но не могу понять, что именно не так с кодом. Я также не совсем уверен, как выводить значения на экран. Вся помощь очень ценится. Я написал комментарии построчно, чтобы объяснить, что я делаю.

Вот мой код:

# Newtons Method
# g(x) = (-x^3) + 11
# g'(x) = -3x^2


.data
precision: .float .00001


main:
jal newtons_gee

newtons_top:

li $s2, 11      # stores 11 into the $s2 register
mtc1 $s2, $f5       # moves the value of $s1 (3) to the coproc 1
mul.s $f1,$f0,$f0   # This finds x^2 
mul.s $f1,$f0,$f1   # This finds x^3
add.s $f2,$f1,$f5   # adds the value of (x^3) + 11 and stores it into $f2 as         asked

newtons_bot:
li $s1, -3      # stores -3 into the $s1 register
mtc1 $s1, $f3       # moves the value of $s1 (-3) to the coproc 1   
mul.s $f5, $f3,$f0  # Calculating -3x in derivative of the original function
mul.s $f4,$f5,$f0   # Calculates -3x^2 and stores it in $f4 as asked

newtons_err:
jal newtons_top     # Calls newtons_top
jal newtons_bot     # Calles newtons_bot
div.s $f6,$f2,$f4   # Calculates g(Xn)/ g'(Xn) and stores it in $f6 as asked

newtons_nth:
addi $a0,$a0,1      # Increases the current iteration by 1
jal newtons_err     # Call newtons_err
sub.s $f7,$f0,$f6   # Calculate value of En
mov.s $f7,$f0       # Find the new nth 
abs.s $f3, $f3      # Flag Case
l.s $f9, precision  # Precision 
c.lt.s $f3, $f9         # set the flag if |x'-x| < 0.00001    stores in $v0
j newtons_nth       # Repeat
newtons_gee:
li $f0, 1       # Sets the Xn to 1
li $a0, 1       # Sets the current iteration
jal newtons_nth # Calls newtons_nth

1 Ответ

3 голосов
/ 28 марта 2012

Несколько советов:

  • Когда вы вызываете функцию, вам нужно вернуться, иначе ваш код просто перейдет к следующему разделу. Newtons_top будет работать с newtons_bot, newtons_bot собирается с newtons_err, а затем они просто будут вызваны снова, что приведет к бесконечному циклу. Ярлыки - это просто ярлыки; они волшебным образом не завершают вашу функцию. Адрес возврата автоматически загружается в $ra при использовании инструкции jal. Поэтому вы можете вернуться, используя jr $ra.

  • Когда у вас есть вложенные вызовы, например, в newtons_err, ваш $ra будет раздавлен. Поэтому перед использованием jal необходимо выполнить резервное копирование $ra, а затем восстановить его до возврата.

  • Когда заканчивается ваш цикл? У вас нет условия выхода. Вы проверяете точность, но у вас нет условного перехода после этого. Это будет продолжаться вечно.

  • Вы хотите использовать значения 11 и -3, но неправильно загружаете их в регистры с плавающей запятой. Когда вы используете mtc1, вы копируете значения дословно. Проблема в том, что 11 как целое число равно , а не так же, как 11 в плавающей точке Вам нужна дополнительная инструкция для преобразования ее в число с плавающей точкой:

    cvt.s.w $f5, $f5

    Вот ссылка, содержащая это преобразование: http://www.doc.ic.ac.uk/lab/secondyear/spim/node20.html

  • li $f0, 1 недействительно. Вы не можете загрузить немедленный в регистр с плавающей точкой. Вы можете использовать тот же метод, что и для 11 и -3, но вам все равно понадобится приведенная выше инструкция преобразования.

  • Поскольку вы загружаете константы (11, -3, 1) в плавающие регистры, вы можете сохранить инструкцию, объявив их как плавающие в разделе данных и используя l.s $fX, someLabel вместо li $s2, someConstant - > mtc1 $s2, $fX.

  • Набор команд MIPS не знает, что означает печать на экране. Печать на экран предполагает связь с другим оборудованием, поэтому для ответа на этот вопрос вам необходимо знать, какое оборудование установлено на вашей плате.

...