汇编语言 --函数调用

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

 

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


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

 

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

1.C代码实现
demo.c


  
  1. void main(void)
  2. {
  3.     int ret=0;
  4.     func1(2);
  5.     while(1) {};       
  6. }    
  7. func1(int a)
  8. {
  9.     if(a==2)
  10.       return func2(a);
  11.     else
  12.       return func3(a);  
  13. }
  14. func2(int a) 
  15. {    
  16.     return a+3;
  17. func3(int a)
  18. {    
  19.     return a-1;

 

2.转换成对应的汇编码

demo.s


  
  1. .text
  2. main:
  3. mov r5,#0
  4. mov r0,#2
  5. bl fun1 @函数调用
  6. main_end:
  7. b main_end @ while(1);
  8. fun1:
  9. cmp r0,#2 @ if(a==2)
  10. bleq fun2 @ cmp判断相等执行fun2
  11. blne fun3 @cmp判断不相等执行fun3
  12. fun1_end:
  13. mov pc,lr @保存返回地址到LR
  14. fun2:
  15. mov r13,lr @将fun1的返回地址保存到R13,避免嵌套函数要覆盖LR中的数据
  16. add r0,#3
  17. mov pc,r13 @函数返回
  18. fun3:
  19. sub r0,r0,#1
  20. mov pc,lr @函数返回
  21. .end

 

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

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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