- UID
- 2
注册时间2004-12-1
阅读权限255
最后登录1970-1-1
总坛主
TA的每日心情 | 开心 2024-12-1 11:04 |
---|
签到天数: 12 天 [LV.3]偶尔看看II
|
很久前的笔记,整理出来重新研究下
测试设备:
iPod Touch 5G iPad Air2
- ////////////////////////////////////////////////////////////////////////
- /// armv7传参研究
- ////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------
- int func(int a, int b, int c, int d, int e, int f)
- {
- int ret = a + b + c + d + e + f;
- return ret;
- }
- _func:
- Lfunc_begin0:
- @DEBUG_VALUE: func:a <- R0 // 前4个参数放到r0 - r3
- @DEBUG_VALUE: func:b <- R1
- @DEBUG_VALUE: func:c <- R2
- @DEBUG_VALUE: func:d <- R3
- @DEBUG_VALUE: func:e <- [SP+0] // 第5参数
- @DEBUG_VALUE: func:f <- [SP+4] // 第6参数
- add r0, r1
- ldr.w r12, [sp] // 参数4
- add r0, r2
- ldr.w r9, [sp, #4] // 参数5
- add r0, r3
- add r0, r12
- add r0, r9 // 最终结果累加到r0
- @DEBUG_VALUE: func:ret <- R0
- bx lr // 返回调用方
- Lfunc_end0:
- //---------------------------------------------------------------------
- // 结论:
- // 1.可以看到7个参数以下,无需保存现场-因为压根用不到r7和lr
- // 2.前四参数:r0-r3 第五参数:[sp+0] 第六参数:[sp+4]
-
- // 上面结果似乎在我们意料之中!!
- //---------------------------------------------------------------------
- // 现在我们修改代码,多加入一个参数
- int func(int a, int b, int c, int d, int e, int f, int g)
- {
- int ret = a + b + c + d + e + f + g;
- return ret;
- }
- // 哈哈,这时候有看头了
- _func:
- Lfunc_begin0:
- push {r7, lr}
- mov r7, sp // 将r7指向sp
- @DEBUG_VALUE: func:a <- R0
- @DEBUG_VALUE: func:b <- R1
- @DEBUG_VALUE: func:c <- R2
- @DEBUG_VALUE: func:d <- R3
- @DEBUG_VALUE: func:e <- [R7+8]
- @DEBUG_VALUE: func:f <- [R7+12]
- @DEBUG_VALUE: func:g <- [R7+16]
- add r0, r1
- ldr.w lr, [r7, #8] // 参数5
- add r0, r2
- ldr.w r9, [r7, #12] // 参数6
- add r0, r3
- ldr.w r12, [r7, #16] // 参数7
- add r0, lr
- add r0, r9
- add r0, r12 // 结果累加到r0
- @DEBUG_VALUE: func:ret <- R0
- pop {r7, pc}
- Lfunc_end0:
- // 结论:
- // 1.开始压入r7和lr了
- // 2.r7-->sp
- // 2.第5参数从[r7+8]开始
- //---------------------------------------------------------------------
- 现在我们修改代码,再加入一个参数--ok现在8个参数了
- int func(int a, int b, int c, int d, int e, int f, int g, int h)
- {
- int ret = a + b + c + d + e + f + g + h;
- return ret;
- }
- // 下面开始变得好玩了,看好啦~~
- _func:
- Lfunc_begin0:
- push {r4, r7, lr} // 保存现场
- add r7, sp, #4 // 现在sp+4指向栈上r4的位置 --- 这里一个诀窍,就是看r7前有n个寄存器,后面的数值就是 n*4 (szieof(int))
- @DEBUG_VALUE: func:a <- R0
- @DEBUG_VALUE: func:b <- R1
- @DEBUG_VALUE: func:c <- R2
- @DEBUG_VALUE: func:d <- R3
- @DEBUG_VALUE: func:e <- [R7+8]
- @DEBUG_VALUE: func:f <- [R7+12]
- @DEBUG_VALUE: func:g <- [R7+16]
- @DEBUG_VALUE: func:h <- [R7+20]
- add r0, r1
- add.w lr, r7, #8 // 指向第5个参数地址
- add r0, r2
- ldm.w lr, {r4, r9, r12, lr} // 一条指令取得剩下的参数
- add r0, r3
- add r0, r4
- add r0, r9
- add r0, r12
- add r0, lr
- Ltmp1:
- @DEBUG_VALUE: func:ret <- R0
- pop {r4, r7, pc} // 恢复现场
- Ltmp2:
- Lfunc_end0:
- //---------------------------------------------------------------------
- // 结论:
- // 1.开始压入r7和lr了
- // 2.r7-->[sp + n*4]
- // 2.第5参数从[r7+8]开始
- ////////////////////////////////////////////////////////////////////////
- /// arm64传参研究
- ////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------
- // 先看看int型的
- int func(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l)
- {
- int ret = a + b + c + d + e + f + g + h + i + j + k + l;
- return ret;
- }
- _func: ; @func
- Lfunc_begin0:
- ;DEBUG_VALUE: func:a <- W0
- ;DEBUG_VALUE: func:b <- W1
- ;DEBUG_VALUE: func:c <- W2
- ;DEBUG_VALUE: func:d <- W3
- ;DEBUG_VALUE: func:e <- W4
- ;DEBUG_VALUE: func:f <- W5
- ;DEBUG_VALUE: func:g <- W6
- ;DEBUG_VALUE: func:h <- W7
- ;DEBUG_VALUE: func:i <- [SP+0]
- ;DEBUG_VALUE: func:j <- [SP+4]
- ;DEBUG_VALUE: func:k <- [SP+8]
- ;DEBUG_VALUE: func:l <- [SP+12]
- ldp w9, w8, [sp, #8] // ldp命令能一次获取给两个寄存器赋值,这里就给w8 w9赋值了
- ldp w11, w10, [sp] // w10、w11赋值
- add w12, w1, w0 // 下面是各寄存器相加
- add w12, w12, w2
- add w12, w12, w3
- add w12, w12, w4
- add w12, w12, w5
- add w12, w12, w6
- add w12, w12, w7
- add w11, w12, w11
- add w10, w11, w10
- add w9, w10, w9
- add w0, w9, w8 // w0返回
- ;DEBUG_VALUE: func:ret <- W0
- ret // 调用ret返回函数
- Lfunc_end0:
- // 结论:
- // 1.int型(32bit)由w开头的寄存器操作,结果在w0返回
- // 2.前八个参数:w0-w7 后面开始栈传递
- //---------------------------------------------------------------------
- // 再看看long型的
- long func2(long a, long b, long c, long d, long e, long f, long g, long h, long i, long j, long k, long l)
- {
- long ret = a + b + c + d + e + f + g + h + i + j + k + l;
- return ret;
- }
- _func2: ; @func2
- Lfunc_begin1:
- ;DEBUG_VALUE: func2:a <- X0
- ;DEBUG_VALUE: func2:b <- X1
- ;DEBUG_VALUE: func2:c <- X2
- ;DEBUG_VALUE: func2:d <- X3
- ;DEBUG_VALUE: func2:e <- X4
- ;DEBUG_VALUE: func2:f <- X5
- ;DEBUG_VALUE: func2:g <- X6
- ;DEBUG_VALUE: func2:h <- X7
- ;DEBUG_VALUE: func2:i <- [SP+0] // 栈以0x8递增
- ;DEBUG_VALUE: func2:j <- [SP+8]
- ;DEBUG_VALUE: func2:k <- [SP+16]
- ;DEBUG_VALUE: func2:l <- [SP+24]
- ldp x9, x8, [sp, #16] // ldp命令一次对两个寄存器操作
- ldp x11, x10, [sp]
- add x12, x1, x0 // 下面是各寄存器相加
- add x12, x12, x2
- add x12, x12, x3
- add x12, x12, x4
- add x12, x12, x5
- add x12, x12, x6
- add x12, x12, x7
- add x11, x12, x11
- add x10, x11, x10
- add x9, x10, x9
- add x0, x9, x8 // x0返回
- ;DEBUG_VALUE: func2:ret <- X0
- ret // 调用ret返回函数
- Lfunc_end1:
- // 结论:
- // 1.long型(64bit)由x开头的寄存器操作,结果在x0返回
- // 2.前八个参数:x0-x7 后面开始栈传递
- //---------------------------------------------------------------------
复制代码
|
|