ARM混合编程:C与汇编的交互指南

需积分: 17 10 下载量 69 浏览量 更新于2024-07-16 收藏 549KB PDF 举报
"ARM汇编与C语言混合编程讲义.pdf" ARM汇编与C语言混合编程是嵌入式系统开发中的常见实践,这允许开发者利用C语言的高抽象层次和汇编语言的高效性能。在这样的编程模式下,遵循ATPCS(ARM/Thumb过程调用标准)是非常重要的,它规定了不同子程序之间调用的规范,包括寄存器的使用、堆栈管理和参数传递。 1. **寄存器的使用规则**: - 参数传递:寄存器r0-r3作为参数传递的主要手段,超过4个参数则使用堆栈。r0-r3分别对应A1-A4。 - 局部变量:r4-r11用来保存子程序内部的局部变量,称为V1-V8,调用前后需注意保存和恢复。 - 堆栈指针:r12用作IP,用于子程序返回时出栈;r13(SP)作为堆栈指针。 - 链接寄存器:r14(LR)保存子程序返回地址。 - 程序计数器:r15(PC)用于指示程序执行的下一条指令地址。 2. **堆栈的使用规则**: - 堆栈类型:遵循满递减(FD)方式,堆栈自高地址向低地址扩展,SP指向栈顶。 3. **参数传递规则**: - 整数参数:前4个通过r0-r3传递,额外参数使用堆栈。 - 浮点参数:使用FP寄存器传递,根据需要选择一组连续的FP寄存器。 - 返回值:32位整数结果通过r0返回,64位通过r0和r1,浮点数通过F0、D0或S0返回。 4. **汇编程序调用C程序**: - 汇编程序必须遵循ATPCS,确保调用C函数时参数正确传递。 - 使用`IMPORT`伪指令声明将要调用的C函数,表明其在外部定义。 - 调用C函数使用`BL`(Branch and Link)指令,将下一条指令地址保存到LR寄存器,然后跳转至函数地址执行。 例如,在C代码中定义了一个`add`函数,其在汇编中调用的示例如下: ```assembly AREA |.text|, CODE, READONLY ENTRY ; 声明C函数 IMPORT add ; 函数调用准备,假设r0和r1已存入参数 BL add ; 调用add函数,r0和r1作为参数,返回值保存在r0 ; 其他汇编代码... END ``` 这个例子展示了如何在汇编程序中调用名为`add`的C函数,将参数存储在r0和r1中,然后通过`BL`指令进行调用,结果将返回到r0寄存器。 混合编程时,理解并遵循ATPCS标准至关重要,因为它保证了不同语言之间的兼容性和调用一致性,使得程序能够正确地传递参数、保存状态并返回结果。