-
一、立即数
- 在 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返回
-
立即数、栈、汇编与C函数的调用
起个昵称吧2025-09-13 20:30
相关推荐
难以触及的高度8 分钟前
Java for循环完全指南:从基础到高性能实践wadesir8 分钟前
用Python实现ggplot2风格绘图(零基础入门Seaborn与Matplotlib美化技巧)油炸自行车23 分钟前
【Qt】Qt Creator Debug模式提示“缺少 Windows CDB 调试器配套的扩展组件“”budingxiaomoli25 分钟前
多线程(三)VBA633730 分钟前
VBA之Excel应用第十节:用Union和Intersect方法获得单元格区域klzdwydz41 分钟前
注解与反射ULTRA??1 小时前
C语言简化版本开辟动态内存的万能MALLOC宏封装2401_861277551 小时前
func(int* num)的实现是*num=2或者int a=3,num=&a都可以吗talenteddriver1 小时前
java: 分页查询(自用笔记)繁华似锦respect1 小时前
lambda表达式中的循环引用问题详解