|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
1 ~. o" |; q5 G* }(1)! d6 w! c/ ^% d* D) z+ A0 K2 g8 z
字符串复制
. H% l- s! l9 m本例主要介绍如何使用指令BL调用子程序。
2 U/ b2 H% x5 Z$ T' g# P/ C注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。& c( H' }+ [8 h9 } {
示例 使用指令BL调用子程序1 d, y5 i' E' o
#include <stdio.h>3 ?0 N$ f& N4 Z% J. L* t
void my_strcpy(char *src,const char *dst)
4 D9 i# T _2 w{' P' O3 e, \4 p
int ch;' p, U/ A/ E/ Y
__asm
& K6 \, J h7 M& B7 u{: A2 w& ^4 i& w6 b" ?# t
loop:
4 ^$ ^ M" I3 [2 S#ifndef _asm /ARM版本/7 y" C+ |. A' @+ L7 [* r- A
LDRR ch,[src],#1
- ` l4 G! D2 _STRB ch,[dst],#1' F: Q4 J8 V: }. F& `% i" s
#else /Thumb版本/
1 ^3 c9 r9 h2 ^LDRB ch,[src]
' ?* _, d S+ ~ADD dst,#15 `! {/ U& d' P( m5 o4 V
#endif( M. h' N! l; `& e8 @6 c1 b2 t+ x
CMP ch,#0; Z: I7 e) ?2 J5 C
BNE loop( ?* [; T3 b& G: m H8 p
}' |' b' H# k0 U' m! P. Y
}/ Z- e& w1 s2 q# H$ n
int main) U9 L* n6 C& L" I" n4 c% e3 C! ^
{
; ]- j+ ~. b- \1 ]( ]! j2 K+ Gconst char *a="Hello world!";! m# n5 V( l3 k* U$ j# f
char b[20];( H: t7 J7 l4 M2 r2 M Z3 V9 ]
__asm- K1 U2 |. U* j
{" I9 X. T9 W6 H' r' r
MOV R0,a /设置入口设置/
0 g' F3 A- H% E ?MOV R1,b* [3 u, m. ~" @0 F
BL my_strcpy,{R0,R1} /调用my_strcpy()函数/* A" h: c7 |2 R( D8 s
}) r3 ?7 P7 K+ ?: `% w, A4 x
printf("Original string:%s\n",a);
/ g1 a/ l$ f$ K( R2 a9 e/ Qprintf("Copied string:%s\n",b);
# G$ k! ^- A6 j2 G5 ]return 0;
& V5 f2 o$ t9 O1 p6 Z+ x9 z}0 g$ {7 A r. ~$ b( h, L' R% X% v
在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。9 G) Q8 M2 w( Q/ W) [' H
2)使能和禁止中断
, |4 G$ _ C# y2 U# Q# E本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。# I- T/ N* i# g. g
使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。' R/ v' }$ X) V' @
示例 中断的使能和禁止8 | h0 A6 f+ P$ Q; t$ O4 H+ p
__inline void enable_IRQ(void)
F: \, B! G: n8 ^. x( T{
) F$ u& n) J/ Z9 z6 Eint tmp;
2 E# |0 n/ o# a; j, M5 D__asm; p+ d C, `6 @5 k6 E1 h$ G
{/ x, m1 O. J3 y" n0 V- I5 _
MRS tmp,CPSR
7 e' ~% U; J- F0 ]BIC tmp,tmp,#0x80. d( s, u# z# O. ?' i
MSR CPSR_c,tmp
' w7 z. R1 k% p" C5 w+ b5 P! F}6 Q: ?; |: a3 P, Q+ y( L# j& v6 ?; C1 o
}
. ^( l$ T( T" G. E+ z r% v__inline void disable_IRQ(void)
& `: R. ~5 x) `{
0 K S( `6 Z* @ {( X2 Lint tmp;/ X9 L9 C2 k, }) A" U6 o1 Z" C- P
__asm
2 m" {$ ^5 ^7 C8 h3 S- I* D& V* U{8 J8 T; D3 r7 b& T: l& I3 p* E
MRS tmp,CPSR
* q+ _3 a# a6 FORR tmp,tmp,#0x806 Z& R0 ?- l/ s0 m
MSR CPSR_c,tmp
* i% M6 u, M8 n7 J8 R}
% G9 h- y, D4 U* L4 Q8 L}
6 i+ j$ n( ?- Bint main(void)
( b6 p6 s: l2 D0 ~$ }{
* ~6 h1 ~8 L2 F+ a& V+ @) _disable_IRQ();9 X* @& g# F3 g b8 t A3 R
enable_IRQ();
6 w \2 s' R, ]; {" g} |
|