|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了使用单独编译的C语言程序和汇编程序能够互相调用,定义了统一的函数过程调用标准ATPCS。ATPCS定义了寄存器组中的{R0~R3}作为参数传递和结果返回寄存器。如果参数数目超过4个,则使用堆栈进行传递。由于内部寄存器的访问速度远远大于存储器,所以要尽量使参数传递在寄存器里面进行,即应尽量把函数的参数控制在4个以下。
, S7 S+ {" M0 K9 y8 R示例 汇编函数调用的参数传递。
" W( P/ R& j- J. c' d+ U7 E; q从C语言中直接调用汇编语言函数
+ ?1 I/ I* Q0 l, s yextern void strcopy(char *d,const char *s);
2 }; o% a7 p3 v. O+ D; t- E Oint main(void){( v1 I# R! {" z% t
const char src="Source";6 |6 `' K. ^! g4 G6 W6 Q+ ]
char dest[10];: c5 L% d+ l* ?
...0 i: J4 W. g3 }* J) h' G
strcopy(dest,src);6 B; b6 m" Z& n% E
...
* {. w5 Q3 j" W, B}) M$ h, w; S* `: J; g: A
AREA StrCopy,CODE,READONLY
, k+ \3 ?1 n* i9 h6 FEXPORT strcopy
8 y) |& {( M: sstrcopy3 ]' ]/ T9 O0 p0 s1 M
LDRB R2,[R1],#17 [, y \3 [) n* X! `. G
STRB R2,[R0],#1
6 \2 n l G J) _- ^CMP R2,#03 ?; r! B. P$ B( W9 k
BNE strcopy" E! u0 c! r2 D0 J6 w0 K
MOV PC,LR
4 M/ f8 d9 B& ^- W/ B/ |* `* bEND
# K( {% _5 W: ~4 Y: z这个例子中的函数strcopy用汇编来实现,根据ATPCS的定义,函数参数从左到右由寄存器进行传递,所以在汇编中直接由R0和R1进行引用。这样,在C语言和汇编语言之间进行调用就容易实现了。 |
|