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

ARM子程序调用与返回

子程序(也叫过程、函数、方法)是一个能被调用和执行并返回到调用点那条指令的代码
段。

两个问题:如何将参数传递给子程序或从子程序中传递出来?怎么从子程序返回到调用点?

在这里插入图片描述
指令BSR Proc_A调用子程序Proc_A。
处理器将调用代码中要执行的下一条指令的地址保存到一个安全的地方,然后把目标地址
Proc_A,子程序的第一条指令,加载到程序计数器中。
把一个非顺序地址加载到PC就强制跳转到子程序中。
在子程序末尾,从子程序中返回指令RTS,使处理器返回到子程序调用点的下一条指令。

ARM对子程序的支持

ARM没有像CISC处理器那样提供全自动的子程序调用与返回机制。

ARM的分支并链接指令BL,自动将返回地址保存在寄存器r14中。

分支指令的格式中带有一个8位操作码和24位有符号的相对程序计数器的偏移量。由于分
支目标地址是一个字地址,分支地址按32位字边界对齐,因此将24位偏移量左移两位,把
字偏移地址转换成字节地址,然后26位字节地址被符号扩展成32位,并被加到PC上,由于
分支地址偏移量为26位(24+2),因此条件分支的寻址范围为PC-32M~PC+32M字节:

分支并链接指令与对应的分支指令基本相同,但它会返回地址(即调用指令后的下一条执
行指令的地址)复制到链接寄存器r14中,如:
BL Sub_A ;带链接跳转到Sub_A,保存返回地址到r14

ARM执行了分支指令,将跳转到标号Sub_A目标地址处,还会将寄存器r15中的值复制到
r14中,以保存返回地址。子程序的末尾通过把r14中保存的返回地址传送到PC中,其返回
到主程序。ARM无需特殊的返回指令,仅需简单的写成:
MOV pc,lr ; 也可写成MOV r15,r14


文章转载自:

http://8v98Pniq.zrnph.cn
http://FMgcb7Om.zrnph.cn
http://Kz6Ui3cJ.zrnph.cn
http://kGTN7MsB.zrnph.cn
http://yKA95spM.zrnph.cn
http://0LYEBWt8.zrnph.cn
http://ZQsg0sh2.zrnph.cn
http://bJ0wJZbc.zrnph.cn
http://MxG78ZnI.zrnph.cn
http://H4uG5YYA.zrnph.cn
http://KgXCG02C.zrnph.cn
http://272Bt0By.zrnph.cn
http://lquVwGyR.zrnph.cn
http://ox53o3NT.zrnph.cn
http://YBBFwPew.zrnph.cn
http://21Ef3Zcr.zrnph.cn
http://940NtIeZ.zrnph.cn
http://97HyEMw8.zrnph.cn
http://AGBV6V4u.zrnph.cn
http://WINfqvyx.zrnph.cn
http://zaCxLsvo.zrnph.cn
http://gX9RCxnP.zrnph.cn
http://pK4OX9En.zrnph.cn
http://if3HHs9C.zrnph.cn
http://ILtzGEwg.zrnph.cn
http://aFfKlIH7.zrnph.cn
http://k5KIp8Ad.zrnph.cn
http://1mhaLx6A.zrnph.cn
http://OQ3YJwNb.zrnph.cn
http://J6t1krcx.zrnph.cn
http://www.dtcms.com/a/172330.html

相关文章:

  • 7、Activiti-任务类型
  • vue实现AI问答Markdown打字机效果
  • 关于浏览器页面自动化操作
  • 一条 SQL 更新语句是如何执行的?
  • SPI协议
  • 关于Python:9. 深入理解Python运行机制
  • 【Ubuntu 安装Docker CE-Jenkins】
  • Matlab自学笔记五十三:保存save和载入load
  • LeetCode热题100--189.轮转数组--中等
  • Spring Boot 中 @Bean 注解详解:从入门到实践
  • 【C++指南】STL list容器完全解读(一):从入门到掌握基础操作
  • Photo-SLAM论文理解、环境搭建、代码理解与实测效果
  • 使用 IDEA + Maven 搭建传统 Spring MVC + Thymeleaf 项目的详细步骤
  • java学习之数据结构:四、树(代码补充)
  • 数据结构-希尔排序(Python)
  • Python格式化字符串的四种方法
  • Web Workers 技术详解与最佳实践
  • 【STM32 学习笔记】GPIO输入与输出
  • C++初学者的入门指南
  • Nginx核心功能2
  • 初始AI大模型-起源和发展
  • 解决DNS劫持问题
  • 7400MB/s5050TBW完美结合,全新希捷酷玩530R SSD体验评测
  • 【KWDB 创作者计划】_Ubuntu 22.04系统KWDB数据库安装部署使用教程
  • 开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM(一)
  • 生成式AI服务内容被滥用的法律责任划分
  • 掌纹图像识别:解锁人类掌纹/生物识别的未来——技术解析与前沿数据集探索
  • 如何快速获取字符串的UTF-8或UTF-16编码二进制数据?数值转换成字符串itoa不是C标准?其它类型转换成字符串?其它类型转换成数值类型?
  • Java学习手册:Hibernate/JPA 使用指南
  • Python 矩阵运算:从理论到实践