public class Prog { /* ---------------------------------------------- sumSquares(a,b): returns (a*a + b*b) ---------------------------------------------- */ public static int sumSquares( int a, int b ) { return (a*a + b*b); } public static void main( ) { int x, y, z; x = 4; y = 7; z = sumSquares(x, y); } } |
main: sumSquares: // Pass x in r0 // Compute x*x+y*y // where x = r0 and y = r1 // Pass y in r1 // Return result in r0 bl sumSquares mov pc, lr // Store return value // in z Stop: |
main: sumSquares: movw r0, #:lower16:x // Compute x*x+y*y movt r0, #:upper16:x // where x = r0 and y = r1 ldr r0, [r0] // Pass y in r1 // Return result in r0 bl sumSquares mov pc, lr // Store return value // in z Stop: |
main: sumSquares: movw r0, #:lower16:x // Compute x*x+y*y movt r0, #:upper16:x // where x = r0 and y = r1 ldr r0, [r0] movw r1, #:lower16:y movt r1, #:lower16:y ldr r1, [r1] // Return result in r0 bl sumSquares mov pc, lr // Store return value // in z Stop: |
main: sumSquares: movw r0, #:lower16:x // Compute x*x+y*y movt r0, #:upper16:x // where x = r0 and y = r1 ldr r0, [r0] movw r1, #:lower16:y movt r1, #:lower16:y ldr r1, [r1] // Return result in r0 bl sumSquares mov pc, lr movw r1, #:lower16:z movt r1, #:upper16:z str r0, [r1] Stop: |
main: sumSquares: movw r0, #:lower16:x // Compute x*x+y*y movt r0, #:upper16:x // where x = r0 and y = r1 ldr r0, [r0] movw r1, #:lower16:y movt r1, #:lower16:y ldr r1, [r1] // Return result in r0 bl sumSquares mov pc, lr movw r1, #:lower16:z movt r1, #:upper16:z str r0, [r1] Stop: |
main: sumSquares: movw r0, #:lower16:x // Compute x*x+y*y movt r0, #:upper16:x // where x = r0 and y = r1 ldr r0, [r0] mul r2, r0, r0 // r2 = x*x mul r3, r1, r1 // r3 = y*y movw r1, #:lower16:y add r2, r2, r3 // r2 = x*x+y*y movt r1, #:lower16:y ldr r1, [r1] // Return result in r0 bl sumSquares mov pc, lr movw r1, #:lower16:z movt r1, #:upper16:z str r0, [r1] Stop: |
main: sumSquares: movw r0, #:lower16:x // Compute x*x+y*y movt r0, #:upper16:x // where x = r0 and y = r1 ldr r0, [r0] mul r2, r0, r0 // r2 = x*x mul r3, r1, r1 // r3 = y*y movw r1, #:lower16:y add r2, r2, r3 // r2 = x*x+y*y movt r1, #:lower16:y ldr r1, [r1] mov r0, r2 bl sumSquares mov pc, lr movw r1, #:lower16:z movt r1, #:upper16:z str r0, [r1] Stop: |
DEMO: /home/cs255001/demo/asm/8-sub/reg-param1.s