C 语言和 ARM 汇编 - 11 参数传递

ARM 前4个函数参数可以通过 R0~R3,更多的参数通过堆栈传递。

例子

void fun(int x, int y)
{
    x++;
    x += y;
}
int main()
{
    fun(2, 3);
}

汇编指令

fun:
    sub sp, sp, #8
# 将r0 赋值到局部变量 x = sp[4]
    str r0, [sp, #4]
# 将r1 赋值到局部变量 y = sp[0]
    str r1, [sp]
    ldr r3, [sp, #4]
    adds    r3, r3, #1
    str r3, [sp, #4]
    ldr r2, [sp, #4]
    ldr r3, [sp]
    add r3, r3, r2
    str r3, [sp, #4]
    add sp, sp, #8
    bx  lr
main:
    push    {r3, lr}
# 参数1 放到 r0
    movs    r0, #2
# 参数2 放到 r1
    movs    r1, #3
    bl  fun
    mov r0, r3
    pop {r3, pc}

X86 是直接通过堆栈进行参数传递,在函数调用的过程中就需要堆栈到堆栈的数据拷贝,在参数传递过程中会需要更多的堆栈动作,如图

|    |
|    |
|    |
|    |
|----| <- esp
函数调用前

|    |
|    |
|    |
|----| <- esp
|----| 
参数入栈

|    |
|    |
|----| <- esp
|----| return address
|----| parameters
返回地址入栈

几点需要注意的