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

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

[复制链接]
Mandelbrot_Set 发布时间:2015-11-27 13:04
6.1.2.3  Parameter passing
There is one VFP co-processor register class using registers s0-s15 (d0-d7) for passing arguments.   
The following co-processor rules are defined for the VFP:
A.2.vfp  The floating point argument registers are marked as unallocated.
B.3.vfp  Nothing to do.
C.1.vfp  If the argument is a VFP CPRC and there are sufficient consecutive VFP registers of the appropriate
type unallocated then the argument is allocated to the lowest-numbered sequence of such registers.
C.2.vfp  If the argument is a VFP CPRC then any VFP registers that are unallocated are marked as
unavailable.  The NSAA is adjusted upwards until it is correctly aligned for the argument and the
argument is copied to the stack at the adjusted NSAA.  The NSAA is further incremented by the size
of the argument.  The argument has now been allocated.
Note that the rules require the ‘back-filling’ of unused co-processor registers that are skipped by the alignment
constraints of earlier

测试一下:
  1. float PP_TETS
  2.         (
  3.         float s0,
  4.         float s1,
  5.         float s2,
  6.         float s3,
  7.         float s4,
  8.         float s5,
  9.         float s6,
  10.         float s7,
  11.         float s8,                        
  12.         float s9,
  13.         float s10,
  14.         float s11,
  15.         float s12,
  16.         float s13,
  17.         float s14,
  18.         float s15,
  19.         int r0,
  20.         int r1,
  21.         int r2,
  22.         int r3
  23.         )
  24. {
  25.          r0+=r1;
  26.          r0+=r2;
  27.          r0+=r3;
  28.          if(r0)
  29.          {
  30.                 s0+=s1;
  31.                 s0+=s2;
  32.                 s0+=s3;
  33.                 s0+=s4;
  34.                 s0+=s5;
  35.                 s0+=s6;
  36.                 s0+=s7;
  37.                 s0+=s8;
  38.                 s0+=s9;
  39.                 s0+=s10;
  40.                 s0+=s11;
  41.                 s0+=s12;
  42.                 s0+=s13;
  43.                 s0+=s14;
  44.                 s0+=s15;
  45.          }
  46.          return s0;
  47. }
复制代码


编译结果:
  1. ER_IROM1:080002FC
  2. ER_IROM1:080002FC ; =============== S U B R O U T I N E =======================================
  3. ER_IROM1:080002FC
  4. ER_IROM1:080002FC
  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)
  6. ER_IROM1:080002FC                 EXPORT _Z7PP_TETSffffffffffffffffiiii
  7. ER_IROM1:080002FC _Z7PP_TETSffffffffffffffffiiii
  8. ER_IROM1:080002FC                 PUSH            {R4,LR}
  9. ER_IROM1:080002FE                 VPUSH           {D8}
  10. ER_IROM1:08000302                 ADD             R0, R1
  11. ER_IROM1:08000304                 ADD             R0, R2
  12. ER_IROM1:08000306                 ADD             R0, R3
  13. ER_IROM1:08000308                 CBZ             R0, loc_8000382
  14. ER_IROM1:0800030A                 VADD.F32        S16, S0, S1
  15. ER_IROM1:0800030E                 VMOV.F32        S0, S16
  16. ER_IROM1:08000312                 VADD.F32        S16, S0, S2
  17. ER_IROM1:08000316                 VMOV.F32        S0, S16
  18. ER_IROM1:0800031A                 VADD.F32        S16, S0, S3
  19. ER_IROM1:0800031E                 VMOV.F32        S0, S16
  20. ER_IROM1:08000322                 VADD.F32        S16, S0, S4
  21. ER_IROM1:08000326                 VMOV.F32        S0, S16
  22. ER_IROM1:0800032A                 VADD.F32        S16, S0, S5
  23. ER_IROM1:0800032E                 VMOV.F32        S0, S16
  24. ER_IROM1:08000332                 VADD.F32        S16, S0, S6
  25. ER_IROM1:08000336                 VMOV.F32        S0, S16
  26. ER_IROM1:0800033A                 VADD.F32        S16, S0, S7
  27. ER_IROM1:0800033E                 VMOV.F32        S0, S16
  28. ER_IROM1:08000342                 VADD.F32        S16, S0, S8
  29. ER_IROM1:08000346                 VMOV.F32        S0, S16
  30. ER_IROM1:0800034A                 VADD.F32        S16, S0, S9
  31. ER_IROM1:0800034E                 VMOV.F32        S0, S16
  32. ER_IROM1:08000352                 VADD.F32        S16, S0, S10
  33. ER_IROM1:08000356                 VMOV.F32        S0, S16
  34. ER_IROM1:0800035A                 VADD.F32        S16, S0, S11
  35. ER_IROM1:0800035E                 VMOV.F32        S0, S16
  36. ER_IROM1:08000362                 VADD.F32        S16, S0, S12
  37. ER_IROM1:08000366                 VMOV.F32        S0, S16
  38. ER_IROM1:0800036A                 VADD.F32        S16, S0, S13
  39. ER_IROM1:0800036E                 VMOV.F32        S0, S16
  40. ER_IROM1:08000372                 VADD.F32        S16, S0, S14
  41. ER_IROM1:08000376                 VMOV.F32        S0, S16
  42. ER_IROM1:0800037A                 VADD.F32        S16, S0, S15
  43. ER_IROM1:0800037E                 VMOV.F32        S0, S16
  44. ER_IROM1:08000382
  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
  46. ER_IROM1:08000382                 VPOP            {D8}
  47. ER_IROM1:08000386                 POP             {R4,PC}
  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)
