c和汇编语言混合的限制符号含义表,C与汇编语言混合2011.ppt

C与汇编语言混合2011

C与汇编语言混合编程 1、 ATPCS介绍 2 、内嵌汇编 3 、C和ARM汇编程序间相互调用 1、ATPCS介绍 ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。 寄存器的使用规则 数据栈的使用规则 根据堆栈指针指向位置的不同 和增长方向的不同可以分为以下4种数据栈 : FD (Full Descending) 满递减 ED (Empty Descending)空递减 FA (Full Ascending) 满递增 EA (Empty Ascending) 空递增 ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。 2、内嵌汇编 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。 内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。 内嵌汇编指令的语法格式 _ _asm(“指令[;指令]”); ARM C汇编器使用关键字“_ _asm"。如果有多条汇编指令需要嵌入,可以用“{}”将它们归为一条语句。如: _ _asm { 指令[;指令] … [指令] } 需要特别注意的是_ _asm是两个下划线。 内嵌的汇编指令的特点 操作数可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作 。 内嵌的汇编指令中使用物理寄存器有一些限制。 常量前的符号“#”可以省略 只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。 不支持汇编语言中用于内存分配的伪操作。 指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。 内嵌汇编器与armasm汇编器的区别 内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址; 不支持LDR Rn,= expression伪指令,而使用MOV Rn, expression指令向寄存器赋值; 不支持标号表达式; 不支持ADR和ADRL伪指令; 不支持BX和BLX指令; 不可以向PC赋值; 使用0x前缀替代“&”表示十六进制数。 C和ARM汇编程序间相互调用 在C和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-Thumb Procedure Call Standard)规则。 C和汇编之间的相互调用可以从以下这三方面来介绍: 参数的传递规则 参数个数固定的子程序参数传递规则 第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。 参数个数可变的子程序参数传递规则 当参数不超过4个时,可以使用寄存器R0-R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 子程序结果返回规则 结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。 汇编程序访问全局C变量 汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。 1、通过使用IMPORT关键词引入全局变量, 2、利用LDR和STR指令根据全局变量的地址可以访问它们。 对于不同类型的变量,需要采用不同选项的LDR和STR指令,如下所示: 在C语言程序中调用汇编程序 为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。 1、在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。 2、同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。 在汇编程序中调用C语言程序 为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。 * ARM工程的各种文件之间的关系 ARM程序框架 ARM体系结构支持C/C++以及与汇编语言的混合编程;汇编语言与C/C++的混合编程通常有以下几种方式:

你可能感兴趣的:(c和汇编语言混合的限制符号含义表,C与汇编语言混合2011.ppt)