ARM ARM 编程技巧 TH E AR C H T E C UR E F O R THE D G IT A L W。RLD
1 T H E A R C H I T E C T U R E F O R TTM H E D I G I T A L W O R L D ARM 编程技巧
ARM Agenda ■ARM编译器优化 CC++和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论 103v04 C/C++ Compiler Hints & Tips
2 103v04 C/C++ Compiler Hints & Tips TM 2 Agenda ◼ ARM 编译器优化 C/C++和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论
ARM 优化级别 使用的编译器优化级别是可选择的 O0---DEBUG 关闭大多数优化 最好的调试信息,最少的优化 O1--DEBUGREL 多数优化选项许可 给一个满意的调试,好的代码密度 -O2---RELEASE(default) 完全的优化 ■有限的调试信息,最好的代码密度 ■为代码大小或运行速度的优化,可选择: Ospace(默认的)或- Time 使用-g选像可包含源码级调试信息 103v04 C/C++ Compiler Hints & Tips
3 103v04 C/C++ Compiler Hints & Tips TM 3 优化级别 ◼ 使用的编译器优化级别是可选择的 -O0---DEBUG ◼ 关闭大多数优化. ◼ 最好的调试信息,最少的优化 -O1---DEBUGREL ◼ 多数优化选项许可 ◼ 给一个满意的调试,好的代码密度 -O2---RELEASE (default) ◼ 完全的优化 ◼ 有限的调试信息,最好的代码密度 ◼ 为代码大小或运行速度的优化,可选择:-Ospace (默认的)或-Otime. ◼ 使用-g 选像可包含源码级调试信息
ARM 自动优化 ■ADs编译器在所有级别中执行一些简单的优化 ■e.-o0,-1,-02 下面是一个例子:即使用-O0,多余的表达式也被清除了 ■ ATPCS标准中子程序结果返回规则 结果为32位整数,RO返回 结果为64位整数,RO,RI返回 ■位数更多时,用内存来传递 int f(int *p) armcc -C -O0 Mov rl, ro return (*p==*p) MoV ro,#1 1 注意:在这种情况下,可使用C的关键字 volatile强制使用这些变量 103v04 C/C++ Compiler Hints & Tips
4 103v04 C/C++ Compiler Hints & Tips TM 4 ◼ ADS 编译器在所有级别中执行一些简单的优化 ◼ i.e. -O0, -O1, -O2 ◼ 下面是一个例子:即使用-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 强制使用这些变量
ARM 使用“ volatile” int f(int *p) return (*p ★ ancc·c MOV r0,#1 Mov pc,lr LDR rl [ro]] int f(volatile int *p) LDR ro,[ro ancc·c CMP x1,x0 return (*p==*p) MOVNE ro, #O MOVEQ r0,#1 pc,I 这个代码用的编译级别是:-02 103v04 C/C++ Compiler Hints & Tips
5 103v04 C/C++ Compiler Hints & Tips TM 5 使用 “volatile” int f(volatile int *p) { return (*p = = *p); } armcc -c f LDR r1,[r0] LDR r0,[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