Msg/ClobberedSP: Difference between revisions
From CPUlator Wiki
< Msg
< Msg
No edit summary |
No edit summary |
||
Line 4: | Line 4: | ||
==== ARMv7 ==== | ==== ARMv7 ==== | ||
<syntaxhighlight lang="Asm" line highlight=" | <syntaxhighlight lang="Asm" line highlight="11"> | ||
.global _start | .global _start | ||
_start: | _start: | ||
Line 18: | Line 18: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Nios II ==== | ==== Nios II ==== | ||
<syntaxhighlight lang="Asm" line highlight=" | <syntaxhighlight lang="Asm" line highlight="10"> | ||
.global _start | .global _start | ||
_start: | _start: |
Revision as of 01:02, 10 March 2019
A function should always ensure that the stack pointer is the same at the entry and exit of the function. This message tells you that this didn't happen: the stack pointer was different at the function return than when the function was first called.
Examples
ARMv7
.global _start
_start:
mov sp, #0x1000 // Initialize SP to something sane
bl MyFunction
nop
nop
# ...
MyFunction:
push {r4} // Change SP
bx lr // SP is different at return
Nios II
.global _start
_start:
movi sp, 0x1000 # Initialize SP
call Function
nop
nop
Function:
subi sp, sp, 4 # Modify SP
ret # SP is different at return
Debugging
- Fundamentally, this message is complaining that the stack pointer differs between the start of the function and at the function return. Use breakpoints and make a note of the value of the stack pointer at both the function entry and return. Are they the same?
- The most common way to use the stack pointer is to modify it while pushing and popping values on the stack. When pushes and pops are mismatched, there is a net change in the stack pointer in the function.
Implementation
The simulator identifies idiomatic call and return instructions executed at runtime. It records the values of registers when executing call instructions, and verifies that they haven't changed when executing the matching function return. This warning is generated at the return instruction.
Disabling this message
This debugging check can be disabled in the Debugging Checks section of the Settings box: Function clobbered ra or sp.