复制代码





THE END ...

收藏 评论12 发布时间:2015-11-27 13:04

举报

12个回答
Mandelbrot_Set 回答时间:2015-11-27 13:06:24
本帖最后由 Mandelbrot_Set 于 2015-11-27 13:09 编辑

发出来咋成这模样了 1.JPG
安臣 回答时间:2015-11-27 13:40:33
楼主知道这个东西吗?

QQ图片20151127134059.png
Mandelbrot_Set 回答时间:2015-11-27 13:59:44
安臣 发表于 2015-11-27 13:40
楼主知道这个东西吗?

谢谢指点,测试下
  1. ER_IROM1:080002FC
  2. ER_IROM1:080002FC ; =============== S U B R O U T I N E =======================================
  3. ER_IROM1:080002FC
  4. ER_IROM1:080002FC
  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)
  6. ER_IROM1:080002FC                 EXPORT _Z7PP_TETSffffffffffffffffiiii
  7. ER_IROM1:080002FC _Z7PP_TETSffffffffffffffffiiii
  8. ER_IROM1:080002FC                 PUSH            {R4,LR}
  9. ER_IROM1:080002FE                 VPUSH           {D8}
  10. ER_IROM1:08000302                 ADD             R0, R1
  11. ER_IROM1:08000304                 ADD             R0, R2
  12. ER_IROM1:08000306                 ADD             R0, R3
  13. ER_IROM1:08000308                 CBZ             R0, loc_8000382
  14. ER_IROM1:0800030A                 VADD.F32        S16, S0, S1
  15. ER_IROM1:0800030E                 VMOV.F32        S0, S16
  16. ER_IROM1:08000312                 VADD.F32        S16, S0, S2
  17. ER_IROM1:08000316                 VMOV.F32        S0, S16
  18. ER_IROM1:0800031A                 VADD.F32        S16, S0, S3
  19. ER_IROM1:0800031E                 VMOV.F32        S0, S16
  20. ER_IROM1:08000322                 VADD.F32        S16, S0, S4
  21. ER_IROM1:08000326                 VMOV.F32        S0, S16
  22. ER_IROM1:0800032A                 VADD.F32        S16, S0, S5
  23. ER_IROM1:0800032E                 VMOV.F32        S0, S16
  24. ER_IROM1:08000332                 VADD.F32        S16, S0, S6
  25. ER_IROM1:08000336                 VMOV.F32        S0, S16
  26. ER_IROM1:0800033A                 VADD.F32        S16, S0, S7
  27. ER_IROM1:0800033E                 VMOV.F32        S0, S16
  28. ER_IROM1:08000342                 VADD.F32        S16, S0, S8
  29. ER_IROM1:08000346                 VMOV.F32        S0, S16
  30. ER_IROM1:0800034A                 VADD.F32        S16, S0, S9
  31. ER_IROM1:0800034E                 VMOV.F32        S0, S16
  32. ER_IROM1:08000352                 VADD.F32        S16, S0, S10
  33. ER_IROM1:08000356                 VMOV.F32        S0, S16
  34. ER_IROM1:0800035A                 VADD.F32        S16, S0, S11
  35. ER_IROM1:0800035E                 VMOV.F32        S0, S16
  36. ER_IROM1:08000362                 VADD.F32        S16, S0, S12
  37. ER_IROM1:08000366                 VMOV.F32        S0, S16
  38. ER_IROM1:0800036A                 VADD.F32        S16, S0, S13
  39. ER_IROM1:0800036E                 VMOV.F32        S0, S16
  40. ER_IROM1:08000372                 VADD.F32        S16, S0, S14
  41. ER_IROM1:08000376                 VMOV.F32        S0, S16
  42. ER_IROM1:0800037A                 VADD.F32        S16, S0, S15
  43. ER_IROM1:0800037E                 VMOV.F32        S0, S16
  44. ER_IROM1:08000382
  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
  46. ER_IROM1:08000382                 VPOP            {D8}
  47. ER_IROM1:08000386                 POP             {R4,PC}
  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)
