Bird
Raised Fist0
ARM Architectureknowledge~5 mins

Preserving callee-saved registers in ARM Architecture - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What are callee-saved registers in ARM architecture?
Callee-saved registers are registers that a called function must preserve. If the function changes their values, it must restore them before returning to the caller.
Click to reveal answer
beginner
Why must callee-saved registers be preserved?
They must be preserved to ensure the calling function's data in those registers is not lost or corrupted after the called function finishes execution.
Click to reveal answer
intermediate
How does a function preserve callee-saved registers in ARM?
The function saves the callee-saved registers on the stack at the start and restores them from the stack before returning.
Click to reveal answer
intermediate
Which ARM registers are typically callee-saved?
Registers R4 to R11 are usually callee-saved in ARM calling conventions. The stack pointer (SP) is generally preserved by convention but is not considered a callee-saved register in the same sense.
Click to reveal answer
beginner
What happens if a callee does not preserve callee-saved registers properly?
The caller may experience incorrect behavior or crashes because its expected register values are overwritten unexpectedly.
Click to reveal answer
Which registers must a called function preserve in ARM architecture?
AR4 to R11
BR0 to R3
CProgram Counter (PC)
DLink Register (LR)
Where are callee-saved registers typically stored during preservation?
AIn special CPU cache
BOn the stack
CIn global memory
DIn caller's registers
What is the main purpose of preserving callee-saved registers?
ATo keep caller's data intact
BTo speed up function calls
CTo free up registers for the caller
DTo avoid using the stack
If a callee modifies a callee-saved register, what must it do before returning?
ALeave it modified
BNotify the caller
CRestore the original value
DSave it to a global variable
Which of these is NOT a callee-saved register in ARM?
AR5
BR10
CR7
DR2
Explain why preserving callee-saved registers is important in ARM function calls.
Think about what happens if the called function changes registers the caller expects to keep.
You got /3 concepts.
    Describe the typical steps a function takes to preserve callee-saved registers in ARM.
    Consider what happens in the function prologue and epilogue.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main purpose of preserving callee-saved registers in ARM architecture?
      easy
      A. To speed up the execution of the program
      B. To allow the caller to modify registers freely
      C. To keep the values intact across function calls
      D. To reduce the number of registers used

      Solution

      1. Step 1: Understand the role of callee-saved registers

        Callee-saved registers must keep their values unchanged after a function call to avoid breaking the caller's data.
      2. Step 2: Identify the purpose of preserving these registers

        Preserving means saving and restoring their values so the caller sees no change.
      3. Final Answer:

        To keep the values intact across function calls -> Option C
      4. Quick Check:

        Preserving registers = keeping values intact [OK]
      Hint: Remember: callee saves to protect caller's data [OK]
      Common Mistakes:
      • Thinking callee-saved registers speed up execution
      • Confusing callee-saved with caller-saved registers
      • Believing registers can be freely modified without saving
      2. Which ARM assembly instruction is commonly used to save callee-saved registers at the start of a function?
      easy
      A. MOV
      B. ADD
      C. CMP
      D. PUSH

      Solution

      1. Step 1: Identify instruction to save registers

        The PUSH instruction stores registers onto the stack, preserving their values.
      2. Step 2: Confirm PUSH is used at function start

        Functions use PUSH to save callee-saved registers before modifying them.
      3. Final Answer:

        PUSH -> Option D
      4. Quick Check:

        Save registers = PUSH [OK]
      Hint: PUSH saves registers on stack at function start [OK]
      Common Mistakes:
      • Using MOV which copies but doesn't save to stack
      • Using ADD which changes values, not saves
      • Using CMP which compares values, not saves
      3. Consider this ARM function snippet:
      func:
        PUSH {r4, r5}
        MOV r4, #10
        MOV r5, #20
        POP {r4, r5}
        BX lr
      What will be the value of registers r4 and r5 after returning to the caller?
      medium
      A. r4 and r5 unchanged from caller
      B. r4 and r5 contain random values
      C. r4 = 0, r5 = 0
      D. r4 = 10, r5 = 20

      Solution

      1. Step 1: Analyze PUSH and POP effect

        PUSH saves original r4 and r5 values on stack; POP restores them before return.
      2. Step 2: Understand MOV instructions inside function

        Inside function, r4 and r5 are changed, but POP restores original values before returning.
      3. Final Answer:

        r4 and r5 unchanged from caller -> Option A
      4. Quick Check:

        Saved and restored registers = unchanged after call [OK]
      Hint: PUSH then POP restores original register values [OK]
      Common Mistakes:
      • Assuming MOV changes persist after POP
      • Ignoring that POP restores saved registers
      • Thinking registers reset to zero automatically
      4. A function modifies callee-saved registers but forgets to restore them before returning. What problem can this cause?
      medium
      A. The program may crash or behave unpredictably
      B. The function will run faster
      C. The caller's registers remain unchanged
      D. The stack pointer will not be affected

      Solution

      1. Step 1: Understand callee-saved register role

        These registers must be restored to keep caller's data intact.
      2. Step 2: Consequence of not restoring

        If not restored, caller sees wrong values, causing crashes or wrong behavior.
      3. Final Answer:

        The program may crash or behave unpredictably -> Option A
      4. Quick Check:

        Not restoring callee-saved = crashes/unpredictable [OK]
      Hint: Not restoring callee-saved causes crashes [OK]
      Common Mistakes:
      • Thinking it improves speed
      • Believing caller's registers stay safe without restore
      • Ignoring stack pointer effects
      5. You have a function that uses registers r4, r5, and r6 (all callee-saved). Which sequence correctly preserves and restores these registers?
      hard
      A. MOV r4, #0 MOV r5, #0 MOV r6, #0 ...function body... BX lr
      B. PUSH {r4, r5, r6} ...function body... POP {r4, r5, r6}
      C. PUSH {r4} PUSH {r5} PUSH {r6} ...function body... POP {r4} POP {r5} POP {r6}
      D. POP {r4, r5, r6} ...function body... PUSH {r4, r5, r6}

      Solution

      1. Step 1: Identify correct saving method

        Registers must be pushed together at function start to save their original values.
      2. Step 2: Identify correct restoring method

        Registers must be popped in the same order before returning to restore original values.
      3. Step 3: Check options for correct sequence

        PUSH {r4, r5, r6} ...function body... POP {r4, r5, r6} pushes all three registers at once and pops them before return, which is correct.
      4. Final Answer:

        PUSH {r4, r5, r6} ...function body... POP {r4, r5, r6} -> Option B
      5. Quick Check:

        Push all then pop all = correct preservation [OK]
      Hint: Push all callee-saved at start, pop all before return [OK]
      Common Mistakes:
      • Pushing and popping registers separately in wrong order
      • Using POP before PUSH
      • Overwriting registers without saving
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard