|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。/ n. V3 G0 b5 J* u& d! F
(1)! V9 C9 H6 v" n
字符串复制: t, f. J- N& k7 ^. Z) W/ W/ I& b' H
本例主要介绍如何使用指令BL调用子程序。
9 X% f4 q( w7 S/ b注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。3 V& o+ L( D3 I
示例 使用指令BL调用子程序
Z* d6 o! v" w4 {9 M% }0 r#include <stdio.h>$ Y$ x; ]2 x- ^8 k
void my_strcpy(char *src,const char *dst)( `3 v f) F }+ W& {
{% C3 B0 T3 a! {/ X7 n9 y: d
int ch;
( S( w5 A& K9 I$ X# t$ i__asm
! ~( c: |# B( F. E2 U+ M1 W{
6 A. }& t9 e2 s, u. Aloop:
, f+ Z$ q# Y; F' K9 _* n4 W2 I#ifndef _asm /ARM版本/) E0 L; z( B/ ?4 e/ [* K
LDRR ch,[src],#1
3 } _0 G9 m; v/ `3 B' |STRB ch,[dst],#14 }5 |% @5 _1 w1 r9 [0 e5 \. ^
#else /Thumb版本/4 w5 D0 H# O( f8 B
LDRB ch,[src], V4 C/ A" N# Y1 s2 _5 h$ `
ADD dst,#1
+ J* [; L* L7 A) T) e. t# ?#endif( T0 o v8 a) G2 _* R
CMP ch,#0, d' s [) B1 u+ g. l
BNE loop9 p1 m" G w, X; z
}1 r8 G: g/ Y3 K C- m% R
}5 ]0 H* ?* G6 h, Q
int main
, A9 N1 X9 ?1 \: H0 B+ _{$ Q" Y3 [7 l7 O9 |. w1 P# F7 \
const char *a="Hello world!";
~0 s! [; K6 U4 |& s: Vchar b[20];+ K4 H; E2 z' d1 {0 S y
__asm
6 z$ a' T3 I, Y8 y7 ]5 k! x{
: a- O( i; _ B4 x& l9 YMOV R0,a /设置入口设置/0 Z/ F" K& T) J& s: A
MOV R1,b
4 ?; T& v( {0 n& x; N5 p& v7 ABL my_strcpy,{R0,R1} /调用my_strcpy()函数/
+ A5 R; V# r" A$ \- E' M! ~}! f8 |3 p! v- K6 g% w
printf("Original string:%s\n",a);
* E X: ~. r. A& @. m. Z% ~printf("Copied string:%s\n",b);
! `/ R/ r# ]. Breturn 0;
" \2 q1 F3 n! P4 w) I6 L, h! e, I}
" k0 ^: E" N) v在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。- j9 E( T5 `* c& \) o
2)使能和禁止中断
, ]4 E; U- Q* H本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。
. P" L( U: E& |- ^使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。1 Q9 M7 Z# \9 y) t; Y: F( O
示例 中断的使能和禁止% \; a! T6 S6 a$ }+ B' F: D
__inline void enable_IRQ(void)
" s7 d$ c$ U" B3 f! j: S6 }{
3 Y W- E' J; v: L, Y5 V* }3 h yint tmp;- ]0 f: t& c$ L1 V( S3 Z% s
__asm
/ {5 R9 D* Q9 O: \& r3 r8 W{
# u8 ^3 v8 }/ ^MRS tmp,CPSR
( Y1 _& z& g& p$ ~) ABIC tmp,tmp,#0x80
5 @$ i0 c5 O) Z5 \% ^7 jMSR CPSR_c,tmp
7 L0 v1 y8 L+ i, W% |) ]}' N( p% T6 O$ [% G6 `% }3 r2 v) v
}" O$ }& d. L8 j( `3 Z( o6 O- g' {$ ?
__inline void disable_IRQ(void)
6 m6 }7 J4 }1 t! L( F3 g2 }{- v& J- P- R H% d5 m7 F; l
int tmp;6 c. M3 E* O4 [2 V; s- G- s \0 y
__asm
7 z) }; |5 ^0 }5 i{, w, o8 o M, n
MRS tmp,CPSR
j6 v" J; Y+ d, C7 p7 q( aORR tmp,tmp,#0x80
1 Y; }' K- h$ OMSR CPSR_c,tmp
; u% w' F3 o9 Z+ Q6 |' M+ h}
3 J) g x* z$ _, m}7 B# S8 x5 }6 a8 |4 U3 A
int main(void)
2 m( A, d/ F* D/ E( ~{' _3 [ ^" D9 F
disable_IRQ();
5 Z2 t: j u9 y, E; R! C9 Aenable_IRQ();0 [# t' x. ]* I, a( {8 g) {
} |
|