复制代码

安臣 回答时间:2015-11-27 14:13:34
可以修改一下主题吗?  看蒙圈了
JackieLaura 回答时间:2015-11-27 15:50:32
表示看不懂
stmcu.org.png
qianfan 回答时间:2015-11-27 20:17:45
这是用啥工具反汇编的?
c代码中是怎么做到让s0就是S0寄存器的?貌似没打看懂啊。
Mandelbrot_Set 回答时间:2015-11-28 13:01:44
QianFan 发表于 2015-11-27 20:17
这是用啥工具反汇编的?
c代码中是怎么做到让s0就是S0寄存器的?貌似没打看懂啊。 ...

我用的IDA6.6。

c代码s0与汇编s0寄存器本没有关系的。
只是一般C函数(实际上我用的是cpp),
使用fpu,第一个float参数以s0寄存器传参,
第二个float用s1,以此类推。

返回值(float) 用s0
返回值(int)   用r0

以上个人观点
可以参考:
Procedure Call Standard for the ARM® Architecture
http://infocenter.arm.com/help/t ... /IHI0042E_aapcs.pdf
qianfan 回答时间:2015-11-29 14:13:11
Mandelbrot_Set 发表于 2015-11-28 13:01
我用的IDA6.6。

c代码s0与汇编s0寄存器本没有关系的。

学习了。
第一个参数不是R0传递,一直到R3吗?4个往上的参数不是使用栈传递啊。没大搞懂。在看看那个链接。
qianfan 回答时间:2015-11-29 14:13:44
Mandelbrot_Set 发表于 2015-11-28 13:01
我用的IDA6.6。

c代码s0与汇编s0寄存器本没有关系的。

你是搞反汇编的吗?
Mandelbrot_Set 回答时间:2015-11-29 16:09:52
QianFan 发表于 2015-11-29 14:13
学习了。
第一个参数不是R0传递,一直到R3吗?4个往上的参数不是使用栈传递啊。没大搞懂。在看看那个链接 ...
第一个参数不是R0传递,一直到R3吗

一开始我也这么想的。但是我隐隐的感觉到这种做法效率不好。
于是具体看了下函数的实现,怎么优化的。。
另外,我是搞正向开发的。

Mandelbrot_Set 回答时间:2015-11-29 16:12:34
QianFan 发表于 2015-11-29 14:13
你是搞反汇编的吗?

何以见得
qianfan 回答时间:2015-11-29 16:17:08

看你用IDA,动不动就反汇编。。。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版