汇总代码中返回值的函数与不返回值的函数有什么区别?

时间:2016-09-10 16:19:47

标签: arm

平台:Cortex-M3

IDE:Keil uVision5.10

大家好~~

这是一个简单的例子: 在C代码中没有返回值的函数(让我们说函数1):

void add_one(int n)
{
    int a = n+1;
}

它的汇编代码是:

ADDS   r1,r0,#1
BX     lr

在C代码中返回值(让' s表示function2)的函数:

int add_one(int n)
{
    int a = n+1;
    return a;
}

及其汇编代码为:

MOV     r1,r0
ADDS    r0,r1,#1
BX      lr

据我所知,唯一的区别是function2从r0移动参数n然后在function1直接计算时执行计算。 我的困惑是两个函数都以

结尾
BX      lr

我知道代码的作用是让程序跳转到寄存器lr中包含的另一个地址。 function2如何返回值?究竟发生了什么?

1 个答案:

答案 0 :(得分:2)

返回值存储在R0中。 BX LR将跳回调用者,调用者知道函数返回一些东西,现在可以从R0寄存器中获取它。调用者和被调用者之间的这种协议被命名为“调用约定”。

您应该查看Procedure Call Standard for the ARM Architecture。例如,在5.4结果返回下,它说:

  

在r0中返回一个字大小的基本数据类型(例如,int,float)。

这正是你所看到的。