Arm 汇编代码中返回值的函数与不返回值的函数有何不同';t值?
平台:Cortex-M3 IDE:Keil uVision5.10 大家好~ 下面是一个简单的例子: C代码中不返回值的函数(比如function1):Arm 汇编代码中返回值的函数与不返回值的函数有何不同';t值?,arm,Arm,平台:Cortex-M3 IDE:Keil uVision5.10 大家好~ 下面是一个简单的例子: C代码中不返回值的函数(比如function1): void add_one(int n) { int a = n+1; } int add_one(int n) { int a = n+1; return a; } 其汇编代码为: ADDS r1,r0,#1 BX lr MOV r1,r0 ADDS r0,r1,#1 BX lr
void add_one(int n)
{
int a = n+1;
}
int add_one(int n)
{
int a = n+1;
return a;
}
其汇编代码为:
ADDS r1,r0,#1
BX lr
MOV r1,r0
ADDS r0,r1,#1
BX lr
在C代码中返回值(比如function2)的函数:
void add_one(int n)
{
int a = n+1;
}
int add_one(int n)
{
int a = n+1;
return a;
}
其汇编代码为:
ADDS r1,r0,#1
BX lr
MOV r1,r0
ADDS r0,r1,#1
BX lr
就我所见,唯一的区别是function2从r0移动参数n,然后执行计算,而function1直接计算。
我的困惑是这两个函数都以
BX lr
我知道代码的作用是使程序跳转到寄存器lr中包含的另一个地址。function2如何返回值?到底发生了什么?返回值存储在
R0
中BX LR
将跳回调用方,调用方知道函数返回某个内容,现在可以从R0
寄存器获取该内容。调用者和被调用者之间的协议称为“呼叫约定”
你应该去看看报纸。例如,在5.4结果返回下,它表示:
在r0中返回一个字大小的基本数据类型(例如int、float)
这正是你所看到的。你对
r0
角色的观察是正确的。调用函数将期望r0
中的返回值(如果返回值是寄存器大小的整数或指针),如果被调用函数未返回任何内容(void
),则将忽略r0
中的值。如果您不熟悉,这里的关键概念是“”,这些功能将是相同的。