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

内嵌汇编指令的应用举例

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。) M& H; {6 J, R% S! b  b
(1)
. |9 a- b8 e' i' P9 c7 R) }( H字符串复制
' e  R2 g2 H$ U本例主要介绍如何使用指令BL调用子程序。$ {$ v8 ]0 V' f/ N  B" }
注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
4 W6 _' K  F5 \) l! Z示例 使用指令BL调用子程序0 @! D$ r( O, C7 ^+ t& S
#include <stdio.h>
; N  z9 K; Q/ }- Z5 b  u3 lvoid my_strcpy(char *src,const char *dst)
; O) B/ m7 T& S8 A2 d& y0 N{
, Z+ V: g2 W4 Z- \& w/ b8 }1 cint ch;
( T  k3 `" z6 G" n" U__asm) s+ }8 g" N! H8 \0 j
{8 H& ]/ P6 j2 {) @7 _  P
loop:' z; Q, n. X) ]$ `1 J9 n2 M  X
#ifndef _asm            /ARM版本/
- Z' s0 j  R% g  @) [# l. W' I! HLDRR ch,[src],#1' Q2 s) e$ @8 h3 n$ F; i  C; c
STRB ch,[dst],#1
! a9 W' v* ?- M- ^#else                   /Thumb版本/$ Z9 }; }9 ?) D" ~& S
LDRB ch,[src]3 O- \  i: ?, T' L
ADD dst,#1! r5 j0 v% E0 n7 t( f7 C  W
#endif
2 M* ~0 j+ P! @- h" [) n3 iCMP ch,#0: |8 O+ D: w  x- G3 g
BNE loop8 z) n8 `! R7 |$ d" C; ~
}
( [/ W# g: Z# D( y; B3 ]4 ~3 U  ]}
: g! D1 I0 s+ kint main! ]4 v2 W5 I7 m. \. G& X
{/ S7 _, S, N$ u2 v
const char *a="Hello world!";3 S2 F9 O4 O. M. Z5 {' V- a: [
char b[20];
) w; w( F8 n1 M0 I& ]__asm" [, J& H+ ?4 g4 n6 t: ]
{+ p6 Z' W7 [" G4 S. G
MOV R0,a                /设置入口设置/% d6 x- H% j3 F+ {
MOV R1,b4 }( P: H+ k  i; R( P% O* L
BL my_strcpy,{R0,R1}    /调用my_strcpy()函数/, V+ g" J& D+ [3 C
}! |% Q7 w; ]+ B" @, I3 f
printf("Original string:%s\n",a);6 n' C  G) l4 x% f# ]6 r2 u
printf("Copied string:%s\n",b);/ l/ j+ G- V0 R; w% @9 \. _9 E
return 0;
' j! ~9 v0 L' U& N' D4 @$ ~! Y3 `4 Q}6 [) B. c0 a! K  V' }/ P+ C. d
在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。
& Z3 T& ]+ E) d6 L2)使能和禁止中断: c1 M" g: j7 }6 @
本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。
: V) X; a6 _' v/ X8 G使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。2 p8 D2 S: ]: s; _, _$ i  M- Y
示例 中断的使能和禁止9 K( |4 t1 p) G7 W; ]$ J) W
__inline void enable_IRQ(void)
; ~8 b  ^3 F4 S% e* L) d8 U{
! q1 f1 D. x  E8 Z+ vint tmp;) ?: n0 Q) N5 F% ]
__asm* H0 A5 l* F0 a1 J, u/ Y4 `% {
{
, c% l# j1 k/ u& eMRS tmp,CPSR
' i/ W9 |0 B# p4 T) P9 @0 e' ABIC tmp,tmp,#0x80
) k. u# ~- Y4 O, x* G& z3 qMSR CPSR_c,tmp$ d: E8 G5 \: M6 `* A- j0 U! X
}
% S" T- }; Z, }! y! W}
; F# d2 {: h% E0 z& X__inline void disable_IRQ(void)$ P! i6 ~! p2 i- j( ^1 n0 D
{' Y' `! r* k+ J. ~6 g: N9 f& S
int tmp;
. q! [+ a7 C6 u) [- j$ H__asm
0 k0 l5 s( ~0 i& i: J{1 Z5 `9 w! w( p2 w# g) m
MRS tmp,CPSR  }* E5 p+ W' Z( g8 k4 K
ORR tmp,tmp,#0x80% p# v4 k* d9 F& K( Z' i3 |
MSR CPSR_c,tmp0 Q# S" F. j- y& s9 Q7 T, I2 v
}
* m# O; ^4 R0 l9 ^9 a# H0 x}! Q. {8 n7 A# R$ @/ S3 a
int main(void)
/ W1 v- A" b' _* f7 Y{- i5 f8 A+ ~+ z# m# J/ C
disable_IRQ();
+ s2 H7 ?' Z7 z5 S1 x; Oenable_IRQ();( u3 v4 G. f. M2 y5 J9 ^6 }6 U5 n
}

该用户从未签到

2#
发表于 2016-7-14 08:49 | 只看该作者
支持一下,很不错哦!0 ~) t% i6 f3 K* C0 R4 G# J# e

该用户从未签到

3#
发表于 2016-7-14 15:08 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
0 p$ ^* V, X. ]2 P) I% G8 u7 g

该用户从未签到

4#
发表于 2016-7-18 19:12 | 只看该作者
支持楼主!谢谢分享!9 R. H6 H3 L/ E  G1 ~

该用户从未签到

5#
发表于 2016-9-8 14:42 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
& u# V6 n! z+ y4 Z0 w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 22:57 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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