å½éè¦C/C++ä¸æ±ç¼æ··åç¼ç¨æ¶ï¼å¯ä»¥æ以ä¸ä¸¤ç§å¤ççç¥ï¼
è¥æ±ç¼ä»£ç è¾çï¼åå¯å¨C/C++æºæ件ä¸ç´æ¥å åµæ±ç¼è¯è¨å®ç°æ··åç¼ç¨ã
è¥æ±ç¼ä»£ç è¾é¿ï¼å¯ä»¥åç¬åææ±ç¼æ件ï¼æå以æ±ç¼æ件çå½¢å¼å å ¥é¡¹ç®ä¸ï¼éè¿ATPCSè§å®ä¸Cç¨åºç¸äºè°ç¨å访é®ã
åç¼.Sæ件ä¸çæ±ç¼æ令æ¯ç¨armasmæ±ç¼å¨è¿è¡æ±ç¼çï¼èCè¯è¨ç¨åºä¸çå åµæ±ç¼æ令åæ¯ç¨å åµæ±ç¼å¨è¿è¡æ±ç¼çãè¿ä¸¤ç§æ±ç¼å¨åå¨ä¸å®çå·®å¼ï¼æ以å¨å åµæ±ç¼æ¶è¦æ³¨æ以ä¸å ç¹ã
2.3.1 å°å¿ä½¿ç¨ç©çå¯åå¨
å¿ é¡»å°å¿ä½¿ç¨ç©çå¯åå¨ï¼å¦R0ï½R3ãIP(R12)ãLR(R14)åCPSRä¸çNãZãCãVæ å¿ä½ãå 为计ç®æ±ç¼ä»£ç ä¸çC表达å¼æ¶ï¼å¯è½ä½¿ç¨è¿äºç©çå¯åå¨ï¼å¹¶ä¼ä¿®æ¹NãZãCãVæ å¿ä½ã
å¦è®¡ç®ï¼
y=x+x/y;
[cpp] view plain copy
1. __asm
2. {
3. MOV R0, x //æxçå¼ç»R0
4. ADD y, R0, x/y //计ç®x/yæ¶R0çå¼ä¼è¢«ä¿®æ¹
5. }
2.3.2 å åµæ±ç¼ç¨åºä¸å 许使ç¨Cåé
å¨è®¡ç®x/yæ¶R0ä¼è¢«ä¿®æ¹ï¼ä»èå½±åR0+x/yçç»æãå åµæ±ç¼ç¨åºä¸å 许使ç¨Cåéï¼ç¨Cåéæ¥ä»£æ¿å¯åå¨R0å¯ä»¥è§£å³ä¸è¿°é®é¢ãè¿æ¶å åµæ±ç¼å¨å°ä¼ä¸ºåévaråé åéçåå¨åå ï¼ä»èé¿å å²çªçåçãå¦æå åµæ±ç¼å¨ä¸è½åé åéçåå¨åå ï¼å®å°ä¼æ¥åé误ã
[cpp] view plain copy
1. int var;
2. __asm
3. {
4. MOV var, x //æxçå¼ç»R0
5. ADD y, var, x/y //计ç®x/yæ¶R0çå¼ä¼è¢«ä¿®æ¹
6. }
2.3.3 ä¸éè¦ä¿ååæ¢å¤ç¨å°çå¯åå¨
对äºå¨å åµæ±ç¼è¯è¨ç¨åºä¸ç¨å°çå¯åå¨ï¼ç¼è¯å¨å¨ç¼è¯æ¶ä¼èªå¨ä¿ååæ¢å¤è¿äºå¯åå¨ï¼ç¨æ·ä¸ç¨ä¿ååæ¢å¤è¿äºå¯åå¨ãé¤äºCPSRåSPSRå¯åå¨å¤ï¼å ¶ä»ç©çå¯åå¨å¨è¯»ä¹åå¿ é¡»å èµå¼ï¼å¦åç¼è¯å¨ä¼æ¥éã
[cpp] view plain copy
1. int fun (int x)
2. {
3. __asm
4. {
5. STMFD SP!, {R0} //ä¿åR0ï¼å 读ååï¼æ±ç¼åºé
6. ADD R0, x, #1
7. EOR x, R0, x
8. LDMFD SP!, {R0} //å¤ä½ç
9. }
10. return x;
11. }