确定符合程序调用规范.ppt
《确定符合程序调用规范.ppt》由会员分享,可在线阅读,更多相关《确定符合程序调用规范.ppt(41页珍藏版)》请在三一文库上搜索。
1、ARM 编程技巧,Agenda,ARM 编译器优化 C/C+和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论,优化级别,使用的编译器优化级别是可选择的 -O0-DEBUG 关闭大多数优化. 最好的调试信息,最少的优化 -O1-DEBUGREL 多数优化选项许可 给一个满意的调试,好的代码密度 -O2-RELEASE (default) 完全的优化 有限的调试信息,最好的代码密度 为代码大小或运行速度的优化,可选择: -Ospace (默认的)或 -Otime. 使用-g 选像可包含源码级调试信息,ADS 编译器在所有级别中执行一些简单的优化 i.e. -O0, -O1, -O2 下
2、面是一个例子:即使用-O0,多余的表达式也被清除了: ATPCS标准中子程序结果返回规则 结果为32位整数,R0返回 结果为64位整数,R0,R1返回 位数更多时,用内存来传递 ,自动优化,int f(int *p) return (*p = = *p); ,armcc -c -O0,f MOV r1, r0 MOV r0, #1 MOV pc, lr,注意:在这种情况下,可使用C的关键字volatile 强制使用这些变量,使用 “volatile”,int f(volatile int *p) return (*p = = *p); ,armcc -c,f LDR r1,r0 LDR r0,
3、r0 CMP r1,r0 MOVNE r0,#0 MOVEQ r0,#1 MOV pc,lr,int f(int *p) return (*p = = *p); ,f MOV r0,#1 MOV pc,lr,armcc -c,这个代码用的编译级别是:-o2,下面是一个冗余代码清除的例子,他只用了-o1的优化选项:,冗余代码的清除,int dummy() int a=10, b=20; int c; c=a+b; return 0; ,armcc -c -O1,dummy MOV r0, #0 MOV pc, lr,指令编排,指令编排在高级优化选项中是有效的(-O1, -O2). 指令的重新编排
4、是为了使要运行的代码更适合对应的核 为arm9和以后的处理器提高吞吐量(一般可达到4%),并防止互锁(interlock) 选择处理器可决定使用的运算法则,在默认情况下,使用针对ARM9的优化方案 (对ARM7的运行没有影响)http:/www.gangban- 例如: int f(int *p, int x) return *p + x * 3; 没用指令编排 (-O0) 使用指令编排 (-O1,-O2) ADD r1,r1,r1,LSL #1 LDR r0,r0,#0 LDR r0,r0,#0 ADD r1,r1,r1,LSL #1 ADD r0,r0,r1 ; interlock on
5、ARM9 ADD r0,r0,r1 MOV pc,lr MOV pc,lr,armcc cpu arm7tdmi,armcc cpu arm9tdmi,Tail-call Optimization,嵌套优化可避免在函数级里的不必要的返回 在可能的情况下BL 译码成B 在高级优化里有效(-O1, -O2).,int main() int x = f(); : ,int f() int y = g(); return y; ,int g() return 10; ,嵌套优化,内嵌函数(inline),内嵌可通过删除子函数调用的开销来提高性能 这个 inline 关键字显示哪个函数将被内嵌 在高级优
6、化选项中,ADS 1.2 编译器默认自动内嵌 -Oautoinline (default -O2) -Ono_autoline (default for -O0,-O1) 哪个函数是否被内嵌取决于: 他们是否被 _inline标示 优化的级别 -Otime / -Ospace 函数被调用的次数 如果函数在别的模块中不被调用,一个好的建议是用static标识函数,否则,编译器将在内嵌译码里把该函数编译乘非内嵌的 加代码的长度 使调试信息更复杂,Example.,Inline example,内嵌例子,Agenda,ARM编译器的优化 C/C+和汇编混合模式编程 使用ARM编译器编码 局部和全局数
7、据讨论,C和汇编的混合编程,C/C+ 和汇编能很容易的混合: 可实现在c中无法实现的处理器功能 使用新的或不支持的指令 产生更高效的代码 直接链接变量和程序 确定符合程序调用规范 输入/输出相关的符号 编译器也可包含内嵌汇编 大多数arm指令集都可实现 寄存器操作数可支持任意的c/c+的表达式 内嵌汇编代码可由编译器的优化器来传递,ATPCS(arm/thumb程序调用规范),r8,r9/sb,r10/sl,r11,r12,r13/sp,r14/lr,r15/pc,r0,r1,r2,r3,r4,r5,r6,r7,寄存器变量 必须保护,作为函数传递的参数值,Scratch register (c
8、orruptible),Stack Pointer Link Register Program Counter,编译器使用一套规则的来设置寄存器的用法 ARM-Thumb Procedure Call Standard or ATPCS (or APCS) CPSR 标志位可被函数调用所破坏 任何和编译过的代码交互工作的汇编码在接口层必 须满足ATPCS的规范,Register,- 如果 RWPI选项有效,作为栈的基地址,- 如果软件堆栈检查有效,作为栈的限制值,- 可作为临时的一个值栈一样来使用,- 子程序内部调用的可改写的寄存器,- 程序计数器,在C程序中调用汇编,在汇编程序中用expor
9、t name来定义 在C程序中直接调用,用EXTERN声明 正常链接,extern void mystrcopy(char *d, const char *s); int main(void) const char *src = “Source”; char dest10; . mystrcopy(dest, src); . ,AREA StringCopy, CODE, READONLY EXPORT mystrcopy mystrcopy LDRB r2, r1, #1 STRB r2, r0, #1 CMP r2, #0 BNE mystrcopy MOV pc, lr END,这里所有
10、的参数都是可以用寄存器来传递的,所以不需要在汇编程序中使用PUSH/POP来保护,CALL,内嵌汇编,允许使用一些不能由编译器自动生成的指令: MSR / MRS 新的指令 协处理器指令 通常在关联的内嵌函数中使用 使用C变量代替寄存器 不是一个真正的汇编文件 通过优化器实现 ADS FAQ 入口 “Using the Inline Assembler”,#define Q_Flag 0x08000000 / Bit 27 _inline void Clear_Q_flag (void) int temp; _asm MRS temp, CPSR BIC temp, temp, #Q_Flag
11、 MSR CPSR_f, temp _inline int mult16(short a, short b, int c) int temp; _asm SMLABB temp,a,b,c return temp; ,Agenda,ARM编译器的优化 C/C+和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论,参数传递,开始四个字大小的参数直接使用寄存器的R0-R3来传递(快速且高效的) 更多的信息可参看ATPCS 如果需要更多的参数,将使用堆栈。(需要额外的指令和慢速的存储器操作) 所以通常限制参数的个数,使它为4或更少。 如果不可避免,把常用的参数前4个放在R0-R3中,Exam
12、ple.,Parameter Passing (4 parameters) int func1(int a, int b, int c, int d) return a+b+c+d; int caller1(void) return func1(1,2,3,4); ,func1 0x000000 : ADD r0,r0,r1 0x000004 : ADD r0,r0,r2 0x000008 : ADD r0,r0,r3 0x00000c : MOV pc,lr caller1 0x000014 : MOV r3,#4 0x000018 : MOV r2,#3 0x00001c : MOV r1
13、,#2 0x000020 : MOV r0,#1 0x000024 : B func1,Parameter Passing (4 parameters),Parameter Passing (6 parameters),Parameter Passing (6 parameters),func2 0x000000 : STR lr, sp,#-4! 0x000004 : ADD r0,r0,r1 0x000008 : ADD r0,r0,r2 0x00000C : ADD r0,r0,r3 0x000010 : LDMIB sp,r12,r14 0x000014 : ADD r0,r0,r12
14、 0x000018 : ADD r0,r0,r14 0x00001C : LDR pc,sp,#4 caller2 0x000020 : STMFD sp!,r2,r3,lr 0x000024 : MOV r3,#6 0x000028 : MOV r2,#5 0x00002C : STMIA sp,r2,r3 0x000030 : MOV r3,#4 0x000034 : MOV r2,#3 0x000038 : MOV r1,#2 0x00003C : MOV r0,#1 0x000040 : BL func2 0x000044 : LDMFD sp!,r2,r3,pc,int func2(
15、int a,int b,intc, int,d,int e,int f) return a+b+c+d+e+f; int caller2(void) return func1(1,2,3,4,5,6); ,This code is compiled with “-O2 -Ono_autoinline”,循环终止,在for(), while() dowhile()的循环中,用减到0代替加到某个值。 比如,用下面的代替 : for (loop = 1; loop = total; loop+) /(ADD,CMP) 代替为: for (loop = total; loop != 0; loop-)
16、 /(SUBS) 尽量减少循环的次数 代码小,且使用更少的寄存器,Example.,Loop Termination,Count up int fact1(int limit) int i; int fact = 1; for (i = 1; i = limit; i+) fact = fact * i; return fact; ,Count down int fact2(int limit) int i; int fact = 1; for (i = limit; i != 0; i-) fact = fact * i; return fact; ,fact2 0x000000 : MOV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 确定 符合 程序 调用 规范
链接地址:https://www.31doc.com/p-3487515.html