ARM与C混合编程

ARM 73浏览

第一:基础知识

     (1)寄存器,参数传递的使用规则

  A.在子程序中,使用寄存器R4R11来保存局部变量。

    B.寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP

    C.寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。 

    D.寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。

    E.寄存器R15是程序计数器,记作PC

    F.参数不超过4个时,可以使用寄存器R0R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。

    G.结果为一个32位整数时,可以通过寄存器R0返回

    H.结果为一个64位整数时,可以通过寄存器R0R1返回,依次类推。

(2)堆栈的使用规则
堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。
第二:实例
 (1)C语言中调用汇编函数(标号处)
   init.s
   IMPORT fun
	EXPORT fun_asm
	AREA |C$$code|, CODE, READONLY
	PRESERVE8
	ENTRY
start
	BL fun
fun_asm
	LDMFD R13!,{R4-R8}
	MOV r0,r4
	END

        test.c

extern  fun_asm();

int fun()
{
	fun_asm(1,2,3,4,5,6,7,8);
	return 0;
}

 (2)C程序中内嵌汇编语句

 __asm
	{
	指令[;指令]
	……
	[指令]
	}

注意:其中“__asm”为内嵌汇编语句的关键字,需要特别注意的是前面有两个下划线。指令之间用分号分隔,如果一条指令占据多行,除最后一行外都要使用连字符“/”。
         (3)在汇编中使用C定义的函数

init.s
IMPORT fun
	EXPORT test_asm_args
	AREA |C$$code|, CODE, READONLY
	PRESERVE8
	ENTRY
start
	STR lr, [sp, #-4]! ;保存当前lr
 	ldr r0,=0x1 ;参数 1
    	ldr r1,=0x2 ;参数 2
    	ldr r2,=0x3 ;参数 3
    	ldr r3,=0x4 ;参数 4
    	ldr r4,=0x8
    	STMFD sp!,{r4}
    	;str r4,[sp,#-4]! ;第二种方法参数5
    	;ldr r4,=0x7
    	;str r4,[sp,#-4]! ;第二种方法参数6
    	;ldr r4,=0x6
    	;str r4,[sp,#-4]! ;第二种方法参数7
    	;ldr r4,=0x5
    	;str r4,[sp,#-4]! ;第二种方法参数8
    BL fun
        END

Test.c
extern  test_asm_args();

    int fun(int i,int j,int x,int y,int z,int a)
    {
	test_asm_args(1,2,3,4,5,6,7,8);
	return 0;
    }

(4)在汇编中使用C定义的全局变量

汇编语言中引入
  

IMPORT var
     var(C语言中全局变量名)