Module 1 root square

Dependencies:   mbed MMA8451Q

Committer:
nmaududi
Date:
Thu Sep 19 06:16:00 2019 +0000
Revision:
0:529f900ad93b
Revision 1 of root square for Module 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nmaududi 0:529f900ad93b 1 /************************************************************************//**
nmaududi 0:529f900ad93b 2 * \file main.c
nmaududi 0:529f900ad93b 3 * \brief LAB EXERCISE 5.2 - SQUARE ROOT APPROXIMATION
nmaududi 0:529f900ad93b 4 *
nmaududi 0:529f900ad93b 5 * Write an assembly code subroutine to approximate the square root of an
nmaududi 0:529f900ad93b 6 * argument using the bisection method. All math is done with integers, so the
nmaududi 0:529f900ad93b 7 * resulting square root will also be an integer
nmaududi 0:529f900ad93b 8 ******************************************************************************
nmaududi 0:529f900ad93b 9 * GOOD LUCK!
nmaududi 0:529f900ad93b 10 ****************************************************************************/
nmaududi 0:529f900ad93b 11
nmaududi 0:529f900ad93b 12 #include "stdint.h"
nmaududi 0:529f900ad93b 13
nmaududi 0:529f900ad93b 14
nmaududi 0:529f900ad93b 15 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
nmaududi 0:529f900ad93b 16 #include "string.h"
nmaududi 0:529f900ad93b 17 /** @endcond */
nmaududi 0:529f900ad93b 18
nmaududi 0:529f900ad93b 19 /**
nmaududi 0:529f900ad93b 20 * @brief 5863 Write a brief description of the function here
nmaududi 0:529f900ad93b 21 *
nmaududi 0:529f900ad93b 22 * Detailed description of the function after one line gap
nmaududi 0:529f900ad93b 23 *
nmaududi 0:529f900ad93b 24 * @note You can also add a note this way
nmaududi 0:529f900ad93b 25 *
nmaududi 0:529f900ad93b 26 * @param[in]
nmaududi 0:529f900ad93b 27 * You can also start writing on a new line.
nmaududi 0:529f900ad93b 28 * And continue on the next line. This is how you describe an input parameter
nmaududi 0:529f900ad93b 29 *
nmaududi 0:529f900ad93b 30 * @return
nmaududi 0:529f900ad93b 31 * This is how you describe the return value
nmaududi 0:529f900ad93b 32 *
nmaududi 0:529f900ad93b 33 */
nmaududi 0:529f900ad93b 34 __asm int my_sqrt(int x){
nmaududi 0:529f900ad93b 35
nmaududi 0:529f900ad93b 36 MOVS r1, #0; r1 will be the register to store a, initialized to 0
nmaududi 0:529f900ad93b 37 MOVS r2,#200; r2 is for variable b, store the largest squaure root round[sqrt(2^31-1)] (46341)
nmaududi 0:529f900ad93b 38 MOVS r3,#1; r3 is for variable c, it has been define and intialized
nmaududi 0:529f900ad93b 39 NEGS r3,r3;
nmaududi 0:529f900ad93b 40 MOVS r4,#0; r4 is for variable done
nmaududi 0:529f900ad93b 41
nmaududi 0:529f900ad93b 42 loop_while
nmaududi 0:529f900ad93b 43
nmaududi 0:529f900ad93b 44 MOVS r5,r3; r5 is allocated for c old within the code
nmaududi 0:529f900ad93b 45 ADDS r3, r1, r2; stores into c = a+b
nmaududi 0:529f900ad93b 46 LSRS r3,r3,#1; multiply c by 0.5 to get c= (a+b)/2, completed a shift to complete division
nmaududi 0:529f900ad93b 47 MOVS r6,r3; r6 is allocated for c within the code
nmaududi 0:529f900ad93b 48 MULS r6,r6,r6; r6 now contains x*x as implemented int code
nmaududi 0:529f900ad93b 49
nmaududi 0:529f900ad93b 50 CMP r6,r0; Compare c*c and x, start of the if loop
nmaududi 0:529f900ad93b 51 BEQ sqrt_loop_done
nmaududi 0:529f900ad93b 52 BLT sqrt_elseif
nmaududi 0:529f900ad93b 53
nmaududi 0:529f900ad93b 54 MOVS r2,r3; b is loaded with the value of c, b <--c
nmaududi 0:529f900ad93b 55
nmaududi 0:529f900ad93b 56 B end_of_sqrtloop
nmaududi 0:529f900ad93b 57 sqrt_elseif
nmaududi 0:529f900ad93b 58 MOVS r1,r3; a is loaded with the value of c, a <--c
nmaududi 0:529f900ad93b 59 B end_of_sqrtloop
nmaududi 0:529f900ad93b 60
nmaududi 0:529f900ad93b 61 sqrt_loop_done
nmaududi 0:529f900ad93b 62
nmaududi 0:529f900ad93b 63 MOVS r4,#1; store 1 into the variable done
nmaududi 0:529f900ad93b 64
nmaududi 0:529f900ad93b 65 end_of_sqrtloop
nmaududi 0:529f900ad93b 66 MVNS r6,r4; r6 ==!done, was c*c above
nmaududi 0:529f900ad93b 67 CMP r5, r3; compare cold and c
nmaududi 0:529f900ad93b 68 BNE skip
nmaududi 0:529f900ad93b 69 MOVS r7,#0; set r7 equal to 0 if cold and c are equal
nmaududi 0:529f900ad93b 70 B skip_over
nmaududi 0:529f900ad93b 71 skip
nmaududi 0:529f900ad93b 72 MOVS r7,#1;
nmaududi 0:529f900ad93b 73 NEGS r7,r7;
nmaududi 0:529f900ad93b 74 skip_over
nmaududi 0:529f900ad93b 75 CMP r6,r7;
nmaududi 0:529f900ad93b 76 BEQ loop_while
nmaududi 0:529f900ad93b 77
nmaududi 0:529f900ad93b 78 BLX r3 ; Else return from subroutine with link and returning the variable c
nmaududi 0:529f900ad93b 79 //CMP
nmaududi 0:529f900ad93b 80
nmaududi 0:529f900ad93b 81 //Write your code here
nmaududi 0:529f900ad93b 82
nmaududi 0:529f900ad93b 83 }
nmaududi 0:529f900ad93b 84
nmaududi 0:529f900ad93b 85 /*----------------------------------------------------------------------------
nmaududi 0:529f900ad93b 86 MAIN function
nmaududi 0:529f900ad93b 87 *----------------------------------------------------------------------------*/
nmaududi 0:529f900ad93b 88 /**
nmaududi 0:529f900ad93b 89 * @brief Main function
nmaududi 0:529f900ad93b 90 *
nmaududi 0:529f900ad93b 91 * Detailed description of the main
nmaududi 0:529f900ad93b 92 */
nmaududi 0:529f900ad93b 93 int main(void){
nmaududi 0:529f900ad93b 94 volatile int r1,r2,r3, j=0;
nmaududi 0:529f900ad93b 95 int i;
nmaududi 0:529f900ad93b 96 r1 = my_sqrt(25); // should be 0
nmaududi 0:529f900ad93b 97 r2 = my_sqrt(25); // should be 5
nmaududi 0:529f900ad93b 98 r3 = my_sqrt(133); // should be 11
nmaududi 0:529f900ad93b 99 for (i=0; i<10000; i++){
nmaududi 0:529f900ad93b 100 r = my_sqrt(i);
nmaududi 0:529f900ad93b 101 j+=r;
nmaududi 0:529f900ad93b 102 }
nmaududi 0:529f900ad93b 103 while(1)
nmaududi 0:529f900ad93b 104 ;
nmaududi 0:529f900ad93b 105 }
nmaududi 0:529f900ad93b 106
nmaududi 0:529f900ad93b 107 // *******************************ARM University Program Copyright © ARM Ltd 2014*************************************/