汇编语言 --函数调用

举报
王建峰 发表于 2021/11/19 02:59:12 2021/11/19
2.3k+ 0 0
【摘要】   汇编语言实现函数的调用,代码如下 .text @表示为代码段,以下内容是指令 main: @入口函数,在这里可有可无 mov r0,#1 bl fun @b1 为跳转指令,同时保存下一个地址的位置到LR寄存去(作为函数的返回地址) main_end: b main...

汇编语言实现函数的调用,代码如下


      .text        @表示为代码段,以下内容是指令
      main:             @入口函数,在这里可有可无
      	mov r0,#1
      	bl fun @b1 为跳转指令,同时保存下一个地址的位置到LR寄存去(作为函数的返回地址)
      main_end:
      	b main_end    @b 跳转指令,这里为了执行完以上代码之后让程序空转
      fun:
      fun_end:
      	mov r0,#2
      	mov pc,lr    @将LR寄存器中的返回地址,搬移给PC寄存器,实现函数的返回
      .end    @代表程序结束
  
 

如果我们要实现一个汇编代码,通常先实现一个功能相识的C代码,然后再写汇编代码。例如

1.C代码实现
demo.c


      void main(void)
      {
          int ret=0;
          func1(2);
          while(1) {};
      }
      func1(int a)
      {
          if(a==2)
            return func2(a);
          else
            return func3(a);
      }
      func2(int a)
      {
          return a+3;
      }
      func3(int a)
      {
          return a-1;
      }
  
 

2.转换成对应的汇编码

demo.s


      .text
      main:
      	mov r5,#0
      	mov r0,#2
      	bl fun1   @函数调用
      main_end:
      	b main_end    @ while(1);
      fun1:
      	cmp r0,#2    @ if(a==2)
      	bleq fun2    @ cmp判断相等执行fun2
      	blne fun3    @cmp判断不相等执行fun3
      fun1_end:
      	mov pc,lr    @保存返回地址到LR
      fun2:
      	mov r13,lr    @将fun1的返回地址保存到R13,避免嵌套函数要覆盖LR中的数据
      	add r0,#3
      	mov pc,r13    @函数返回
      fun3:
     	sub r0,r0,#1
      	mov pc,lr    @函数返回
      .end
  
 

可以通过软件仿真查看指令执行的过程。

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/82762758

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。