Arm 汇编代码中返回值的函数与不返回值的函数有何不同';t值?

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

平台: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
在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
中的值。如果您不熟悉,这里的关键概念是“”,这些功能将是相同的。