Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1674851
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类:

2012-08-16 08:57:05

原文地址:c与汇编混合编程 作者:犀利哥的故事

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位的话,可以通过R0R1

c程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。Armccarmcpp内嵌汇编器支持完整的arm指令集;内嵌的汇编指令包括大部分的arm指令和thumb指令,但是不能直接引用c的变量定义,数据交换必须通过ATPCS进行。嵌入汇编在形式上表现为独立定义的函数体。

__asm(“指令[;指令]”)

__asm

{

   指令[;指令]

        

}

@操作数可以是寄存器、常量或C表达式。它们可以是charshort或者int类型,而且是作为无符号数进行操作

@内嵌的汇编指令中使用物理寄存器有一些限制。

@常量前的符号“#”可以省略

@只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。  

@不支持汇编语言中用于内存分配的伪操作。

@指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。  

@内嵌汇编注释可使用C风格的注释。

@内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址;

@不支持LDR Rn= expression伪指令,而使用MOV Rn expression指令向寄存器赋值;

@不支持标号表达式;

@不支持ADRADRL伪指令;

@不支持BXBLX指令;

@不可以向PC赋值;

@使用0x前缀替代表示十六进制数。  

@必须小心使用物理寄存器,如R0~R3LRPC

@不要使用寄存器寻址变量。

@使用内嵌汇编时,编译器自己会保存和恢复它可能用到的寄存器,用户无须保存和恢复寄存器。

@LDMSTM指令的寄存器列表只允许物理寄存器。

@汇编语言用作为操作数分隔符

 

 

为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序

为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。

 

 

 

阅读(359) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~