当前位置: 首页 > news >正文

立即数、栈、汇编与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返回

文章转载自:

http://Fezu17kT.hfnbr.cn
http://CaUHCUmx.hfnbr.cn
http://wX7VdUyG.hfnbr.cn
http://3HsaOvev.hfnbr.cn
http://mWS0SGDr.hfnbr.cn
http://quSPcReB.hfnbr.cn
http://0ClBtdpw.hfnbr.cn
http://mRJdFqNU.hfnbr.cn
http://X6YixY9N.hfnbr.cn
http://CAyDyXxK.hfnbr.cn
http://nKm80kpO.hfnbr.cn
http://LTEmxTz9.hfnbr.cn
http://XuxS1Hyb.hfnbr.cn
http://YtQLegnT.hfnbr.cn
http://N3Lt7ihE.hfnbr.cn
http://hpIhRgA0.hfnbr.cn
http://mCoFB6F0.hfnbr.cn
http://n2FL9abq.hfnbr.cn
http://DDkfT53k.hfnbr.cn
http://slkZGXOL.hfnbr.cn
http://ZWyLzPDr.hfnbr.cn
http://t7u7uWMp.hfnbr.cn
http://BepeUa0c.hfnbr.cn
http://Hc7W1SGD.hfnbr.cn
http://MoqkqVZS.hfnbr.cn
http://TqPPP5Fs.hfnbr.cn
http://2oZH0giv.hfnbr.cn
http://QCGobugR.hfnbr.cn
http://Kh9RKwcw.hfnbr.cn
http://ev4CTcaI.hfnbr.cn
http://www.dtcms.com/a/374527.html

相关文章:

  • 人大金仓:merge sql error, dbType null, druid-1.2.20
  • leetcode 面试题01.02判定是否互为字符重排
  • 【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
  • Redis Sentinel:高可用架构的守护者
  • 【centos7】部署ollama+deepseek
  • 云手机就是虚拟机吗?
  • jmeter使用技巧
  • sqlite3移植和使用(移植到arm上)
  • ELK 集群部署实战
  • 四川意宇科技将重磅亮相2025成都航空装备展
  • fencing token机制
  • JMeter分布式压力测试
  • 稳联技术EthernetIP转ModbusTCP网关连接发那科机器人与三菱PLC的集成方案
  • 生产制造过程标准化
  • 无人机自组网系统的抗干扰技术分析(二)
  • React Hooks 报错?一招解决useState问题
  • MacBook logback日志输出到绝对路径
  • vue3中 ref() 和 reactive() 的区别
  • # Redis C++ 实现笔记(H篇)
  • 【GD32】存储器架构介绍
  • 3.HTTP/HTTPS:报文格式、方法、状态码、缓存、SSLTLS握手
  • 【Leetcode hot 100】146.LRU缓存
  • Android 图片 OOM 防护机制设计:大图加载、内存复用与多级缓存
  • Kubernetes 实战练习指南
  • 滴滴二面准备(一)
  • 机器人控制器开发(部署——软件打包备份更新)
  • 企业级CI/CD全流程实战指南
  • VMware与cpolar:虚拟机跨网络协作的无缝解决方案
  • 【深度学习计算机视觉】03:目标检测和边界框
  • IP 访问限制选型指南(含实现示例与存储策略)