|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了使用单独编译的C语言程序和汇编程序能够互相调用,定义了统一的函数过程调用标准ATPCS。ATPCS定义了寄存器组中的{R0~R3}作为参数传递和结果返回寄存器。如果参数数目超过4个,则使用堆栈进行传递。由于内部寄存器的访问速度远远大于存储器,所以要尽量使参数传递在寄存器里面进行,即应尽量把函数的参数控制在4个以下。) v* E# X6 G/ w0 Q! P2 g! [" b/ C* \
示例 汇编函数调用的参数传递。
" u# ~0 P. n$ i: z9 S从C语言中直接调用汇编语言函数9 g- q& S! u4 t# P* ^1 ^% ~4 G
extern void strcopy(char *d,const char *s);
) ^) w6 B) E" Qint main(void){
$ O0 k) L" q1 P5 ~$ J. Kconst char src="Source";8 v( X7 T* K" l. i
char dest[10];7 M$ o; l1 l7 p) C- F& F' s3 t: ]$ y
...
% K; W' \7 q3 [% cstrcopy(dest,src);6 a2 l% T) Z* w1 b V6 S( ^
...
! o, T0 M" t) q9 p}
) Z) w, G- v: ?6 a+ dAREA StrCopy,CODE,READONLY
. x% x3 q5 k0 u$ u) C! _EXPORT strcopy U$ S, g5 } a- `
strcopy U$ g8 X; p, t6 D' i
LDRB R2,[R1],#1
% d: C8 M& n: D: Z) Y6 x6 xSTRB R2,[R0],#19 w& q1 x+ S& b5 j7 v6 Q- Y
CMP R2,#0
: Z" N" V* A( ], {( HBNE strcopy
; |# @+ u9 s0 K) T8 I1 G8 LMOV PC,LR$ w) S+ Q1 {) C' G9 f
END
5 e; V' J1 S+ a! s这个例子中的函数strcopy用汇编来实现,根据ATPCS的定义,函数参数从左到右由寄存器进行传递,所以在汇编中直接由R0和R1进行引用。这样,在C语言和汇编语言之间进行调用就容易实现了。 |
|