ARM Agenda ARM编译器的优化 ■CC++和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论 103v04 C/C++ Compiler Hints & Tips
11 103v04 C/C++ Compiler Hints & Tips TM 11 Agenda ARM编译器的优化 ◼ C/C++和汇编混合模式编程 使用ARM编译器编码 局部和全局数据讨论
ARM C和汇编的混合编程 CC++和汇编能很容易的混合: ■可实现在c中无法实现的处理器功能 使用新的或不支持的指令 产生更高效的代码 ■直接链接变量和程序 ■确定符合程序调用规范 输入/输出相关的符号 编译器也可包含内嵌汇编 大多数arm指令集都可实现 寄存器操作数可支持任意的c/c++的表达式 内嵌汇编代码可由编译器的优化器来传递 103v04 C/C++ Compiler Hints & Tips
12 103v04 C/C++ Compiler Hints & Tips TM 12 C和汇编的混合编程 ◼ C/C++ 和汇编能很容易的混合: ◼ 可实现在c中无法实现的处理器功能 ◼ 使用新的或不支持的指令 ◼ 产生更高效的代码 ◼ 直接链接变量和程序 ◼ 确定符合程序调用规范 ◼ 输入/输出相关的符号 ◼ 编译器也可包含内嵌汇编 ◼ 大多数arm指令集都可实现 ◼ 寄存器操作数可支持任意的c/c++的表达式 ◼ 内嵌汇编代码可由编译器的优化器来传递
ARM ATPCS( arm/thumb程序调用规范) Register ro 编译器使用一套规则的来设置寄存器的用法 r1 ARM-Thumb procedure call standard or 作为函数传递的参数值 r2 ATPCS(or APCS) r3 CPSR标志位可被函数调用所破坏 任何和编译过的代码交互工作的汇编码在接口层必 须满足 ATPCS的规范 6 寄存器变量 r7 必须保护 8 x9/9-如果RWP选项有效,作为栈的基地址 x10/s1-如果软件堆栈检查有效,作为栈的限制值 r11 Scratch register x12·子程序内部调用的可改写的寄存器 (corruptible Stack Pointer r13/sp Link Register I14/1x可作为临时的一个值栈一样来使用 Program Counter r15/pe-程序计数器 103v04 C/C++ Compiler Hints & Tips
13 103v04 C/C++ Compiler Hints & Tips TM 13 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 (corruptible) Stack Pointer Link Register Program Counter 编译器使用一套规则的来设置寄存器的用法 ARM-Thumb Procedure Call Standard or ATPCS (or APCS) CPSR 标志位可被函数调用所破坏 任何和编译过的代码交互工作的汇编码在接口层必 须满足ATPCS的规范 Register - 如果 RWPI选项有效,作为栈的基地址 - 如果软件堆栈检查有效,作为栈的限制值 - 可作为临时的一个值栈一样来使用 - 子程序内部调用的可改写的寄存器 - 程序计数器
ARM 在C程序中调用汇编 在汇编程序中用 export name来定义 在C程序中直接调用,用 EXTERN声明 正常链接 extern void mystrcopy(char *d, const char *s)i AREA StringCopy, CODE, READONLY int main(void) EXPORT mystrcopy const char *src Source mystrcopy char dest[10]; LDRB [2 [r1],#1 STRB r2, [ro], #1 mystrcopy(dest, src)i CALL BNE mys trcopy Mov pc,lr END 这里所有的参数都是可以用寄存器来传递的,所以不需要在汇编程序中使用 PUSH/POP来保护 103v04 C/C++ Compiler Hints & Tips
14 103v04 C/C++ Compiler Hints & Tips TM 14 在C程序中调用汇编 ◼ 在汇编程序中用export name来定义 ◼ 在C程序中直接调用,用EXTERN声明 ◼ 正常链接 extern void mystrcopy(char *d, const char *s); int main(void) { const char *src = “Source”; char dest[10]; ... 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 这里所有的参数都是可以用寄存器来传递的,所以不需要在汇编程序中使用 PUSH/POP来保护 CALL