汇编语言 --函数调用
【摘要】
汇编语言实现函数的调用,代码如下
.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)