平台: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如何返回值?究竟发生了什么?
答案 0 :(得分:2)
返回值存储在R0
中。 BX LR
将跳回调用者,调用者知道函数返回一些东西,现在可以从R0
寄存器中获取它。调用者和被调用者之间的这种协议被命名为“调用约定”。
您应该查看Procedure Call Standard for the ARM Architecture。例如,在5.4结果返回下,它说:
在r0中返回一个字大小的基本数据类型(例如,int,float)。
这正是你所看到的。