; CPE 221 Assembly Example ; 3/6/18 ; This program multiplies two numbers by repeated addition. ; First, take absolute values of both numbers, do multiplication, ; then adjust result as necessary. Taking the absolute value is done ; as a subroutine and the multiplication is a subroutine to the high ; level that loads the numbers in and stores the result. ; int mpy_ne(int, int) ; int abs(int) ; int main() ; { ; int first = 8; ; int second = -9; ; int result; ; result = mpy_ne(first, second); ; } ; int mpy_ne (int num1; int num2) ; { ; int a, b, mult; ; a = abs(num1); ; b = abs(num2); ; mult = 0; ; for (i = 0; i < a; i++) ; mult = mult + b; ; if (num1 < 0) ; mult = -mult; ; if (num2 < 0) ; mult = -mult; ; return mult; ; } ; int abs(int x) ; { ; if (x < 0) ; x = -x; ; return x; ; } AREA MULTIPLY_BY_ADDING_SUBFRAME, CODE, READONLY ENTRY 0 LDR r1, num1 ; Put num1 in r1. 4 LDR r2, num2 ; Put num2 in r2. 8 LDR r3, num3 12 LDR r4, num4 16 MOV r11, sp ;Slide 7 20 SUB sp, sp, #12 ;Slide 8 24 STR r1, [r11, #-4] ;Slide 9 28 STR r2, [r11, #-8] ;Slide 10 32 BL mpy_ne 36 LDR r5, [r11, #-12] 40 STR r5, case1 44 MOV sp, r11 ;Slide 38 48 final B final 52 mpy_ne PUSH {lr} ;Slide 11 56 PUSH {r0, r1, r3, r4, r5} ;Slide 12 60 LDR r0, [r11, #-8] 64 LDR r1, [r11, #-4] 68 MOV r3, #0 ; Set r3 to 0, it will hold the result. 72 TEQ r0, #0 76 BEQ done ; If num1 = 0, we are done, result = 0. 80 TEQ r1, #0 84 BEQ done ; If num2 = 0, we are done, result = 0. 88 PUSH {r11} ;Slide 13 92 MOV r11, sp ;Slide 14 96 SUB sp, sp, #8 ;Slide 15 100 STR r1, [r11, #-4] ;Slide 16 104 BL abs 108 LDR r4, [r11, #-8]; Copy num1 to r4, it will be used for loop control. 112 MOV sp, r11 ;Slide 22 116 POP {r11} ;Slide 23 120 PUSH {r11} ;Slide 24 124 MOV r11, sp ;Slide 25 128 SUB sp, sp, #8 ;Slide 26 132 STR r0, [r11, #-4] ;Slide 27 136 BL abs 140 LDR r5, [r11, #-8] 144 MOV sp, r11 ;Slide 33 148 POP {r11} ;Slide 34 152 adding ADD r3, r3, r5 ; Add num2. 156 SUBS r4, r4, #1 ; Decrement r4. 160 BEQ adjust ; If r4 = 0, done adding, go to adjust. 164 B adding ; Need to add again. 168 adjust MOVS r0, r0 ; Done adding, now adjust sign of result. 172 RSBMI r3, r3, #0 ; If num2 negative, negate result. 176 MOVS r1, r1 180 RSBMI r3, r3, #0 ; If num1 negative, negate result. 184 done STR r3, [r11, #-12] ;Slide 35 188 POP {r0, r1, r3, r4, r5} ;Slide 36 192 POP {pc} ;Slide 37 196 abs PUSH {lr} ;Slides 17 and 28 200 PUSH {r0} ;Slides 18 and 29 204 LDR r0, [r11, #-4] 208 CMP r0, #0 212 BPL d_abs 216 RSB r0, r0, #0 220 d_abs STR r0, [r11, #-8] ;Slides 19 and 30 224 POP {r0} ;Slides 20 and 31 228 POP {pc} ;Slides 21 and 32 232 num1 DCD 8 236 num2 DCD 9 240 num3 DCD -8 244 num4 DCD -9 248 case1 SPACE 4 252 case2 SPACE 4 256 case3 SPACE 4 260 case4 SPACE 4 END