Advertisement
Guest User

Untitled

a guest
Jun 11th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .data
  2. msg_x:      .asciiz "Please enter x: "
  3. msg_e:      .asciiz "Please enter epsilon: "
  4. res:        .asciiz "sin x = "
  5. n:      .asciiz "\n"
  6. two_pi:     .double 6.283185
  7. .text
  8. fac:        addi    $sp,    -20
  9.         s.d $f0,    16($sp)
  10.         s.d $f2,    8($sp)
  11.  
  12.         li.d    $f2,    0.0
  13.         mov.d   $f12,   $f2
  14.         c.lt.d  $f0,    $f2
  15.         bc1t    fac_ret
  16.         li.d    $f2,    1.0     # compare register
  17.         li.d    $f12,   1.0
  18.  
  19. fac_while:  c.lt.d  $f2,    $f0
  20.         bc1f    fac_ret
  21.         mul.d   $f12,   $f12,   $f0
  22.         sub.d   $f0,    $f0,    $f2
  23.         j   fac_while
  24.  
  25. fac_ret:    l.d $f0,    16($sp)
  26.         l.d $f2,    8($sp)
  27.         addi    $sp,    20
  28.         jr  $ra
  29.  
  30. # fac will accept two double arguments x, y and will calculate (x^y)/y! in $f12
  31. frac:       addi    $sp,    -40
  32.         s.d $f0,    36($sp)     # f0 will get x but hold y
  33.         s.d $f2,    28($sp)     # f2 fill get y
  34.         s.d $f4,    20($sp)
  35.         s.d $f6,    12($sp)     # $f6 will hold x
  36.         sw  $ra,    4($sp)
  37.        
  38.         mov.d   $f6,    $f0
  39.         mov.d   $f4,    $f0
  40.         mov.d   $f0,    $f2
  41.         mov.d   $f2,    $f4
  42.         jal fac
  43.  
  44. frac_while: li.d    $f4,    1.0
  45.         c.lt.d  $f4,    $f0
  46.         bc1f    frac_ret
  47.         mul.d   $f2,    $f2,    $f6
  48.         sub.d   $f0,    $f0,    $f4
  49.         j   frac_while
  50.  
  51. frac_ret:   div.d   $f12,   $f2,    $f12
  52.         l.d $f0,    36($sp)
  53.         l.d $f2,    28($sp)
  54.         l.d $f4,    20($sp)
  55.         l.d $f6,    12($sp)
  56.         lw  $ra,    4($sp)
  57.         addi    $sp,    40
  58.         jr  $ra
  59.  
  60. sin:        addi    $sp,    -56
  61.         s.d $f2,    52($sp)
  62.         s.d $f4,    44($sp)
  63.         s.d $f6,    36($sp)
  64.         s.d $f8,    28($sp)
  65.         s.d $f10,   20($sp)
  66.         s.d $f16,   12($sp)
  67.         sw  $ra 4($sp)
  68.  
  69.         li  $t0,    0       # sign flag, 0 = positive, 1 = negative
  70.         li.d    $f4,    1.0     # i counter
  71.         li.d    $f6,    2.0     # 2 constant for mult
  72.         li.d    $f8,    1.0     # 1 constant for sub
  73.         mov.d   $f10,   $f2     # move epsilon to $f10
  74.         li.d    $f16,   0.0     # sum will be stored in $f16   
  75.  
  76.         mul.d   $f10,   $f10,   $f10    # square epsilon for abs comparison
  77.  
  78. sin_loop:   mul.d   $f2,    $f4,    $f6 # calculate 2i-1
  79.         sub.d   $f2,    $f2,    $f8
  80.         jal frac
  81.        
  82.         beqz    $t0,    sum_plus
  83.         sub.d   $f16,   $f16,   $f12
  84.         li  $t0,    0
  85.         j   sum_comp
  86.  
  87. sum_plus:   add.d   $f16,   $f16,   $f12
  88.         li  $t0,    1
  89.  
  90. sum_comp:   mul.d   $f12,   $f12,   $f12    # square y for abs comparison
  91.         add.d   $f4,    $f4,    $f8 # add 1 to i
  92.         c.lt.d  $f12,   $f10
  93.         bc1f    sin_loop
  94.                
  95.         mov.d   $f12,   $f16
  96.  
  97.         l.d $f2,    52($sp)
  98.         l.d $f4,    44($sp)
  99.         l.d $f6,    36($sp)
  100.         l.d $f8,    28($sp)
  101.         l.d $f10,   20($sp)
  102.         l.d $f16,   12($sp)
  103.         lw  $ra 4($sp)
  104.         addi    $sp,    56
  105.         jr  $ra
  106.  
  107. main:       la  $a0,    msg_e
  108.         li  $v0,    4
  109.         syscall
  110.        
  111.         li  $v0,    7
  112.         syscall
  113.  
  114.         mov.d   $f2,    $f0
  115.        
  116.         la  $a0,    msg_x
  117.         li  $v0,    4
  118.         syscall
  119.  
  120.         li  $v0,    7
  121.         syscall
  122.  
  123.         l.d $f4,    two_pi      # 2pi
  124.         li.d    $f6,    0.0
  125.  
  126.         c.lt.d  $f0,    $f6
  127.         sub.d   $f6,    $f6,    $f4 # $f6 = -2pi
  128.         bc1t    sin_minus
  129. sin_plus:   c.lt.d  $f0,    $f4
  130.         bc1t    main_sin
  131.         sub.d   $f0,    $f0,    $f4
  132.         j   sin_plus
  133.  
  134. sin_minus:  c.lt.d  $f0,    $f6
  135.         bc1f    main_sin
  136.         add.d   $f0,    $f0,    $f4 # $f0 = $f0 + 2pi
  137.         j   sin_minus
  138.  
  139. main_sin:   jal sin
  140.  
  141.         la  $a0,    res
  142.         li  $v0,    4
  143.         syscall
  144.    
  145.         li  $v0,    3
  146.         syscall
  147.  
  148.         la  $a0,    n
  149.         li  $v0,    4
  150.         syscall
  151.  
  152.         li  $v0,    10
  153.         syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement