|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
O7 L/ r( Z8 n# Y+ d0 Y7 f(1)# i0 ]4 x& s. ~5 ?7 M" \
字符串复制
: A' `0 S6 f! {1 p( T本例主要介绍如何使用指令BL调用子程序。2 y* t7 v6 Z3 w8 k4 ?% U
注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
: w6 N3 k8 ]% o6 Z6 m% j* x3 L4 V示例 使用指令BL调用子程序
% ` b0 I; I& q# f. Y I& v$ V# F. v#include <stdio.h>/ Q, T m; ?. k7 s) S9 x" _
void my_strcpy(char *src,const char *dst)" `# \# U4 e9 F3 r' g8 i2 D
{
1 [ q! Z2 F; m; T) ]) e K- mint ch;6 b% O9 o _& I" m# p! |. }+ ~
__asm
, W, c8 ~8 y. p. d{( [5 ?! \+ @( h( S: m7 K/ H
loop:$ p$ w7 a- d4 h. F3 N
#ifndef _asm /ARM版本/) W* n6 D6 N: i. q$ t+ z2 y
LDRR ch,[src],#11 q% r2 {+ w/ `; `
STRB ch,[dst],#1" q$ _ {. \( ~- ^
#else /Thumb版本/
2 N# _0 C( b# `8 y2 kLDRB ch,[src]
7 H9 [, x3 ?! z$ @ADD dst,#1% D. D( [$ k* s" H7 i( v! [
#endif9 O$ R: ^$ |* ~
CMP ch,#0# W/ Q. R, M4 ^: l
BNE loop4 s2 J/ h5 W. y( u, {1 J: N3 V
}" i4 w1 C5 U. F, k) g
}
3 w1 C. G& t9 K/ d4 aint main; [/ s( w2 ]; o
{/ g1 ^- Q) D7 s: A
const char *a="Hello world!";6 z, F" I' }4 E2 E7 `9 h1 T
char b[20];
3 R$ X1 `) e3 r4 i3 M5 i. ^__asm
. ~' y$ M7 N) S2 V, T& }; |3 L{6 ?" c# S0 b( d3 q' y3 [
MOV R0,a /设置入口设置/; C/ A \! r+ Z/ @! C, Z6 S
MOV R1,b! M8 Y. p/ a; a. b9 t
BL my_strcpy,{R0,R1} /调用my_strcpy()函数/
' S. `: C- `2 }}
5 n( F3 g+ Q, z: wprintf("Original string:%s\n",a);" ]+ Z' S; A+ S- o# G6 k' M
printf("Copied string:%s\n",b);% S% U* \" l' F8 E1 N) |. Q
return 0;# b) y) B- c0 {" l: q
} B: q, K6 \0 `4 Y5 s! I
在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。2 s* F5 X* ?/ S' @+ ~
2)使能和禁止中断
/ L7 X8 n! c9 }" ?本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。
. N5 w% w8 x) }$ p. j) \使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。2 m! G' G" K7 X0 }
示例 中断的使能和禁止2 s( s* L1 m7 g# R* b4 ^
__inline void enable_IRQ(void)
) k8 D1 Q: v7 S: S7 f8 {1 g{! l3 O. @0 C- K- K
int tmp;
# i& C! l3 ]+ P8 s__asm
& W/ l% N/ i8 F5 x x% ~{
n; { \9 V. m( _% a3 fMRS tmp,CPSR
5 i3 I& j4 H; q) T+ ]/ jBIC tmp,tmp,#0x80
5 H- y/ H% b6 j6 |. M1 I! [MSR CPSR_c,tmp
% a: |' N, j9 Z0 f0 ~. q |}
* @* w3 O/ U9 T1 J! n. W: J}
5 o1 y8 k" f% [6 r4 S__inline void disable_IRQ(void)) a+ M- |- x7 }# ]: t
{7 A- \( k, s4 b( `' D4 _
int tmp;
0 w) P7 R d- A [% |+ X1 L__asm
# k8 z3 d* ?$ ?3 y2 A{9 j, J7 }8 ~5 F( D1 L. V
MRS tmp,CPSR
1 j8 T' s, I, ^: o* uORR tmp,tmp,#0x80
0 `1 m/ f% `% \5 BMSR CPSR_c,tmp$ _% u2 b/ m9 e
}
5 Q. M9 r) C0 r, [2 }}
% e. y% A& l& L% z+ @+ z4 uint main(void)
1 y9 y' i. }1 Z. G* `5 n& u& I{
! z9 ?: ?# c. [" Ddisable_IRQ();
! R) A0 _ u' e6 k$ |; `enable_IRQ();
% {/ j" a2 O0 v" T L% T3 S+ q9 g} |
|