首页 > 其他分享 >ARMv7 寄存器 工作模式 和指令集 和 堆栈回溯

ARMv7 寄存器 工作模式 和指令集 和 堆栈回溯

时间:2024-06-18 16:13:42浏览次数:12  
标签:函数 ARMv7 回溯 指令 指令集 寄存器 堆栈 链接

因此,在图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

 

 

unwind 形式的栈回溯

标签:函数,ARMv7,回溯,指令,指令集,寄存器,堆栈,链接
From: https://www.cnblogs.com/ycjstudy/p/18247160

相关文章

  • CPU指令集——bayer抽取r、g、b三通道
    需求:在高帧率场景下,一般拿到的是bayer格式数据。图像处理时,一般会先插值成rgb,再拆分为单通道。如果可以直接bayer中抽出r、g、b,那效率将大大提升。注意:抽取后r、g、b尺寸是原来的一半,没有做插值(插值只会让数据量变大,并没有引入有效信息)效果:CPU指令集优化后,速度是传统算法的8倍左......
  • CPU指令集——VS打断点时注意事项
    在看内存中数据时,VS2015打断点碰到了数据读入不正确的问题uint8_tuint8_array[32]={00,07,04,04,02,03,06,02,02,05,04,02,06,05,04,03,00,07,04,05,00,02,00,03,04,05,02,02,04,03,04,06};__m256iresult=_mm256_loadu_si256((__m256i*......
  • 堆栈图
    存储参数1.push先执行push2,在push1。栈从上往下(1,2是参数)call—〉返回一个地址,并将下一个指令地址存入栈中401171—〉函数执行完的返回地址(简称返回地址)保留栈底2.pushebp将ebp里的值放入了栈里面提升栈顶3.movebp,esp将esp里的值放入ebp中4.Subesp,40esp-四零,(四......
  • CPU指令集——获取数组的所有奇数位、所有偶数位
    为抽取bayer格式图像的r\g\b做准备#include<iostream>#include<intrin.h>intmain(){uint8_tuint8_array[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//内存顺序012__m128ia=_mm_load_si128((__m128i*)uint8_array);......
  • CPU指令集学习——gather
    每次偏移int索引*scale个字节,每次取4字节。注意int索引是倒序的,如__m128i vindex有4个int索引,先取最后一个索引。举例:__m128i _mm_i32gather_epi32 (intconst* base_addr, __m128i vindex, constint scale)intint_array[8]={100,200,300,400,500,600,700,......
  • Objection 常用指令集
    ===========附加包名启动============objection-gcom.tigerbrokers.stockexplore===========启动某个activity===========androidintentlaunch_activitycom.xxx===========所有已经加载的类===========androidhookinglistactivities===========查看所有指定类中所有方法......
  • 再探堆栈欺骗之动态欺骗
    本文首发先知社区:https://xz.aliyun.com/t/14542在上篇文章https://xz.aliyun.com/t/14487中,我们讨论了静态堆栈欺骗,那是关于hooksleep,在睡眠期间改变堆栈行为的欺骗,这篇文章我们来一起讨论一下主动欺骗,允许任意函数发起时的堆栈欺骗。相关的基础知识在上篇文章已经介绍,并......
  • 三探堆栈欺骗之Custom Call Stacks
    本文首发阿里云先知社区:https://xz.aliyun.com/t/14592背景知识在之前的文章中,我们介绍了静态欺骗和动态欺骗堆栈,今天我们来一起学习一下另一种技术,它被它的作者称为CustomCallStacks,即自定义堆栈调用。关于堆栈欺骗的背景我们就不再说了,这里我们补充一下回调函数和windows......
  • Simd库——图像处理领域的CPU指令集加速库
    Simd库是一个免费的开源图像处理和机器学习库,专为C和C++程序员设计。它为图像处理提供了许多有用的高性能算法,例如:像素格式转换,图像缩放和过滤,从图像中提取统计信息,运动检测,对象检测(HAAR和LBP分类器级联)和分类,神经网络。官网 SimdLibrary(ermig1979.github.io),可以下载编译,函......
  • CPU指令集SSE、AVX等
    C++使用CPU指令集,可以引入头文件 #include<intrin.h>包含了所有指令集。部分具体的指令集头文件如下:<xmmintrin.h>//包含SSE库<emmintrin.h>//包含SSE2库<pmmintrin.h>//包含SSE3库CPU指令集发展从MMX,到SSE、SSE2、SSE3、SSE4、AVX/AVX2、AVX512,推荐使用......