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

.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;

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

 

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