Cortex-M7——函数及中断异常调用过程
小狼@http://blog.youkuaiyun.com/xiaolangyangyang
一、函数调用过程
ARMv8架构下,函数参数是通过R0~R4寄存器传递的,如果参数超过4个,就要借助于栈进行参数传递。
int func(int a1, int a2, int a3, int a4, int a5, int a6)
{
return a1 + a2 + a3 + a4 + a5 + a6;
}
void main(void)
{
func(1, 2, 3, 4, 5, 6);
}
main()函数的汇编如下:
movs r2, #0x6 ; 参数赋值,用于压栈
movs r3, #0x5 ; 参数赋值,用于压栈
sub sp, sp, #0x0C ; 预留栈空间给参数
str r2, [sp, #0x4] ; 参数保存到栈
str r3, [sp] ; 参数保存到栈
movs r2, #0x3 ; 参数赋值给r3
movs r3, #0x4 ; 参数赋值给r2
movs r1, #0x2 ; 参数赋值给r1
movs r0, #0x1 ; 参数赋值给r0
bl 0x80A278 ; 调用func
func()函数的汇编如下:
push {r4-r5, lr} ; 函数用到r4/r5,将原值压栈,lr压栈
ldr r4, [sp, #0x8] ; 将栈保存的参数赋

本文详细介绍了ARMv8架构下函数调用的过程,包括参数传递、栈的使用以及函数返回时的操作。同时,也阐述了中断异常调用时的硬件自动压栈机制,包括压栈顺序、中断返回后的处理。通过实例和栈结构图,清晰地展示了函数调用和中断异常处理的关键步骤。
最低0.47元/天 解锁文章
442

被折叠的 条评论
为什么被折叠?



