因此,在图4-1中,如果处理器是在IRQ模式,我们可以看见R0,R1...R12(与在用户模式看到的相同的寄存器),加上SP_IRQ和LR_IRQ(仅在IRQ模式中可以访问的寄存器)和R15(程序计数器,PC)。我们通常不必指定模式中的寄存器名。如果我们在一行代码中引用R13,处理器会访问当前模式对应的SP寄存器。
在用户模式,程序状态寄存器(CPSR)的受限形式被称为应用程序状态寄存器(APSR)。R15是程序计数器,保持当前程序地址(实际上,在ARM状态,它总是指向提前8个字节当前指令的位置;在Thumb状态,它总是指向提前4个字节当前指令的位置)。
我们可以写值到PC以修改程序流。LR是链接寄存器,存放函数或异常的返回地址。R13,通常被用作堆栈指针。R0-R12是通用寄存器。一些16位Thumb指令可访问的寄存器受限---可访问的子集被称为低寄存器(low registers),由R0-R7组成。图4-2显示了对通用数据处理指令可见的寄存器子集。
R0-R14的复位值不可预测。堆栈指针(SP),在使用堆栈之前,必须被启动代码初始化。AAPCS或AEABI(见第17章 应用二进制接口)指定了软件应该如何使用通用寄存器,为了不同工具链或编程语言之间的互操作。
linux的栈回溯
https://blog.csdn.net/jasonchen_gbd/article/details/45585133?spm=a2c6h.12873639.article-detail.7.6b1079a3AoT7hN
linux内核中打印栈回溯信息 - dump_stack()函数分析
r0-r3 用作函数传参,例如函数A调用函数B,如果A需要向B传递参数,则将参数放到寄存器r0-r3中,如果参数个数大于4,则需要借用函数的栈空间。
r4-r11 变量寄存器,在函数中可以用来保存临时变量。
r9(SB) 静态基址寄存器。
r10(SL) 栈界限寄存器。
r11(FP) 帧指针寄存器,通常用来访问函数栈,帧指针指向函数栈中的某个位置。
r12(IP) 内部过程调用暂存寄存器。
r13(SP) 栈指针寄存器,用来指向函数栈的栈顶。
r14(LR) 链接寄存器,通常用来保存函数的返回地址。
r15(PC) 程序计数器,指向代码段中下一条将要执行的指令,不过由于流水线的作用,PC会指向将要执行的指令的下一条指令。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jasonchen_gbd/article/details/45585133
ARM栈帧结构
依据AAPCS (ARM Archtecture Procedure Call Standard)规范,当调用子函数时,子函数一开始的代码总是会执行压栈操作来保留父函数的相关信息,压栈步骤示例如下所示:
mov ip, sp
push {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #16
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jackailson/article/details/133823352