全部博文(1493)
分类:
2012-08-16 08:57:05
ATPCS(ARM –Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的c语言程序和汇编程序能相互调用。规则包括有子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。
R0-R3为函数调用的参数寄存器,用来存放前4个函数参数并存放返回值。在函数内如果将这些寄存器用作其他用途,将破坏其值。R4-R8为通用变量寄存器。R9为平台寄存器,不同的平台对该寄存器的定义不同。R10通用变量寄存器。在使用堆栈边界检测的情况下,r10保存堆栈边界地址。R11 通用变量寄存器。R12为临时过渡寄存器,函数调用时会破坏其值。R13为堆栈指针。R14为链接寄存器。R15为程序计数器。
ATPCS规定数据栈为FD(FULL descending)满递减类型,且对数据栈的操作时8字节对齐的。前4个整数参数,通过寄存器R0-R3来传递,其他的通过数据栈来传递。子程序返回为一个32位整数时,可以通过R0返回,64位的话,可以通过R0和R1。
在c程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。Armcc和armcpp内嵌汇编器支持完整的arm指令集;内嵌的汇编指令包括大部分的arm指令和thumb指令,但是不能直接引用c的变量定义,数据交换必须通过ATPCS进行。嵌入汇编在形式上表现为独立定义的函数体。
__asm(“指令[;指令]”);
__asm
{
指令[;指令]
…
}
@操作数可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作 。
@内嵌的汇编指令中使用物理寄存器有一些限制。
@常量前的符号“#”可以省略
@只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。
@不支持汇编语言中用于内存分配的伪操作。
@指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。
@内嵌汇编注释可使用C风格的注释。
@内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址;
@不支持LDR Rn,= expression伪指令,而使用MOV Rn, expression指令向寄存器赋值;
@不支持标号表达式;
@不支持ADR和ADRL伪指令;
@不支持BX和BLX指令;
@不可以向PC赋值;
@使用0x前缀替代“&”表示十六进制数。
@必须小心使用物理寄存器,如R0~R3,LR和PC。
@不要使用寄存器寻址变量。
@使用内嵌汇编时,编译器自己会保存和恢复它可能用到的寄存器,用户无须保存和恢复寄存器。
@LDM和STM指令的寄存器列表只允许物理寄存器。
@汇编语言用“,”作为操作数分隔符
为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。
为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。