汇编语言实现函数的调用,代码如下
.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
可以通过软件仿真查看指令执行的过程。