
Module 1 root square
rootsquare.c@0:529f900ad93b, 2019-09-19 (annotated)
- 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?
User | Revision | Line number | New 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*************************************/ |