# # program to get a float from user and echo, using SPIM system calls # .text .globl main main: # # opening linkage (save return address) # addi $sp, $sp, -4 sw $ra, 0($sp) # # prompt # la $a0, prompt li $v0, 4 # "print string" syscall syscall # # register usage: # # $f2 -- number to find root of # $f4 -- threshold # $s0 -- maxiter # li $v0, 6 # "read float" syscall syscall mov.s $f2, $f0 li $v0, 6 # "read float" syscall syscall mov.s $f4, $f0 li $v0, 5 # "read int" syscall syscall addi $s0, $v0, 0 # do Newton's method for finding square root # # C version: # float guess = input; # int iter = 0; # while ((fabs(guess*guess - input) > threshold) && (iter < maxiter)) { # guess = 0.5 * (guess + input/guess); # iter += 1 # } # # register usage: # $f6 -- current guess # $s1 -- iteration count # $f8 -- 0.5 # float guess = input; int iter = 0; mov.s $f6, $f2 addi $s1, $zero, 0 l.s $f8, onehalf Loop: # if (fabs(guess*guess - input) <= threshold) goto EndLoop mul.s $f0, $f6, $f6 # $f0 <- guess*guess sub.s $f0, $f0, $f2 # $f0 <- guess*guess - input abs.s $f0, $f0 # $f0 <- fabs(guess*guess - input) c.le.s $f0, $f4 # $f0 <= threshold? bc1t EndLoop # if (iter >= maxiter)) goto EndLoop slt $t0, $s1, $s0 beq $t0, $zero, EndLoop # guess = 0.5 * (guess + input/guess); div.s $f0, $f2, $f6 # $f0 <- input/guess add.s $f0, $f0, $f6 # $f0 <- guess + input/guess mul.s $f6, $f0, $f8 # guess <- 0.5 * (guess + input/guess) # iter += 1 addi $s1, $s1, 1 # goto Loop j Loop EndLoop: # print results # printf("Computed square root of %f is %f, iterations %d\n", # input, guess, iter); la $a0, msg1 li $v0, 4 # "print string" syscall syscall mov.s $f12, $f2 li $v0, 2 # "print float" syscall syscall la $a0, msg2 li $v0, 4 # "print string" syscall syscall mov.s $f12, $f6 li $v0, 2 # "print float" syscall syscall la $a0, msg3 li $v0, 4 # "print string" syscall syscall addi $a0, $s1, 0 li $v0, 1 # "print int" syscall syscall la $a0, nl li $v0, 4 # "print string" syscall syscall # # closing linkage (get return address and restore stack pointer) # lw $ra, 0($sp) addi $sp, $sp, 4 jr $ra .end main # # area for variables and constants # .data onehalf: .float 0.5 prompt: .asciiz "Enter number to find square root of, threshold, maxiter:\n" msg1: .asciiz "Computed square root of " msg2: .asciiz " is " msg3: .asciiz ", iterations " nl: .asciiz "\n"