你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

难得翻下手册,果然S0-S15都可用来传参

[复制链接]
Mandelbrot_Set 发布时间:2015-11-27 13:04
6.1.2.3  Parameter passing
  c; X/ B1 q. S+ h! vThere is one VFP co-processor register class using registers s0-s15 (d0-d7) for passing arguments.   
! Q2 {  P8 v& }+ oThe following co-processor rules are defined for the VFP: 8 d/ u' [, X, E2 ?% h' _
A.2.vfp  The floating point argument registers are marked as unallocated.
) r  P' `- V" e, VB.3.vfp  Nothing to do. ! d+ S: A; f) f% `* J: [3 e$ C
C.1.vfp  If the argument is a VFP CPRC and there are sufficient consecutive VFP registers of the appropriate * k) x0 Z! `4 f1 B; {- a
type unallocated then the argument is allocated to the lowest-numbered sequence of such registers.
5 h6 k: u$ x* f* h9 bC.2.vfp  If the argument is a VFP CPRC then any VFP registers that are unallocated are marked as
: _+ X4 h& O+ n, Aunavailable.  The NSAA is adjusted upwards until it is correctly aligned for the argument and the ) k0 K8 ?# Q6 X/ N8 x( g
argument is copied to the stack at the adjusted NSAA.  The NSAA is further incremented by the size
# r! o, Q8 Y8 T! m* z4 ~% W6 Aof the argument.  The argument has now been allocated. + S2 d9 ?0 o, q$ S' N  q
Note that the rules require the ‘back-filling’ of unused co-processor registers that are skipped by the alignment 9 V& d2 F% s- ]3 f& K) w
constraints of earlier# B. e0 C) ^5 c5 H! W( z! @( [

测试一下:" t7 E# R8 k: ~" M1 i
  1. float PP_TETS
    " a( K- M- ]: f
  2.         (
    2 c% ^$ B- ?* s/ }. f
  3.         float s0,
    + z" f  j$ N1 L" @1 j* ^
  4.         float s1,. u, t: Y5 s  }) H" m$ I
  5.         float s2,
    3 b2 H7 ]2 s. i. t8 ~
  6.         float s3,
    # o  D! N/ U" j; p  i) H
  7.         float s4,
      G2 o) T/ @8 @2 L% L- S  r* ?
  8.         float s5,5 \# c) w+ \0 X5 K, K
  9.         float s6,( x$ s2 h4 \  o* e
  10.         float s7,' R+ _, X2 R" U( Z; k8 D3 b* b) D
  11.         float s8,                        
    % [* v  [+ U; n$ H: r6 F
  12.         float s9,
    % V% z) \& x7 o. I0 p4 d, I
  13.         float s10,
    5 D# ^9 V. u& m5 W! ?6 A0 L0 b
  14.         float s11,
    ! D, X4 m$ F3 R. u8 O, P
  15.         float s12,8 a" g& s% u* n3 D" L
  16.         float s13,9 z4 J$ Y9 _$ ^/ g
  17.         float s14,
    : Z! {+ J3 y" m3 \4 J5 d  ~% O
  18.         float s15,7 y' ^6 m9 ]7 b+ ^2 _# s% V7 ^
  19.         int r0,0 P  W8 R: k8 y' E( G
  20.         int r1,
    / M+ k  q: a: g' h: `
  21.         int r2,( P& Z5 v7 c7 s. U
  22.         int r3- C* Z) w  m5 E+ u# E
  23.         )( V" ~: ]7 G4 O4 P- v
  24. {
    " U" Z0 q. x7 _4 v( g+ C
  25.          r0+=r1;( c! }, c( k3 g+ T$ S6 v  @
  26.          r0+=r2;* R" F: m4 V8 e- h# H* c
  27.          r0+=r3;% R7 M$ i' G, [" m0 C
  28.          if(r0)
    6 i2 m" [6 K  T6 {4 x; a6 \* x
  29.          {
    , l% B% B8 ^3 t- x! x
  30.                 s0+=s1;+ R1 A+ ^5 h! U5 Y1 f% e
  31.                 s0+=s2;
    & }3 D, F( [! ]; r- z$ o9 v" C
  32.                 s0+=s3;
    5 {+ b- g# m( Y* Z
  33.                 s0+=s4;8 u1 x; K$ r' a% o$ b6 f  e1 k
  34.                 s0+=s5;' g, z/ g8 V0 t# ], \
  35.                 s0+=s6;$ p9 q8 s, M. Z6 ^
  36.                 s0+=s7;" y+ ^; x# @9 g8 v  D9 N
  37.                 s0+=s8;
    . r9 h& A6 @, g- e9 {+ P( L
  38.                 s0+=s9;& r: N1 _* X. m
  39.                 s0+=s10;
    " q# i! g4 l. }& ]  B, e
  40.                 s0+=s11;' m- y! k% C2 T; \* j" o. P: o
  41.                 s0+=s12;% G5 W& L9 l: ]5 v0 N& ?
  42.                 s0+=s13;
    . z" K! m; G- K1 [' i+ d9 }' j* E
  43.                 s0+=s14;
    0 @7 u( p# j# I$ w
  44.                 s0+=s15;
    - m0 w( ?$ k6 S6 y( X) Q6 n' v
  45.          }
    0 A5 D3 l. e0 \; w# M: x
  46.          return s0;# m. z% z4 ^; R+ l" T
  47. }
复制代码

8 Q; |5 m7 E- V6 ^  V
编译结果:
0 c) i% h; ]: b8 q; O# s$ ]- O
  1. ER_IROM1:080002FC  C) D# x" D+ K4 t% S3 B
  2. ER_IROM1:080002FC ; =============== S U B R O U T I N E =======================================1 W% v1 o; J6 R- v
  3. ER_IROM1:080002FC
    9 e0 k. ^' \' E. Z1 O
  4. ER_IROM1:080002FC
    1 M  B4 m3 Y5 y% H8 O6 s
  5. ER_IROM1:080002FC ; PP_TETS(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, int, int, int, int)& `0 U0 a: l6 o+ i; Y2 \
  6. ER_IROM1:080002FC                 EXPORT _Z7PP_TETSffffffffffffffffiiii
    2 O  \- Y' g, n; [  i& k
  7. ER_IROM1:080002FC _Z7PP_TETSffffffffffffffffiiii
    6 l. L2 f) E9 }
  8. ER_IROM1:080002FC                 PUSH            {R4,LR}
    7 `. C) }$ E  n% Z; j
  9. ER_IROM1:080002FE                 VPUSH           {D8}
    9 Y: i- h* U. f
  10. ER_IROM1:08000302                 ADD             R0, R1( P+ `1 a( @- t: t$ e+ R/ J5 s
  11. ER_IROM1:08000304                 ADD             R0, R27 ~4 [" {1 u; I2 l- R
  12. ER_IROM1:08000306                 ADD             R0, R3* ]% q5 B( ~2 M4 M9 V
  13. ER_IROM1:08000308                 CBZ             R0, loc_8000382: M$ l/ {5 K! j0 F
  14. ER_IROM1:0800030A                 VADD.F32        S16, S0, S14 L5 e* d1 _# A
  15. ER_IROM1:0800030E                 VMOV.F32        S0, S16
    + N9 {. v3 i% {
  16. ER_IROM1:08000312                 VADD.F32        S16, S0, S2' h1 ]: Z0 ]( s& s
  17. ER_IROM1:08000316                 VMOV.F32        S0, S16
    * Z" ^0 L! l% g' E# T. I! z
  18. ER_IROM1:0800031A                 VADD.F32        S16, S0, S3, e( X6 z; v, e# F1 `% M
  19. ER_IROM1:0800031E                 VMOV.F32        S0, S16
    7 O. ?! c$ [8 k8 E" ~
  20. ER_IROM1:08000322                 VADD.F32        S16, S0, S4
    , d5 w) V* V4 }
  21. ER_IROM1:08000326                 VMOV.F32        S0, S16
    2 }' f; u1 L! g; G
  22. ER_IROM1:0800032A                 VADD.F32        S16, S0, S5: l- O" Q4 T: x4 H, ~/ d$ a& B4 v
  23. ER_IROM1:0800032E                 VMOV.F32        S0, S16
    ; f( s6 r* {4 T0 e7 C/ q3 e
  24. ER_IROM1:08000332                 VADD.F32        S16, S0, S6
    : C! X( g$ b9 W+ g& L* c3 S
  25. ER_IROM1:08000336                 VMOV.F32        S0, S16
    7 z5 B) n; r5 s
  26. ER_IROM1:0800033A                 VADD.F32        S16, S0, S74 z+ k9 i1 [9 A' {) g
  27. ER_IROM1:0800033E                 VMOV.F32        S0, S16- L: ]! c3 i" Y- M1 T, \9 O7 r
  28. ER_IROM1:08000342                 VADD.F32        S16, S0, S8
    3 M( x( ^, I! P3 R6 y4 ?+ P
  29. ER_IROM1:08000346                 VMOV.F32        S0, S16
    2 W' h: i- R' r; Z0 Z9 n; s  {! i7 x( U
  30. ER_IROM1:0800034A                 VADD.F32        S16, S0, S9
      G- h& i1 r9 O- E2 \/ U' b' A
  31. ER_IROM1:0800034E                 VMOV.F32        S0, S16
    , t6 s0 h: ~! G) \3 |
  32. ER_IROM1:08000352                 VADD.F32        S16, S0, S107 r: _' n$ G& L% X$ Q8 j% z
  33. ER_IROM1:08000356                 VMOV.F32        S0, S16
    # C. H! F" r" W
  34. ER_IROM1:0800035A                 VADD.F32        S16, S0, S11
      `( s, k/ z& K3 @* q5 k: }3 }
  35. ER_IROM1:0800035E                 VMOV.F32        S0, S16. J/ ^' n* G6 D' s0 D
  36. ER_IROM1:08000362                 VADD.F32        S16, S0, S12
    - s+ Z4 g" ]  H5 N- T+ _
  37. ER_IROM1:08000366                 VMOV.F32        S0, S16
    + D* G  p3 E+ ?/ u; y
  38. ER_IROM1:0800036A                 VADD.F32        S16, S0, S13
    5 [- N# o7 E8 B* T: j
  39. ER_IROM1:0800036E                 VMOV.F32        S0, S16
    3 f9 n4 e! B, [2 k$ k( M0 O7 Y
  40. ER_IROM1:08000372                 VADD.F32        S16, S0, S14- \  P3 G4 @% _, ^8 C, ~0 h$ A
  41. ER_IROM1:08000376                 VMOV.F32        S0, S16$ \1 Y  W' u7 n2 T, ~! M+ C- ~
  42. ER_IROM1:0800037A                 VADD.F32        S16, S0, S15% t$ e! N" o) j  l
  43. ER_IROM1:0800037E                 VMOV.F32        S0, S16- e  D2 l  n+ i8 N0 c, V4 B
  44. ER_IROM1:080003820 l$ L- }& R' h# ?3 s4 t8 T* S
  45. ER_IROM1:08000382 loc_8000382                             ; CODE XREF: PP_TETS(float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,int,int,int,int)+Cj( p" L/ O+ T; N" q: _
  46. ER_IROM1:08000382                 VPOP            {D8}6 @4 v: T2 P: P
  47. ER_IROM1:08000386                 POP             {R4,PC}2 E8 |- t- O7 S5 o9 {  F. U
  48. ER_IROM1:08000386 ; End of function PP_TETS(float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,int,int,int,int)
复制代码

5 q* d6 R. g: D3 y' l3 J; U. b; e; f0 L

4 G, d3 y1 |6 P, Y6 j" e
3 ]0 u/ j9 Y- K, U! V
THE END ...! r0 J1 M% f* B$ l

" ?/ m$ t1 B$ Q% V, A, }+ P
赞 收藏 评论12 发布时间:2015-11-27 13:04

举报

12个回答
Mandelbrot_Set 回答时间:2015-11-27 13:06:24
本帖最后由 Mandelbrot_Set 于 2015-11-27 13:09 编辑 ( N) L$ ]2 A$ m; w5 V  d, g
& W. L' U- h8 D6 X, ~
发出来咋成这模样了 1.JPG / N! a5 w: E/ w3 |: x
安臣 回答时间:2015-11-27 13:40:33
楼主知道这个东西吗?
4 Z2 n2 u0 ~5 L: L/ @" D
$ R* F/ J5 T- J( O0 [" X QQ图片20151127134059.png
Mandelbrot_Set 回答时间:2015-11-27 13:59:44
安臣 发表于 2015-11-27 13:40
. X6 y# N# L& v& }  K楼主知道这个东西吗?

' |; {7 Q, V9 y谢谢指点,测试下5 C) ~$ w7 m+ v( T* v  f+ h0 C
  1. ER_IROM1:080002FC
    ; k5 X- e8 V" G3 \
  2. ER_IROM1:080002FC ; =============== S U B R O U T I N E =======================================
    5 N, a6 O- h" l/ W! H; i
  3. ER_IROM1:080002FC4 p! b  a) g2 {3 L' T
  4. ER_IROM1:080002FC
    ( o0 _: k1 G0 I0 A& `: ^+ O1 |6 }! O
  5. ER_IROM1:080002FC ; PP_TETS(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, int, int, int, int)
    , I% O( |8 b; w" U0 Z7 t9 q) [
  6. ER_IROM1:080002FC                 EXPORT _Z7PP_TETSffffffffffffffffiiii
    ( M5 Y( N' V3 C/ p, ^9 O) g
  7. ER_IROM1:080002FC _Z7PP_TETSffffffffffffffffiiii
    - @' l5 {9 v7 d5 N
  8. ER_IROM1:080002FC                 PUSH            {R4,LR}
    * A! P8 S% o9 R! W9 J
  9. ER_IROM1:080002FE                 VPUSH           {D8}
    , w0 d" p5 n7 D+ J( Y
  10. ER_IROM1:08000302                 ADD             R0, R1; x: L" q# j! n' T: j5 w) I6 c! v5 Y
  11. ER_IROM1:08000304                 ADD             R0, R28 ]' ^" O0 X$ {' v8 @
  12. ER_IROM1:08000306                 ADD             R0, R33 X  V4 g  Z6 X
  13. ER_IROM1:08000308                 CBZ             R0, loc_80003824 {$ ^5 a; Y5 h6 y
  14. ER_IROM1:0800030A                 VADD.F32        S16, S0, S1) t. R6 d  z* r
  15. ER_IROM1:0800030E                 VMOV.F32        S0, S16
    2 }! @/ B* R, w+ F* s0 w* a; O
  16. ER_IROM1:08000312                 VADD.F32        S16, S0, S27 e) R  D' a  ]6 n" L6 o( q9 B
  17. ER_IROM1:08000316                 VMOV.F32        S0, S168 @& a7 ?# B* ]; N& m
  18. ER_IROM1:0800031A                 VADD.F32        S16, S0, S3: j+ e. E# p) R9 e. c
  19. ER_IROM1:0800031E                 VMOV.F32        S0, S16
    9 o) @! w  e9 s/ Z2 z
  20. ER_IROM1:08000322                 VADD.F32        S16, S0, S4
    2 L' x1 e: W& p0 Y+ S- J& |3 i
  21. ER_IROM1:08000326                 VMOV.F32        S0, S16
    0 m& u% l4 p5 E. t6 R
  22. ER_IROM1:0800032A                 VADD.F32        S16, S0, S5
    % g2 `8 o6 U& w8 w" d
  23. ER_IROM1:0800032E                 VMOV.F32        S0, S16
    ! e  K1 L- Y8 R$ z
  24. ER_IROM1:08000332                 VADD.F32        S16, S0, S6' z. q' P1 y. y- ^
  25. ER_IROM1:08000336                 VMOV.F32        S0, S16
    % V  ]6 }& i" r; ^# r8 S
  26. ER_IROM1:0800033A                 VADD.F32        S16, S0, S7- h) a) u+ R) J$ v, x% b
  27. ER_IROM1:0800033E                 VMOV.F32        S0, S16, d. Z2 x4 ?( e' Y8 A0 x
  28. ER_IROM1:08000342                 VADD.F32        S16, S0, S82 K" P3 Y: s4 K- j1 F' \/ n& C
  29. ER_IROM1:08000346                 VMOV.F32        S0, S16. J9 r; Z! G' D1 X7 F2 ]
  30. ER_IROM1:0800034A                 VADD.F32        S16, S0, S9
    0 _; e6 w! r+ z  i1 Z1 a+ T- x# k! X
  31. ER_IROM1:0800034E                 VMOV.F32        S0, S16
    , q# g, ?: b0 D1 f: s0 W
  32. ER_IROM1:08000352                 VADD.F32        S16, S0, S10
    5 H! h0 U9 ^# W
  33. ER_IROM1:08000356                 VMOV.F32        S0, S16
    $ l  Q. p5 B. e$ U
  34. ER_IROM1:0800035A                 VADD.F32        S16, S0, S111 y1 u, S2 L1 `8 v% {8 T
  35. ER_IROM1:0800035E                 VMOV.F32        S0, S16) i/ y+ j1 C0 d! j) \5 B
  36. ER_IROM1:08000362                 VADD.F32        S16, S0, S12
    0 P9 g! @4 B. b) Y) a
  37. ER_IROM1:08000366                 VMOV.F32        S0, S16
    ( ]7 m5 _! y1 k( u
  38. ER_IROM1:0800036A                 VADD.F32        S16, S0, S13
    - o: p3 {  b4 V% i& |$ s- R
  39. ER_IROM1:0800036E                 VMOV.F32        S0, S16
    ! U" `- a% s( I# [
  40. ER_IROM1:08000372                 VADD.F32        S16, S0, S140 `; j9 y# o; _1 f- k, p
  41. ER_IROM1:08000376                 VMOV.F32        S0, S16
    # ]# [7 U& e; @9 o7 F
  42. ER_IROM1:0800037A                 VADD.F32        S16, S0, S157 ]- t2 t* k1 F
  43. ER_IROM1:0800037E                 VMOV.F32        S0, S16; N, I0 V! Z. w4 v. _
  44. ER_IROM1:08000382
    & q! X! L/ V. U4 y
  45. ER_IROM1:08000382 loc_8000382                             ; CODE XREF: PP_TETS(float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,int,int,int,int)+Cj7 d% \6 X2 T! F/ Z
  46. ER_IROM1:08000382                 VPOP            {D8}
    0 Q: j# `4 p" p: e5 R& z8 s, j2 J& N7 b
  47. ER_IROM1:08000386                 POP             {R4,PC}3 M6 C. ~' ?- v8 _0 r1 q: |, T8 S
  48. ER_IROM1:08000386 ; End of function PP_TETS(float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,int,int,int,int)
复制代码

; @  ^2 }9 A# h9 y1 s
安臣 回答时间:2015-11-27 14:13:34
可以修改一下主题吗?  看蒙圈了
JackieLaura 回答时间:2015-11-27 15:50:32
表示看不懂
stmcu.org.png
qianfan 回答时间:2015-11-27 20:17:45
这是用啥工具反汇编的?
* h- p# ^' R4 p8 l; v2 gc代码中是怎么做到让s0就是S0寄存器的?貌似没打看懂啊。
Mandelbrot_Set 回答时间:2015-11-28 13:01:44
QianFan 发表于 2015-11-27 20:17! G- X% T! j3 w% n1 S1 `# U
这是用啥工具反汇编的?- \1 t2 [- ]; [/ A7 @% U6 H3 {% P4 V
c代码中是怎么做到让s0就是S0寄存器的?貌似没打看懂啊。 ...
8 K& n) S. |/ Z1 w) w7 l
我用的IDA6.6。; m$ M! p3 q, |- I
, v1 p- b% t9 x2 ?2 `
c代码s0与汇编s0寄存器本没有关系的。8 p" @/ j+ _$ f  _
只是一般C函数(实际上我用的是cpp),
& m* {2 d1 R  m/ ?使用fpu,第一个float参数以s0寄存器传参,
) m0 K: X& _2 @- F5 }第二个float用s1,以此类推。" r; E" y9 `: e/ l$ }9 i" K

0 l/ P$ {2 |' @  G2 E2 |& {! D返回值(float) 用s0  w6 g5 B1 ^" k8 C3 S
返回值(int)   用r0
: n8 A9 l+ l# J% v! e/ w
2 U, g: N: r9 [2 F1 ]  T9 @以上个人观点
- s  A3 v* V& P2 l9 j3 L6 [可以参考:
' P% v' C! }% G. ?5 T$ [Procedure Call Standard for the ARM® Architecture
% X" t& h: M( ^5 h" {* ~3 Mhttp://infocenter.arm.com/help/t ... /IHI0042E_aapcs.pdf
qianfan 回答时间:2015-11-29 14:13:11
Mandelbrot_Set 发表于 2015-11-28 13:01
$ L$ F3 b! B- y我用的IDA6.6。
% E8 J8 L6 t1 z1 d& {! K6 }' q0 B# ]  }: R* U, u, t# Z. f
c代码s0与汇编s0寄存器本没有关系的。
6 j  D7 y' v; S& J8 E% D( f" q
学习了。9 i  ^) q' _  J: }/ v2 P
第一个参数不是R0传递,一直到R3吗?4个往上的参数不是使用栈传递啊。没大搞懂。在看看那个链接。
qianfan 回答时间:2015-11-29 14:13:44
Mandelbrot_Set 发表于 2015-11-28 13:01
; C! U0 ^, Q' P2 T- v- g我用的IDA6.6。
" y+ u& k6 ^, ?
2 L1 W* {6 u  J3 A+ _5 Cc代码s0与汇编s0寄存器本没有关系的。

6 g4 p  s; t; I+ [1 g7 x; h5 O你是搞反汇编的吗?
Mandelbrot_Set 回答时间:2015-11-29 16:09:52
QianFan 发表于 2015-11-29 14:13% w; Y  S+ e2 [& g; f
学习了。* ~2 ?3 m9 f$ }7 ]* @6 w
第一个参数不是R0传递,一直到R3吗?4个往上的参数不是使用栈传递啊。没大搞懂。在看看那个链接 ...
第一个参数不是R0传递,一直到R3吗

' n. x$ g: f4 Q, x2 e一开始我也这么想的。但是我隐隐的感觉到这种做法效率不好。8 k) s4 x8 q# ?/ t2 q
于是具体看了下函数的实现,怎么优化的。。
: j$ o% x- ^6 l0 p, v; _0 ?4 c另外,我是搞正向开发的。
/ P, v+ M2 i0 h* x* n+ }# R  _0 k$ I1 a& ^7 j$ d7 R( p
Mandelbrot_Set 回答时间:2015-11-29 16:12:34
QianFan 发表于 2015-11-29 14:13
7 N9 V/ W! @" p; O! y" g' h+ l你是搞反汇编的吗?
! t' G/ X0 Q4 n; _
何以见得
qianfan 回答时间:2015-11-29 16:17:08
Mandelbrot_Set 发表于 2015-11-29 16:12
3 t! J6 X9 i4 C1 }何以见得
1 H( D5 T+ F( Z
看你用IDA,动不动就反汇编。。。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版