閱讀822 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C語言和ARM匯編語言的相互調用

1.匯編程序訪問C語言全局變量

全局變量隻能通過地址間接調用,為了訪問C語言中全局變量,首先要通過extern偽指令引入全局變量,然後將其地址裝入寄存器中。

對於unsigned char類型,使用LDRB/STRB訪問;

對於unsigned short類型,使用LDRH/STRH訪問;

對於unsigned int類型,使用LDR/STR訪問;

對於char類型,使用LDRSB/STRSB訪問;

對於short類型,使用LDRSH/STRSH訪問;

例子:

.text

.global asmsubroutine

.extern globvar

asmsubroutine:

LDR R1,=globvar

LDR R0,[R1]

ADD R0,R0,#2

STR R0,[R1]

MOV PC,LR

.end

2.C程序調用匯編程序

C程序調用匯編程序首先通過extern聲明要調用的匯編程序模塊,聲明中形參個數要與匯編程序模塊中需要的變量個數一致,且參數傳遞要滿足ATPCS規則,然後在C程序中調用。

例子:

#include<stdio.h>

extern void *strcopy(char*d,char*s);//模塊聲明

int main()

{

char*srcstr="first";

char*dststr="second";

strcopy(dststr,srcstr);//匯編模塊調用;

}

.text

.global strcopy

Strcopy:

LDRB R2,[R1],#1

STRB R2,[R0],#1

CMP R2,#0

BNE Sstcopy

MOV PC,LR

.end

匯編程序調用C程序

在調用之前必須根據C語言模塊中需要的參數個數,以及ATPCS參數規則,完成參數傳遞,即前四個參數通過R0-R3傳遞,後麵的參數通過堆棧傳遞,然後再利用B、BL指令調用。

例子:

int g(int a,int b,int c,int d,int e)//C語言函數原型

{

return(a+b+c+d+e);

}

匯編語言完成是求i+2i+3i+4i+5i的結果;

.global _start

.text

_start:

.extern g   ;引入c程序

STR LR,{SP,-#4}!;保存PC

ADD R1,R0,R0

ADD R2,R1,R0

ADD R3,R1,R2

STR R3,{SP,#-4}!

ADD R3,R1,R1

BL g   ;調用C函數g

ADD SP,SP,#4

LDR PC,[SP],#4

.end

return(0);

最後更新:2017-04-03 14:53:48

  上一篇:go 2013-10-18
  下一篇:go bash重拾