@martinzhang ,
I think you have to explain what you are doing in a bit more detail. When I read the responses from @bobpaddock , @jingpan & @mjbcswitzerland they're all giving correct answers to different scenarios, the problem is it's not clear which one is correct.
From what you've written, it sounds like to me that you've changed the Stack Pointer ("SP") and, unless you restore it before you attempt to return to the ISR, you're Program Counter ("PC") is going to be loaded with ...something... and, from your perspective, the system is going to crash.
Without seeing your code I'm going to say that, as a rule, it's very bad form altering the stack in any way anywhere in your code (this includes the Stack Pointer) - let the system code/RTOS set up and manage that for you. Just create your interrupt handler using the standard C format and don't touch the Stack Pointer.
Could you share your code so we can more accurately diagnose the issue and give you suggestions on how to resolve it?
myke