Может кто-нибудь посмотреть, правильно ли я делаю мой метод Ньютона в MIPS? (Сборка) - PullRequest
1 голос
/ 10 ноября 2011

Я новичок в этом, и я пытаюсь сделать это без использования сопроцессоров. Какие-либо предложения? Мне действительно нужно делать добро на этом задании! Предполагается, что этот код находится в сборке MIPS, в которой кодирует метод newtons и содержит точки a-e. Я продолжаю получать свой код в asemble, но он падает дно ..... я не уверен, что это значит, хотя.

#Part 1
# (A) 
# g(x) = 0
# x = 7^(1/3)
# g(x) = x^3 - 7
# g'(x) = 3x^2
.data
x: .float 1.0
bb: .float 7.0
c: .float 3.0
epsilom: .float 0.00001
divide: .float 2.0

#=======================================
# (B)
# Write a MIPS function newtons_top that takes 1 “floating-point argument”: 
# $f0   xn, the current estimate of the root 
# It computes your function g(xn) = g($f0), and leaves the result in $f2.  Do not 
# modify $f0’s value.  (This would be a good place to document your g(x).)
newtons_top:
l.s $f0, x
l.s $f1, bb
mul.s $f5, $f0, $f0
mul.s $f0, $f5, $f0
sub.s $f2, $f0, $f1

#=======================================
# (C)
# $f0   xn, the current estimate of the root 
# It computes your function g’(xn) = g’($f0), and leaves the result in $f4.  Do not 
# modify $f0’s value.  (This would be a good place to document your g’(x).)
newtons_bottom:
l.s $f3, c
mul.s $f5, $f0, $f0
mul.s $f4, $f5, $f3


#======================================
#(D)
#  Write a MIPS function newtons_err that takes 1 “floating-point argument”: 
# $f0   xn, the current estimate of the root 
# It computes the error term ?n from (Eq. 3), and leaves the result in $f6.  Do not 
# modify $f0’s value.  Hint: Call your previous function
newtons_err:
div.s $f6,$f2,$f4


#========================================
#(E)

newtons_nth:
div.s $f2, $f0, $f1  # $f2 gets n/x
add.s $f2, $f2, $f1  # $f2 gets n/x + x
div.s $f2, $f2, divide  # $f2 gets x'=(n/x + x)/2
sub.s $f3, $f2, $f1  # $f3 gets x'-x
abs.s $f3, $f3       # $f3 gets |x'-x|
c.lt.s $f3, epsilom     # set the flag if |x'-x| < 0.00001
li $v0, 1


#===========================================
#(F)
#  Write a MIPS function newtons_gee that takes no arguments, and does this: 
#• Initializes x0 = 1.0 from (Eq. 1), by setting $f0 to 1.0. 
# • Repeatedly calls newtons_nth until the return value is non-zero. 
# Remember to pass the current  n in $a0 (even if your implementation 
# doesn’t use it for printing)

newtons_gee:
l.s $f0, 1
beqz $t3, newtons_nth

#=============================================
# Main Block

main:
j newtons_gee
syscall 

1 Ответ

3 голосов
/ 10 ноября 2011

Вот начало.

Следующий код является бессмысленным:

newtons_gee:
    l.s $f0, 1
    beqz $t3, newtons_nth

Для вызова функции в сборке MIPS вы должны использовать инструкцию jal, а не beqz.$t3 имеет неопределенное значение (возможно, отличное от нуля), когда main переходит на newtons_gee, поэтому ветвление не берется и управление возвращается обратно к main.

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

...