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

内嵌汇编指令的应用举例

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
. A1 `1 f' M' M! r. B(1)2 F) {! @* R5 Y
字符串复制
6 j/ {4 |$ A' w8 d# [0 x本例主要介绍如何使用指令BL调用子程序。
  W: j- k. Y; _' d注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
. @1 t" b' H! w6 h  o% j% h1 ]示例 使用指令BL调用子程序
7 j, Y* S( Q6 R#include <stdio.h>; b6 {& R$ D2 U5 N, T) i$ [
void my_strcpy(char *src,const char *dst)
3 ]- u( V) z6 y! \) Y{
: f% ^+ Y9 s, X1 B2 o) Vint ch;
2 j* r: T" F7 F  |1 Z2 T__asm2 e( k% ~* Q3 x/ ]- ?# z
{! e: ~  R5 q! M. i  I  `: |
loop:
" Q2 I/ n; s8 ~4 X4 T1 \#ifndef _asm            /ARM版本/
8 t* m( S! n4 P$ v  w  e& G: CLDRR ch,[src],#1
* W" T! W& G( T# j2 [$ cSTRB ch,[dst],#1
6 ?8 G0 C! t; M% T/ m0 E#else                   /Thumb版本/5 F9 v% ^! F: N9 R% O4 S7 @
LDRB ch,[src]) G" X0 f7 G7 V
ADD dst,#1
1 c5 H$ _' _2 P* x* _! y#endif) B  X0 V$ f0 y
CMP ch,#0
, K: M2 g( q0 A  I1 w5 jBNE loop
4 E1 M3 E8 k: B, L% U3 Z}" M. a" e3 K5 s, q8 M9 ]# W, `! e
}* u  N' ?: Q, S
int main6 X. u. h; m/ a% M9 k
{
5 b5 E/ H) Z+ P; y+ i! z- c+ ~8 S0 qconst char *a="Hello world!";
2 B9 \, c' R6 [/ L+ b0 y+ Ychar b[20];
& S9 E( O' i, ?8 V* w. C__asm' B, C0 d4 U* z
{0 t# U, |% q4 d: z$ T( a
MOV R0,a                /设置入口设置/
: F) R2 u: I: l, ~% E) Q- rMOV R1,b* V5 K& v% ]* K
BL my_strcpy,{R0,R1}    /调用my_strcpy()函数/( L  u# b; q  d7 ?
}
* r4 s) Q- A4 `7 _printf("Original string:%s\n",a);
* D$ O' c( G) r( ^* mprintf("Copied string:%s\n",b);
( E- _- q2 X$ I$ F" d5 L4 hreturn 0;# r4 F7 H+ A. O  y7 z) }0 n
}
1 `& w7 R/ i; r: e/ B: ~# o0 o在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。
' w# a3 f2 a$ R! E0 k4 r2)使能和禁止中断: k$ Q( u+ q; x4 ~) [# p  e
本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。3 J2 X' G$ O( w  b, r7 S; X
使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。3 f3 T8 K% `) ~1 i7 M0 @
示例 中断的使能和禁止
3 E7 M7 Z, Y" \% N/ B  {__inline void enable_IRQ(void)& K% y7 y: [9 {. l% ~# P
{
8 b1 k/ s. W5 X/ S1 W  O: n" ?* [int tmp;, U2 |9 r7 B2 {& Z9 U. V+ s
__asm
) \3 f- ]' U2 t+ t6 X# A. Q9 S+ I& |{3 D- {/ n1 f( n' L7 M
MRS tmp,CPSR- i) f6 O" c$ R7 p# g& a
BIC tmp,tmp,#0x806 Q1 h  }# `7 u# t% [+ q6 i
MSR CPSR_c,tmp$ r% k6 ~$ n% ]+ i) F! X
}; O3 P, X6 N; R3 r% _
}& ]4 u- _1 ]% z) ]" E- a' u
__inline void disable_IRQ(void)
+ b) W0 D" o5 b* P* D0 \- T{
; o' r6 ^1 P$ ^3 Vint tmp;
7 E& }  k% m& C8 n__asm/ ^' ]* P1 [8 O5 I
{' m9 y4 K: |, e( J; i/ n2 j
MRS tmp,CPSR# m( z+ i, o$ M" k0 L
ORR tmp,tmp,#0x80
1 x7 D) E, g( e5 k2 h: S7 xMSR CPSR_c,tmp4 J/ T0 _* F; o4 ^" e
}
' Z7 Q/ n! J/ u}  m/ |- ~$ U/ Y
int main(void)
3 r- ~8 k: P2 @- V$ z{
2 j1 d; K; y# M4 u& S2 S' Vdisable_IRQ();
0 n( w" L8 u9 R/ r1 Nenable_IRQ();
* k3 {, z+ N8 a$ i}

该用户从未签到

2#
发表于 2016-7-14 08:49 | 只看该作者
支持一下,很不错哦!6 C: S( K" T6 i+ H

该用户从未签到

3#
发表于 2016-7-14 15:08 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
1 t, S- ^% g5 v. {9 S

该用户从未签到

4#
发表于 2016-7-18 19:12 | 只看该作者
支持楼主!谢谢分享!! h# Y& G/ p7 P. z$ v: H

该用户从未签到

5#
发表于 2016-9-8 14:42 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
7 N5 z7 @% S5 Q4 j' R: s( k  Z" @2 P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-12 10:18 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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