|
|
|
|
|
|
We can now code the main( ) function:
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: |
Pass the 1st parameter in register r0:
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: |
Pass the 2nd parameter in register r1:
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: |
When sumSquares( ) returns, assign the return value (in the designated register r0) to variable z:
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: |
We can code the sumSquares( ) function using the designated registers for parameters and return values:
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: |
Compute x*x:
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 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: |
Compute y*y:
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 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: |
Compute x*x + y*y:
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: |
Return the result in the designated register r0:
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