Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- msg_x: .asciiz "Please enter x: "
- msg_e: .asciiz "Please enter epsilon: "
- res: .asciiz "sin x = "
- n: .asciiz "\n"
- two_pi: .double 6.283185
- .text
- fac: addi $sp, -20
- s.d $f0, 16($sp)
- s.d $f2, 8($sp)
- li.d $f2, 0.0
- mov.d $f12, $f2
- c.lt.d $f0, $f2
- bc1t fac_ret
- li.d $f2, 1.0 # compare register
- li.d $f12, 1.0
- fac_while: c.lt.d $f2, $f0
- bc1f fac_ret
- mul.d $f12, $f12, $f0
- sub.d $f0, $f0, $f2
- j fac_while
- fac_ret: l.d $f0, 16($sp)
- l.d $f2, 8($sp)
- addi $sp, 20
- jr $ra
- # fac will accept two double arguments x, y and will calculate (x^y)/y! in $f12
- frac: addi $sp, -40
- s.d $f0, 36($sp) # f0 will get x but hold y
- s.d $f2, 28($sp) # f2 fill get y
- s.d $f4, 20($sp)
- s.d $f6, 12($sp) # $f6 will hold x
- sw $ra, 4($sp)
- mov.d $f6, $f0
- mov.d $f4, $f0
- mov.d $f0, $f2
- mov.d $f2, $f4
- jal fac
- frac_while: li.d $f4, 1.0
- c.lt.d $f4, $f0
- bc1f frac_ret
- mul.d $f2, $f2, $f6
- sub.d $f0, $f0, $f4
- j frac_while
- frac_ret: div.d $f12, $f2, $f12
- l.d $f0, 36($sp)
- l.d $f2, 28($sp)
- l.d $f4, 20($sp)
- l.d $f6, 12($sp)
- lw $ra, 4($sp)
- addi $sp, 40
- jr $ra
- sin: addi $sp, -56
- s.d $f2, 52($sp)
- s.d $f4, 44($sp)
- s.d $f6, 36($sp)
- s.d $f8, 28($sp)
- s.d $f10, 20($sp)
- s.d $f16, 12($sp)
- sw $ra 4($sp)
- li $t0, 0 # sign flag, 0 = positive, 1 = negative
- li.d $f4, 1.0 # i counter
- li.d $f6, 2.0 # 2 constant for mult
- li.d $f8, 1.0 # 1 constant for sub
- mov.d $f10, $f2 # move epsilon to $f10
- li.d $f16, 0.0 # sum will be stored in $f16
- mul.d $f10, $f10, $f10 # square epsilon for abs comparison
- sin_loop: mul.d $f2, $f4, $f6 # calculate 2i-1
- sub.d $f2, $f2, $f8
- jal frac
- beqz $t0, sum_plus
- sub.d $f16, $f16, $f12
- li $t0, 0
- j sum_comp
- sum_plus: add.d $f16, $f16, $f12
- li $t0, 1
- sum_comp: mul.d $f12, $f12, $f12 # square y for abs comparison
- add.d $f4, $f4, $f8 # add 1 to i
- c.lt.d $f12, $f10
- bc1f sin_loop
- mov.d $f12, $f16
- l.d $f2, 52($sp)
- l.d $f4, 44($sp)
- l.d $f6, 36($sp)
- l.d $f8, 28($sp)
- l.d $f10, 20($sp)
- l.d $f16, 12($sp)
- lw $ra 4($sp)
- addi $sp, 56
- jr $ra
- main: la $a0, msg_e
- li $v0, 4
- syscall
- li $v0, 7
- syscall
- mov.d $f2, $f0
- la $a0, msg_x
- li $v0, 4
- syscall
- li $v0, 7
- syscall
- l.d $f4, two_pi # 2pi
- li.d $f6, 0.0
- c.lt.d $f0, $f6
- sub.d $f6, $f6, $f4 # $f6 = -2pi
- bc1t sin_minus
- sin_plus: c.lt.d $f0, $f4
- bc1t main_sin
- sub.d $f0, $f0, $f4
- j sin_plus
- sin_minus: c.lt.d $f0, $f6
- bc1f main_sin
- add.d $f0, $f0, $f4 # $f0 = $f0 + 2pi
- j sin_minus
- main_sin: jal sin
- la $a0, res
- li $v0, 4
- syscall
- li $v0, 3
- syscall
- la $a0, n
- li $v0, 4
- syscall
- li $v0, 10
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement