ARM Loops
While loops
while (a < 0){ a++; }
loop: CMP r0, #0 BGE end ADD r0, r0, #1 @ Body of loop B loop end:
@ Equivalent to above loop: CMP r0, #0 ADDLT r0, r0, #1 BLT loop
Do while
do { a++; } while (a < 0);
@ loop part different to while loop loop: ADD r0, r0, #1 @ body of 'do' CMP r0, #0 BLT loop
For loops
for (i = 0; i < 10; i++){ a++; b--; }
MOV r0, #0 loop: CMP r0, #10 BGE end ADD r1, r1, #1 SUB r2, r2, #1 B loop end:
@ Equivalent to above MOV r0, #0 loop: CMP r0, #10 ADDLT r1, r1, #1 SUBLT r2 ,r2, #1 ADDLT r0, r0, #1 BLT loop
C functions
Caller and callee functions:
main() { // main in this case is a caller int a = 10, b = 20; int c = sum(a, b); } int sum(int x, y){ // sum is a callee return x + y; }
Steps in function call
- Pass parameters (using registers)
- Call functions (sum)
- Compute return value, put it in the right register
- Transfer control back to caller (return)
1 and 2 are in main();
Making the function call
- Simple branch instruction
BL sum @ function call BX @ return
... B sum return ... ... sum: ADD r0, r0, r1 B return_loc ...
Problems:
- Cannot call a function twice
- Always go to return_loc
Reason:
- sum() might be called by many functions, so we cannot return to a fixed place.
- The calling proc to sum() must be able to say “return back here” somehow.
- BX instruction returns to the location specified in lr.
- BL instruction stores the location of next line so that branch could return to where it was called.
lr (link register): register reserved to store the return address
... BL sum ... ... sum: ADD r0, r0, r1 BX lr ; MOV pc,lr i.e., return ...
Passing arguments
main() { int a = 10, b = 20, c; c = sum(a, b); c++; }
main: MOV r0, #20 MOV r1, #20 BL sum sum: ADD r0, r0, r1 @ return value in r0 BX lr
Register conventions
A set of generally accepted rules as to which registers are guaranteed to be unchanged after a procedure call and which may be changed.
r0 – r3
Arguments and return values, otherwise corruptible.
r4 – r11
Callee has to make sure that the value in r4-r11 are unchanged by it.
r12 scratch register
Push and pop
Push registers onto, and pop registers off a full descending stack (usually within function call).
push {r4-r11} ... pop {r4-r11}Published on October 30, 2015