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

内嵌汇编指令的应用举例

[复制链接]

该用户从未签到

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

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}

该用户从未签到

2#
发表于 2016-7-14 08:49 | 只看该作者
支持一下,很不错哦!9 G0 W2 o4 i0 Z* g

该用户从未签到

3#
发表于 2016-7-14 15:08 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
% ]9 t: e6 ]" u9 B; _4 Y, \

该用户从未签到

4#
发表于 2016-7-18 19:12 | 只看该作者
支持楼主!谢谢分享!( _" B9 g7 D4 i, }* S. U2 L

该用户从未签到

5#
发表于 2016-9-8 14:42 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
* c9 c# Q3 [6 j$ [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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