凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

汇编语言子程序调用及返回

已有 594 次阅读| 2016-2-17 14:19 |个人分类:linux技术

ARM汇编语言中,子程序调用是通过BL指令来完成的。BL指令的语法格式如下:

BL          subname

其中:subname是被调用的子程序的名称。BL指令完成2个操作,即将子程序的返回地址放在LR寄存器中,同时将PC寄存器值设置成目标子程序的第一条指令地址。

在返回调用子程序时,转移链接指令保存到LR寄存器中的值需要拷贝回程序寄存器PC。对于最简单的子程序,一条MOV指令就可完成子程序的返回,例如:

SUB2      …

              MOV             PCR14               ;把R14拷贝到R15来返回

其实,任何数据处理指令都可用来计算返回地址,但是MOV指令时至今最常见的形式。碎玉在子程序中出现嵌套调用时,链接寄存器LR中的返回地址可能会在第二次调用时被覆盖,所以需要将返回地址压入堆栈来进行保存。在子程序返回时,返回地址和保存的工作寄存器都可用多寄存器存取指令恢复。例如:

       SUB1             STMFD          R13!,{R0-R2R14}            ;保存工作寄存器和链接

                            BL                 SUB2

                                   …

                            LDMFD         R13!,{R0-R2PC}              ;恢复工作寄存器并返回

需要注意的是,返回地址是直接恢复到程序计数器PC,而不是链接寄存器LR。这种单元恢复和返回指令是非常有用的。

下面是一个子程序调用的简单例子。子程序DOADD完成加法运算,操作数放在R0R1寄存器中,结果放在R0中。

AREA     EXAMPLECODEREADONLY

              ENTRY

Start              MOV             R0#10               ;设置输入参数R0

              MOV             R1#3                 ;设置输入参数R1

              BL                 Doadd                   ;调用子程序Doadd

                     …

Doadd     ADD              R0R0R1         ;子程序

              MOV             PCLR                ;从子程序中返回

END                                                        ;结束汇编

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 07:04 , Processed in 0.013271 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部