|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
. A1 `1 f' M' M! r. B(1)2 F) {! @* R5 Y
字符串复制
6 j/ {4 |$ A' w8 d# [0 x本例主要介绍如何使用指令BL调用子程序。
W: j- k. Y; _' d注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
. @1 t" b' H! w6 h o% j% h1 ]示例 使用指令BL调用子程序
7 j, Y* S( Q6 R#include <stdio.h>; b6 {& R$ D2 U5 N, T) i$ [
void my_strcpy(char *src,const char *dst)
3 ]- u( V) z6 y! \) Y{
: f% ^+ Y9 s, X1 B2 o) Vint ch;
2 j* r: T" F7 F |1 Z2 T__asm2 e( k% ~* Q3 x/ ]- ?# z
{! e: ~ R5 q! M. i I `: |
loop:
" Q2 I/ n; s8 ~4 X4 T1 \#ifndef _asm /ARM版本/
8 t* m( S! n4 P$ v w e& G: CLDRR ch,[src],#1
* W" T! W& G( T# j2 [$ cSTRB ch,[dst],#1
6 ?8 G0 C! t; M% T/ m0 E#else /Thumb版本/5 F9 v% ^! F: N9 R% O4 S7 @
LDRB ch,[src]) G" X0 f7 G7 V
ADD dst,#1
1 c5 H$ _' _2 P* x* _! y#endif) B X0 V$ f0 y
CMP ch,#0
, K: M2 g( q0 A I1 w5 jBNE loop
4 E1 M3 E8 k: B, L% U3 Z}" M. a" e3 K5 s, q8 M9 ]# W, `! e
}* u N' ?: Q, S
int main6 X. u. h; m/ a% M9 k
{
5 b5 E/ H) Z+ P; y+ i! z- c+ ~8 S0 qconst char *a="Hello world!";
2 B9 \, c' R6 [/ L+ b0 y+ Ychar b[20];
& S9 E( O' i, ?8 V* w. C__asm' B, C0 d4 U* z
{0 t# U, |% q4 d: z$ T( a
MOV R0,a /设置入口设置/
: F) R2 u: I: l, ~% E) Q- rMOV R1,b* V5 K& v% ]* K
BL my_strcpy,{R0,R1} /调用my_strcpy()函数/( L u# b; q d7 ?
}
* r4 s) Q- A4 `7 _printf("Original string:%s\n",a);
* D$ O' c( G) r( ^* mprintf("Copied string:%s\n",b);
( E- _- q2 X$ I$ F" d5 L4 hreturn 0;# r4 F7 H+ A. O y7 z) }0 n
}
1 `& w7 R/ i; r: e/ B: ~# o0 o在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。
' w# a3 f2 a$ R! E0 k4 r2)使能和禁止中断: k$ Q( u+ q; x4 ~) [# p e
本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。3 J2 X' G$ O( w b, r7 S; X
使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。3 f3 T8 K% `) ~1 i7 M0 @
示例 中断的使能和禁止
3 E7 M7 Z, Y" \% N/ B {__inline void enable_IRQ(void)& K% y7 y: [9 {. l% ~# P
{
8 b1 k/ s. W5 X/ S1 W O: n" ?* [int tmp;, U2 |9 r7 B2 {& Z9 U. V+ s
__asm
) \3 f- ]' U2 t+ t6 X# A. Q9 S+ I& |{3 D- {/ n1 f( n' L7 M
MRS tmp,CPSR- i) f6 O" c$ R7 p# g& a
BIC tmp,tmp,#0x806 Q1 h }# `7 u# t% [+ q6 i
MSR CPSR_c,tmp$ r% k6 ~$ n% ]+ i) F! X
}; O3 P, X6 N; R3 r% _
}& ]4 u- _1 ]% z) ]" E- a' u
__inline void disable_IRQ(void)
+ b) W0 D" o5 b* P* D0 \- T{
; o' r6 ^1 P$ ^3 Vint tmp;
7 E& } k% m& C8 n__asm/ ^' ]* P1 [8 O5 I
{' m9 y4 K: |, e( J; i/ n2 j
MRS tmp,CPSR# m( z+ i, o$ M" k0 L
ORR tmp,tmp,#0x80
1 x7 D) E, g( e5 k2 h: S7 xMSR CPSR_c,tmp4 J/ T0 _* F; o4 ^" e
}
' Z7 Q/ n! J/ u} m/ |- ~$ U/ Y
int main(void)
3 r- ~8 k: P2 @- V$ z{
2 j1 d; K; y# M4 u& S2 S' Vdisable_IRQ();
0 n( w" L8 u9 R/ r1 Nenable_IRQ();
* k3 {, z+ N8 a$ i} |
|