|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
$ r5 s# u7 a5 y& M* d: p(1)$ v7 P5 H) p9 [" l7 X
字符串复制
! @( }# C4 h- `3 b5 Q6 K本例主要介绍如何使用指令BL调用子程序。; e* q) D5 i8 w9 \
注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。; b+ d" }2 X* {) b5 x! ?' v
示例 使用指令BL调用子程序7 s9 { C# d* j, c% w8 Y. i
#include <stdio.h>
5 \! M; Q5 y3 @! A: z$ u! Bvoid my_strcpy(char *src,const char *dst)
5 e% {. l5 L5 ?% K; X% Q{
. r- N0 _( W: w: c1 e' Pint ch;
6 m' c4 v8 J2 C7 q5 a__asm
( W- [7 r' B7 f{, g5 t% l2 @0 t$ ` p" a
loop: E) W5 S, n9 `% X
#ifndef _asm /ARM版本/% c* C4 e& H/ D* ?9 ?( {
LDRR ch,[src],#1
6 a' |* X; b4 m1 nSTRB ch,[dst],#1. C. b% l% I6 a4 T) v
#else /Thumb版本/
( ]7 d" a: S2 c9 Y) u$ P& w* S% rLDRB ch,[src]# D# ?* W9 T, ~- A
ADD dst,#1
3 G/ @9 M6 O" {: ^& w D, J! d#endif
0 i7 R! m" K9 D9 f u6 T5 m6 O dCMP ch,#0
& A( ]* f% p6 |9 U3 `BNE loop
- r/ ]& l- ~; \/ B2 L7 T}
5 o6 s k8 A8 i# v6 \1 s}
. b: t3 @. r! J% i+ e* ~int main! F) a, b8 _( E$ c
{
: \; Z5 {" Z* I1 y% K( Z lconst char *a="Hello world!";
" F* [- f1 i' S$ rchar b[20];
5 {: H' Y1 ~+ i6 |2 n/ ]$ t__asm, B0 y: l p# U" d+ |3 _
{) V: H; B: t; v4 D: V# t2 u2 J7 N
MOV R0,a /设置入口设置/4 X. x" q& E8 S1 y
MOV R1,b
* v4 p& h1 X- t3 LBL my_strcpy,{R0,R1} /调用my_strcpy()函数/+ c( L! ^( f/ M# J7 u0 @' V
}2 T8 M) a) m I. O) {. p2 q3 N
printf("Original string:%s\n",a);
3 }& w1 `) c s2 V: l; Vprintf("Copied string:%s\n",b);. G) H( L+ g ?2 D% t- T, r( T* O
return 0;
: L! y" I8 f6 N7 H7 S}
+ @# k6 R) Q1 l3 E X4 P b; G在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。
4 D& ?1 _) @. w6 f2)使能和禁止中断$ O, o8 p3 @) M) ?
本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。/ s# ]9 i' W5 K7 o8 y, H
使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。7 f) `, O( P) }* t" c
示例 中断的使能和禁止3 i" \/ v% a1 l- z7 f2 f4 c
__inline void enable_IRQ(void)
4 C( z: r Y3 g( I{
+ H3 n2 r4 r3 R1 D6 J! F; Dint tmp;5 m# a0 f' [8 g8 s! z! H
__asm& h3 I) `+ x, I' {
{
2 X2 A0 G& D: c& ^; GMRS tmp,CPSR
8 R0 v6 K, j; QBIC tmp,tmp,#0x809 T6 g; ?" {4 Y6 K# P8 Y" Z
MSR CPSR_c,tmp
- {1 L0 E( R: L6 u( D2 _" l}
! M. D+ R$ p, @/ r9 t3 x& N% D}) u, ?- ?+ R) Y2 C5 g7 t5 p
__inline void disable_IRQ(void)
" ]' H5 l" G5 {+ e$ _{1 X$ L: \$ [8 R3 z, b
int tmp;
2 t3 V" r8 @! X$ _# ?__asm
/ l4 z* `4 E R) T+ a1 i8 ]{
7 M* z. E! B8 n. T/ X5 y4 o$ N& n% ]+ @MRS tmp,CPSR+ W5 [( R7 w5 E
ORR tmp,tmp,#0x80
3 W/ g; Z- t/ H8 U6 V# j4 Z0 X2 fMSR CPSR_c,tmp& a2 G( M& q* C8 g; p( g) p4 H
}7 |$ p" A; n+ ]: K( t
}3 B# y) b7 q: W9 ]3 I0 m' |
int main(void), @4 z, u. e$ u, `
{+ f9 ]- u% P6 z
disable_IRQ();
7 K$ A+ P# y$ I a2 R0 M5 aenable_IRQ();8 y7 ^) N; ^: F% l
} |
|