找回密码
 注册
关于网站域名变更的通知
查看: 317|回复: 4
打印 上一主题 下一主题

内嵌汇编指令的应用举例

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-7-13 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。' B/ z% a( v. A: Y& {: i, y
(1)
6 u& n' V$ k4 E  z3 W字符串复制0 M; U( ^" o) ^  h, x7 B
本例主要介绍如何使用指令BL调用子程序。
; D( R" j2 q2 z3 U  b注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
+ a2 `2 m- n  c: Z5 ?示例 使用指令BL调用子程序, k" y9 F2 \8 F
#include <stdio.h>
1 D$ Z0 Z7 H- m5 N- ovoid my_strcpy(char *src,const char *dst)
" s6 E4 \( ?5 ]- O; ]{
- h6 s% V7 d5 Z6 a% w: v; p: Lint ch;
# Y/ r. m9 S- S6 z__asm' E* K) {; m0 |( b, v% b& _
{
% o* v- ]' B/ p: ~! t: _/ Cloop:' e% E. k- V7 `3 m  r
#ifndef _asm            /ARM版本/
5 F* h3 u/ d5 @LDRR ch,[src],#1, m# }6 N! c4 g7 T! m
STRB ch,[dst],#14 D, `" `, t7 H# d0 b; `# @: ]
#else                   /Thumb版本/5 _) D% Z& {* I3 n: _7 _
LDRB ch,[src]2 U9 g! L: p, |' U
ADD dst,#1( N# A! P1 t4 Y  r2 k2 w
#endif3 A# L$ O" E# k+ J; o: o" q' h
CMP ch,#0
2 d7 o  A6 z+ l7 b4 @6 N' i4 Z( H/ c1 |BNE loop0 Q" a3 G& P% y
}
/ g3 T- Y' ?( g" j  Q}
0 {! m. V% I0 p, {- `6 M1 jint main. W9 J+ {" V# l3 A
{; h6 q' _5 a8 f9 @
const char *a="Hello world!";- F/ b: F: D- Q( y3 }! P) j
char b[20];- h. F/ V2 ^; C+ l, A# K
__asm$ ]; s+ j5 n- e1 q5 c9 @
{
/ B2 W2 O+ _$ vMOV R0,a                /设置入口设置/
- J& L- k* Y& L3 v6 G/ o* J* `- DMOV R1,b9 U' a. e$ ^3 x3 r4 Z
BL my_strcpy,{R0,R1}    /调用my_strcpy()函数// C) _/ Z- u0 t$ t3 F( N9 h
}& ^) A1 I* M( e2 L5 ?7 B
printf("Original string:%s\n",a);& h7 m7 T$ L9 w% k
printf("Copied string:%s\n",b);
) g" ~* y' `' B4 J% J& zreturn 0;
4 E8 l5 ]9 M8 Q}
8 v" P) f0 q) f; k8 j在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。
3 v/ N0 X9 O# x0 W. {2)使能和禁止中断6 D9 W( ^- K$ l  q  ^% m
本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。
5 o6 |4 I4 G) S8 \# }使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。
7 o* [# C- t, w% i* f$ p# g示例 中断的使能和禁止8 D6 H: B# y. u0 D, Q6 V
__inline void enable_IRQ(void)4 M  B" c+ y" Y7 l# R; F% z6 v
{! H  {( V" A! M9 ?
int tmp;, I6 F! @- `& N
__asm' M: H1 j" x. \) e/ E( v+ e
{& l8 {, I& s. i1 M8 d: p9 g
MRS tmp,CPSR
, t& m2 Q: @+ p! T/ uBIC tmp,tmp,#0x801 E- Y7 p  U6 G- b. J6 M
MSR CPSR_c,tmp
5 K0 T2 N! F6 P, p7 K! e* n}% [" P. _. ]9 ~
}4 {+ Z$ ^  y) ?) t! P  e: Z3 M
__inline void disable_IRQ(void)' `2 o! U, p" G: b3 G. @* h
{7 t2 J: M, m/ L0 z3 B) O
int tmp;
8 a- o0 P0 O) J! t- {__asm
/ z' ?" k9 O# |7 a6 s2 y{
7 s+ W4 [  ?  K- z. v# C& a. YMRS tmp,CPSR/ T& d  z4 C* u+ r: c. s# E
ORR tmp,tmp,#0x80
  a5 r& |' \% oMSR CPSR_c,tmp  M9 |/ s+ \7 _9 Y4 K( |- N
}4 K9 U4 e) `- N- Z0 k3 H, w
}
5 F/ I. l& d2 O/ i6 s3 \9 dint main(void)# S0 t3 [7 ~( Q
{$ n3 N+ i0 f% O% s
disable_IRQ();
& k) U+ ^) r- I' {( kenable_IRQ();* n) S% j- F; i8 V+ T
}

该用户从未签到

2#
发表于 2016-7-14 08:49 | 只看该作者
支持一下,很不错哦!+ z8 u) L. \6 @: ?2 X- [5 A

该用户从未签到

3#
发表于 2016-7-14 15:08 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
  w1 p7 d1 }+ W4 M4 ]9 t3 I& b% a

该用户从未签到

4#
发表于 2016-7-18 19:12 | 只看该作者
支持楼主!谢谢分享!! O4 W& H; M) o& P8 T

该用户从未签到

5#
发表于 2016-9-8 14:42 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈9 _6 P+ ~8 Q: C) h. r
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-2 14:29 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表