|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。' B/ z% a( v. A: Y& {: i, y
(1)
6 u& n' V$ k4 E z3 W字符串复制0 M; U( ^" o) ^ h, x7 B
本例主要介绍如何使用指令BL调用子程序。
; D( R" j2 q2 z3 U b注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
+ a2 `2 m- n c: Z5 ?示例 使用指令BL调用子程序, k" y9 F2 \8 F
#include <stdio.h>
1 D$ Z0 Z7 H- m5 N- ovoid my_strcpy(char *src,const char *dst)
" s6 E4 \( ?5 ]- O; ]{
- h6 s% V7 d5 Z6 a% w: v; p: Lint ch;
# Y/ r. m9 S- S6 z__asm' E* K) {; m0 |( b, v% b& _
{
% o* v- ]' B/ p: ~! t: _/ Cloop:' e% E. k- V7 `3 m r
#ifndef _asm /ARM版本/
5 F* h3 u/ d5 @LDRR ch,[src],#1, m# }6 N! c4 g7 T! m
STRB ch,[dst],#14 D, `" `, t7 H# d0 b; `# @: ]
#else /Thumb版本/5 _) D% Z& {* I3 n: _7 _
LDRB ch,[src]2 U9 g! L: p, |' U
ADD dst,#1( N# A! P1 t4 Y r2 k2 w
#endif3 A# L$ O" E# k+ J; o: o" q' h
CMP ch,#0
2 d7 o A6 z+ l7 b4 @6 N' i4 Z( H/ c1 |BNE loop0 Q" a3 G& P% y
}
/ g3 T- Y' ?( g" j Q}
0 {! m. V% I0 p, {- `6 M1 jint main. W9 J+ {" V# l3 A
{; h6 q' _5 a8 f9 @
const char *a="Hello world!";- F/ b: F: D- Q( y3 }! P) j
char b[20];- h. F/ V2 ^; C+ l, A# K
__asm$ ]; s+ j5 n- e1 q5 c9 @
{
/ B2 W2 O+ _$ vMOV R0,a /设置入口设置/
- J& L- k* Y& L3 v6 G/ o* J* `- DMOV R1,b9 U' a. e$ ^3 x3 r4 Z
BL my_strcpy,{R0,R1} /调用my_strcpy()函数// C) _/ Z- u0 t$ t3 F( N9 h
}& ^) A1 I* M( e2 L5 ?7 B
printf("Original string:%s\n",a);& h7 m7 T$ L9 w% k
printf("Copied string:%s\n",b);
) g" ~* y' `' B4 J% J& zreturn 0;
4 E8 l5 ]9 M8 Q}
8 v" P) f0 q) f; k8 j在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。
3 v/ N0 X9 O# x0 W. {2)使能和禁止中断6 D9 W( ^- K$ l q ^% m
本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。
5 o6 |4 I4 G) S8 \# }使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。
7 o* [# C- t, w% i* f$ p# g示例 中断的使能和禁止8 D6 H: B# y. u0 D, Q6 V
__inline void enable_IRQ(void)4 M B" c+ y" Y7 l# R; F% z6 v
{! H {( V" A! M9 ?
int tmp;, I6 F! @- `& N
__asm' M: H1 j" x. \) e/ E( v+ e
{& l8 {, I& s. i1 M8 d: p9 g
MRS tmp,CPSR
, t& m2 Q: @+ p! T/ uBIC tmp,tmp,#0x801 E- Y7 p U6 G- b. J6 M
MSR CPSR_c,tmp
5 K0 T2 N! F6 P, p7 K! e* n}% [" P. _. ]9 ~
}4 {+ Z$ ^ y) ?) t! P e: Z3 M
__inline void disable_IRQ(void)' `2 o! U, p" G: b3 G. @* h
{7 t2 J: M, m/ L0 z3 B) O
int tmp;
8 a- o0 P0 O) J! t- {__asm
/ z' ?" k9 O# |7 a6 s2 y{
7 s+ W4 [ ? K- z. v# C& a. YMRS tmp,CPSR/ T& d z4 C* u+ r: c. s# E
ORR tmp,tmp,#0x80
a5 r& |' \% oMSR CPSR_c,tmp M9 |/ s+ \7 _9 Y4 K( |- N
}4 K9 U4 e) `- N- Z0 k3 H, w
}
5 F/ I. l& d2 O/ i6 s3 \9 dint main(void)# S0 t3 [7 ~( Q
{$ n3 N+ i0 f% O% s
disable_IRQ();
& k) U+ ^) r- I' {( kenable_IRQ();* n) S% j- F; i8 V+ T
} |
|