ä¸ã åæ°ä¼ éçåºæ¬è§åï¼ATPCS(ARMâThumb Procedure Call Standard)ï¼
1ã åæ°ä¼ é
äºãæ±ç¼ç¨åºãCç¨åºç¸äºè°ç¨ä¸¾ä¾
1ã Cç¨åºè°ç¨æ±ç¼ç¨åº
æ±ç¼ç¨åºç设计è¦éµå®ATPCS(ARMâThumb Procedure Call Standard),ä¿è¯ç¨åºè°ç¨æ¶åæ°çæ£ç¡®ä¼ éãå¨æ±ç¼ç¨åºä¸ä½¿ç¨EXPORT 伪æä½å£°ææ¬ç¨åºï¼ä½¿å¾æ¬ç¨åºå¯ä»¥è¢«å«çç¨åºè°ç¨ãå¨Cç¨åºä½¿ç¨extern声æ该æ±ç¼ç¨åºã
ä¸é¢æ¯ä¸ä¸ªCç¨åºè°ç¨æ±ç¼ç¨åºçä¾åãå
¶ä¸æ±ç¼ç¨åºstrcopyå®ç°
å符串å¤å¶åè½ï¼Cç¨åºè°ç¨strcopyå®æå符串å¤å¶çå·¥ä½ã
//Cç¨åº
#include <stdio.h>
extern void strcopy(char *d, const char *s);
int main( )
{
const char *srcstr=âFirst string-sourceâ;
char dststr[ ]=âSecond string-destinationâ;
printf(âBefore copying:\nâ);
printf(â%s\n %s\nâ, srcstr,dststr);
strcopy(dststr,srcstr);
printf(âAfter copying:\nâ);
printf(â%s\n %s\n â,srcstr,dststr);
while(1) ;
}
;æ±ç¼ç¨åº
AREA Scopy, CODE, READONLY
EXPORT strcopy
Strcopy
LDRB R2, [R1], #1
STRB R2, [R0], #1
CMPR2,#0
BNE Strcopy
MOV PC, LR
END
2ã æ±ç¼ç¨åºè°ç¨Cç¨åº
æ±ç¼ç¨åºç设计è¦éµå®ATPCS,ä¿è¯ç¨åºè°ç¨æ¶åæ°çæ£ç¡®ä¼ éãå¨æ±ç¼ç¨åºä¸ä½¿ç¨IMPORT伪æä½å£°æå°è¦è°ç¨çCç¨åºãä¸é¢æ¯ä¸ä¸ªæ±ç¼ç¨åºè°ç¨Cç¨åºçä¾åãå
¶ä¸å¨æ±ç¼ç¨åºä¸è®¾ç½®å¥½ååæ°çå¼ãæ¬ä¾ä¸æ6个åæ°ï¼åå«ä½¿ç¨å¯åå¨R0åæ¾ç¬¬1个åæ°,
R1åæ¾ç¬¬2个åæ°, R2åæ¾ç¬¬3个åæ°, R3åæ¾ç¬¬4个åæ°, 第5个ã第6个åæ°å©ç¨æ°æ®æ ä¼ éãç±äºå©ç¨æ°æ®æ ä¼ éåæ°ï¼å¨ç¨åºè°ç¨ç»æåè¦è°æ´æ°æ®æ æéã
//Cç¨åºg( )è¿å6个åæ°çå
int g( int a, int b, int c, int d, int e, int f )
{
printf(âe=%d\nâ, e);
printf(âf=%d\nâ, f);
return (a+b+c+d+e+f);
}
; æ±ç¼ç¨åºè°ç¨Cç¨åº g( ) 计ç®6个æ´æ° i, 2*i, 3*i, 4*i, 5*i, 6*içå
EXPORT f
AREA f ,CODE, READONLY
IMPORT g
MOV R0, #1
ADD R1, R0, R0
ADD R2, R1, R0
ADD R3, R2, R0
ADD R4, R3, R0
ADD R5, R4, R0
STR R4, [SP, #-4]!
STR R5, [SP, #-4]!
BL g
ADD SP, SP, #4
ADD SP, SP, #4
STOP B STOP
END