|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
2 W" p. P8 u X( \(1)
) c( T! [2 \. x/ _& j字符串复制+ l( p8 N Y) d8 L
本例主要介绍如何使用指令BL调用子程序。3 P: `- W, w' p) p
注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。; y4 _' R( U8 q! a% R
示例 使用指令BL调用子程序$ N0 L& S. r, M
#include <stdio.h>
v, D: u5 [0 z$ Avoid my_strcpy(char *src,const char *dst). r5 K2 p5 J. C4 u' P! H
{
0 @! T2 U: j; J5 [int ch;
, L3 [. t% W C4 u3 a9 p__asm
6 b* G- M" n7 J$ E* C{2 U! s9 ~' m$ M$ o
loop:" h7 `' T6 U. W7 C
#ifndef _asm /ARM版本/
; \: g N/ T0 A$ ^( P) m7 lLDRR ch,[src],#1
i: C1 Y: z/ G" H2 K B6 gSTRB ch,[dst],#1
* ]4 F2 E# `& K6 G+ l' O5 c#else /Thumb版本/
2 ?; E; }0 {; T! I( BLDRB ch,[src]
5 H) o. @0 R' u/ t! I+ u, M, \ADD dst,#19 B& C5 K0 V6 k& a* J2 E
#endif
& d0 R) Z7 h# n$ qCMP ch,#00 c; H/ _) F4 x S
BNE loop# p) p; K( |* z
}
5 v1 m5 L% N4 b) X}
' n7 H$ L$ e% |3 `" Nint main
" z! h) F g" c2 n{4 i' O' |4 K, ]
const char *a="Hello world!";3 S2 ~) d$ i6 `8 G8 g$ r% |4 j: }
char b[20];
3 b7 L% I4 N2 U* V0 Y__asm
* G/ N; O" x, C7 T$ M+ N{
; ^. z2 t* o7 U+ n. s* ]2 {/ @MOV R0,a /设置入口设置/
! G& ^8 g0 Q2 ~) {MOV R1,b
+ @# s9 W" L1 A: ]! Q, u# vBL my_strcpy,{R0,R1} /调用my_strcpy()函数/' T' w9 H8 t% `# W- j$ ?
}
8 h% B% p$ E1 ?7 pprintf("Original string:%s\n",a);
9 o) ~4 l4 L1 uprintf("Copied string:%s\n",b);# W% E+ C; L2 E( l2 B. w, b
return 0;* d. m) x( [5 y
}
4 x6 K: X( I$ \: M' v+ j在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。; c. t6 c8 [, S0 D B' ?
2)使能和禁止中断% B* U( G2 D F$ h3 }' H: M& R9 M
本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。8 ]9 R* Y9 g" |* R
使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。
4 S* a, `& @, q) V* y示例 中断的使能和禁止
5 H' N8 {% e d1 o__inline void enable_IRQ(void)
# e' N6 [# D' }: a2 g" p{
5 H/ r% j' Q- O& s& x) j2 ?int tmp;
% C: t0 ]7 c9 e. `__asm4 T- j3 E) T2 d1 w X
{0 m& k: T% d" D, X: T3 x' I% L
MRS tmp,CPSR
0 {2 [& C1 [) ]8 X7 _$ v+ _9 VBIC tmp,tmp,#0x804 H+ n w I$ G) y/ m3 a2 ^$ q
MSR CPSR_c,tmp
- N; v: p. R" K9 \5 s/ }& W, a}
$ U' ^) S" I, X2 [9 `# P}
! x; W4 m, g. R__inline void disable_IRQ(void)1 f1 `9 r# N0 B' }9 {
{$ L) P/ W+ W3 ^
int tmp;6 B/ x( r7 p( M
__asm4 z$ a5 Z( t( E
{4 ^3 S" L% u' ]! l! M
MRS tmp,CPSR
- d; Q. m: V- f& e. lORR tmp,tmp,#0x80
* b, f8 `- R* d [MSR CPSR_c,tmp; k% }# E$ K5 e2 C
}
3 o& `" k4 W, X( k- k}
: U8 T/ g0 z! ?int main(void)6 p8 ~" p0 W4 v0 w$ M
{
+ ]- d3 j$ {5 q" l6 n; @1 \1 cdisable_IRQ();; N3 ?/ Q3 _, o" \( q# I
enable_IRQ();: d p( K, J) G
} |
|