立即数、栈、汇编与C函数的调用

  • 一、立即数

    • 在 ARM 架构中,立即数是指在指令中直接编码的常量值,而不是通过寄存器或内存引用的值
    • 立即数的特点

      • 编码限制:ARM指令是固定长度的(32位),因此立即数不能占用太多位数。典型的算术和逻辑指令通常只能编码8-12位的立即数
      • 移位特性:ARM使用一种聪明的编码方式,允许8位立即数加上4位的移位值(0-30,步长为2),这样可以表示更大范围的数值
      • 有效性检查:不是所有32位值都能作为立即数,只有那些可以通过8位值循环右移偶数位得到的数值才是有效的立即数
    • 判断条件

      • 这个数的范围在0~0xFF之间;
      • 这个数展开成二进制,这个数的最高位1至最低位1之间的二进制序列的位数不超过8位;
      • 这个数展开的二进制序列最低位1右边必须为偶数个连续的0
  • 二、指令

    • b指令:类似goto语句,实现无条件跳转,需要一个label来指定跳转的方位,实际上就是把待跳转的那行地址转入pc寄存器,调用完毕后不会回到调用处的下一行指令;
    • bl指令:跳转时会在lr寄存器中保存返回的地址;
    • bx:跳转到寄存器的地址,不保存返回地址
  • 三、栈

    • 满减栈

      • 特点:

        • 栈指针指向最后一个压入的数据 (栈已满)
        • 栈向低地址方向增长 (递减)
      • 操作:

        • 先减SP,再存储数据
        • 先读取数据,再加SP
      • ARM默认:ARM架构通常使用满减栈
    • 满增栈

      • 特点:

        • 栈指针指向最后一个压入的数据
        • 栈向高地址方向增长 (递增)
      • 操作:

        • 先加SP,再存储数据
        • 先读取数据,再减SP
    • 空减栈

      • 特点:

        • 栈指针指向下一个可用位置 (栈为空)
        • 栈向低地址方向增长
      • 操作:

        • 先存储数据,再减SP
        • 先加SP,再读取数据
    • 空增栈

      • 特点:

        • 栈指针指向下一个可用位置
        • 栈向高地址方向增长
      • 操作:

        • 先存储数据,再加SP
        • 先减SP,再读取数据
    • 满/空:指SP指向的是有效数据(满)还是下一个空位(空)
    • 增/减:指栈增长方向是地址增加还是减少
  • 四、汇编与C函数的调用

    • arm汇编调用C函数:

      • 1.在汇编代码里用import声明C函数;
      • 2.要注意保护现场;
      • 3.传参时使用寄存器R0-R3,超过四个参数时使用栈来传参;
      • 4.c函数的返回值用R0来返回
    • C函数调用arm汇编函数:

      • 1.在汇编代码里用export导出该函数;
      • 2.在C函数里用extern来声明arm函数;
      • 3.在C函数里保护现场和恢复现场;
      • 4.传参使用R0-R3寄存器和返回值用R0返回
相关推荐
爬虫程序猿12 小时前
用 Python 给京东商品详情做“全身 CT”——可量产、可扩展的爬虫实战
开发语言·爬虫·python
侯小啾14 小时前
【03】C语言 强制类型转换 与 进制转换
c语言·数据结构·算法
徐同保14 小时前
tailwindcss暗色主题切换
开发语言·前端·javascript
蓝纹绿茶14 小时前
bash:**:pip:***python: 错误的解释器: 没有那个文件或目录
开发语言·python·pip
云知谷15 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
START_GAME15 小时前
深度学习Diffusers:用 DiffusionPipeline 实现图像生成
开发语言·python·深度学习
不爱编程的小九九15 小时前
小九源码-springboot088-宾馆客房管理系统
java·开发语言·spring boot
Evand J16 小时前
【MATLAB例程】到达角度定位(AOA),平面环境多锚点定位(自适应基站数量),动态轨迹使用EKF滤波优化。附代码下载链接
开发语言·matlab·平面·滤波·aoa·到达角度
细节控菜鸡16 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis
Pluto_CSND17 小时前
Java实现gRPC双向流通信
java·开发语言·单元测试