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

内嵌汇编指令的应用举例

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
  O7 L/ r( Z8 n# Y+ d0 Y7 f(1)# i0 ]4 x& s. ~5 ?7 M" \
字符串复制
: A' `0 S6 f! {1 p( T本例主要介绍如何使用指令BL调用子程序。2 y* t7 v6 Z3 w8 k4 ?% U
注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
: w6 N3 k8 ]% o6 Z6 m% j* x3 L4 V示例 使用指令BL调用子程序
% `  b0 I; I& q# f. Y  I& v$ V# F. v#include <stdio.h>/ Q, T  m; ?. k7 s) S9 x" _
void my_strcpy(char *src,const char *dst)" `# \# U4 e9 F3 r' g8 i2 D
{
1 [  q! Z2 F; m; T) ]) e  K- mint ch;6 b% O9 o  _& I" m# p! |. }+ ~
__asm
, W, c8 ~8 y. p. d{( [5 ?! \+ @( h( S: m7 K/ H
loop:$ p$ w7 a- d4 h. F3 N
#ifndef _asm            /ARM版本/) W* n6 D6 N: i. q$ t+ z2 y
LDRR ch,[src],#11 q% r2 {+ w/ `; `
STRB ch,[dst],#1" q$ _  {. \( ~- ^
#else                   /Thumb版本/
2 N# _0 C( b# `8 y2 kLDRB ch,[src]
7 H9 [, x3 ?! z$ @ADD dst,#1% D. D( [$ k* s" H7 i( v! [
#endif9 O$ R: ^$ |* ~
CMP ch,#0# W/ Q. R, M4 ^: l
BNE loop4 s2 J/ h5 W. y( u, {1 J: N3 V
}" i4 w1 C5 U. F, k) g
}
3 w1 C. G& t9 K/ d4 aint main; [/ s( w2 ]; o
{/ g1 ^- Q) D7 s: A
const char *a="Hello world!";6 z, F" I' }4 E2 E7 `9 h1 T
char b[20];
3 R$ X1 `) e3 r4 i3 M5 i. ^__asm
. ~' y$ M7 N) S2 V, T& }; |3 L{6 ?" c# S0 b( d3 q' y3 [
MOV R0,a                /设置入口设置/; C/ A  \! r+ Z/ @! C, Z6 S
MOV R1,b! M8 Y. p/ a; a. b9 t
BL my_strcpy,{R0,R1}    /调用my_strcpy()函数/
' S. `: C- `2 }}
5 n( F3 g+ Q, z: wprintf("Original string:%s\n",a);" ]+ Z' S; A+ S- o# G6 k' M
printf("Copied string:%s\n",b);% S% U* \" l' F8 E1 N) |. Q
return 0;# b) y) B- c0 {" l: q
}  B: q, K6 \0 `4 Y5 s! I
在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。2 s* F5 X* ?/ S' @+ ~
2)使能和禁止中断
/ L7 X8 n! c9 }" ?本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。
. N5 w% w8 x) }$ p. j) \使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。2 m! G' G" K7 X0 }
示例 中断的使能和禁止2 s( s* L1 m7 g# R* b4 ^
__inline void enable_IRQ(void)
) k8 D1 Q: v7 S: S7 f8 {1 g{! l3 O. @0 C- K- K
int tmp;
# i& C! l3 ]+ P8 s__asm
& W/ l% N/ i8 F5 x  x% ~{
  n; {  \9 V. m( _% a3 fMRS tmp,CPSR
5 i3 I& j4 H; q) T+ ]/ jBIC tmp,tmp,#0x80
5 H- y/ H% b6 j6 |. M1 I! [MSR CPSR_c,tmp
% a: |' N, j9 Z0 f0 ~. q  |}
* @* w3 O/ U9 T1 J! n. W: J}
5 o1 y8 k" f% [6 r4 S__inline void disable_IRQ(void)) a+ M- |- x7 }# ]: t
{7 A- \( k, s4 b( `' D4 _
int tmp;
0 w) P7 R  d- A  [% |+ X1 L__asm
# k8 z3 d* ?$ ?3 y2 A{9 j, J7 }8 ~5 F( D1 L. V
MRS tmp,CPSR
1 j8 T' s, I, ^: o* uORR tmp,tmp,#0x80
0 `1 m/ f% `% \5 BMSR CPSR_c,tmp$ _% u2 b/ m9 e
}
5 Q. M9 r) C0 r, [2 }}
% e. y% A& l& L% z+ @+ z4 uint main(void)
1 y9 y' i. }1 Z. G* `5 n& u& I{
! z9 ?: ?# c. [" Ddisable_IRQ();
! R) A0 _  u' e6 k$ |; `enable_IRQ();
% {/ j" a2 O0 v" T  L% T3 S+ q9 g}

该用户从未签到

2#
发表于 2016-7-14 08:49 | 只看该作者
支持一下,很不错哦!2 X$ [) ~! e3 S' h

该用户从未签到

3#
发表于 2016-7-14 15:08 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
/ L) j+ a0 o1 ^9 E: r( J7 W

该用户从未签到

4#
发表于 2016-7-18 19:12 | 只看该作者
支持楼主!谢谢分享!
9 K4 a: _) F- G0 x. s

该用户从未签到

5#
发表于 2016-9-8 14:42 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈# S1 z6 @! Z5 N3 A) R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 21:15 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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