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
返回地址入栈
几点需要注意的