|
I will illustrate what can go wrong if you use registers to store value while you call another function next
We call a square( ) function that computes the square of its input parameter in register r0 and returns the square value in register r0:
// result = square(3);
/* -------------------------------------------------
Call square(3)
------------------------------------------------- */
mov r0, #3 // Pass parameter 3 in r0
bl square // Call square(3)
/* -------------------------------------------------
Save return value (in r0) in variable result
------------------------------------------------- */
movw r1, #:lower16:result
movt r1, #:upper16:result
str r0, [r1]
|
DEMO: /home/cs255001/demo/asm/8-sub/reg-problem.s
Now let's executes: result = square(3) + square(4)
// result = square(3) + square(4);
/* -------------------------------------------------
Call square(3)
------------------------------------------------- */
mov r0, #3 // Pass parameter 3 in r0
bl square // Call square(3)
mov r1, r0 // Save return value in r1
/* -------------------------------------------------
Call square(4)
------------------------------------------------- */
mov r0, #4 // Pass parameter 4 in r0
bl square // Call square(4)
add r0, r0, r1 // Computes square(3) + square(4) ??
/* -------------------------------------------------
Store in result
------------------------------------------------- */
movw r1, #:lower16:result
movt r1, #:upper16:result
str r0, [r1]
|
Fails because the "saved" value was lost !!!
Rule of a function call:
// result = square(3) + square(4); /* ------------------------------------------------- Call square(3) ------------------------------------------------- */ mov r0, #3 // Pass parameter 3 in r0 bl square // Call square(3) mov r1, r0 // Save value in r1 /* ------------------------------------------------- Call square(4) ------------------------------------------------- */ mov r0, #4 // Pass parameter 4 in r0 bl square // Call square(4) Values in all registers (except the return value) are invalid !!! add r0, r0, r1 // Computes square(3) + square(4) ?? /* ------------------------------------------------- Store in result ------------------------------------------------- */ movw r1, #:lower16:result movt r1, #:upper16:result str r0, [r1] |
|