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

内嵌汇编指令的应用举例

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
下面是在C语言程序中嵌入式汇编程序的例子。通过这几个例子,可帮助用户更好地理解内嵌汇编的特点及用法。
/ e4 q! x, V# a. Y9 a1 ?0 D% S(1)
( i7 K- |4 H3 k4 C2 T5 ^, e! K字符串复制
2 i/ X. L9 a9 M* h  v% ]& N1 T# l6 w! w本例主要介绍如何使用指令BL调用子程序。9 e) [' I/ R5 O7 z; g* x0 N
注意,在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加3个可选的寄存器列表。在这个程序中就能体现这一点。
7 o# K2 w* m2 C; o8 w示例 使用指令BL调用子程序
9 k9 r& s5 ?! D! T; D#include <stdio.h>% P$ w7 `$ U0 Q0 Z, U
void my_strcpy(char *src,const char *dst)
" ]* A5 @& ^7 d7 \% V{
+ P4 E7 Z5 d* ^; H9 Zint ch;# W& @" n9 W4 r1 ~4 U" J- G! x1 ]$ g
__asm( b" y2 `; R% ^
{
. z# q" U6 h" yloop:# Z- o4 R+ O/ c9 m2 J/ g" n4 \3 L( B
#ifndef _asm            /ARM版本/
& p5 f+ c4 y% ]5 MLDRR ch,[src],#1
4 Q! t' u2 j$ s$ s7 }" ?STRB ch,[dst],#1: w4 w% Y& A6 K$ l! u( O! ^
#else                   /Thumb版本/& v6 G) M% U- v8 q3 q+ w6 }
LDRB ch,[src]6 \% l7 R/ E7 c( `
ADD dst,#1
: j4 t8 i! p4 |, n& j! B#endif
/ a! ~) R7 C! yCMP ch,#0, E7 n# v+ M4 ?' ^
BNE loop
7 |  [1 f  M* Z& S! ^, k}
# k9 b1 A" g$ w) \}) e6 C4 V' x$ F
int main" d( O$ N" G, \2 V
{6 l6 J* y8 }0 ^2 w7 q' b9 D/ g
const char *a="Hello world!";" I/ E2 N9 q% S/ \. N
char b[20];# }& G. Y8 h; R  U* R
__asm. Y4 T! ~- V  J2 }$ B
{
+ S, i/ a& f3 x2 Q7 P* Z* aMOV R0,a                /设置入口设置/* k. V, A. H5 K+ }
MOV R1,b4 S5 F* n- N( R, G
BL my_strcpy,{R0,R1}    /调用my_strcpy()函数/' |6 i7 w' _3 U( ~- l* f7 ?
}% }4 J0 R; d% s% ]+ ?
printf("Original string:%s\n",a);
" l/ Y! ]* k- P8 N" _printf("Copied string:%s\n",b);; I/ @( c8 ^7 g* C1 _4 K: N' ~% f8 W
return 0;4 |2 T' W1 b1 C8 |0 K
}
+ {8 f( L' \$ B5 [: `: a+ m  F: s/ n在这个例子中,主函数main()中的“BL_strcpy,{R0,R1}”指令的输入寄存器列表为{R0,R1},没有输出寄存器列表。子程序使用的工作寄存器位ATPCS默认工作寄存器R0~R3、R12、LR以及PSR。
0 E1 G* e; K- E1 I7 J, ^2)使能和禁止中断
+ W" J& W8 M- G1 J! m- c本例主要介绍如何利用内嵌汇编程序来使能和禁止中断。; O0 g8 \6 r' h- i9 \4 D7 A
使能和禁止中断是通过修改CPSR寄存器中的位7完成的。这些操作必须在特权模式下进行,因为在用户模式下不能使用修改CPSR寄存器中的控制位。
3 M4 G  @+ u  y示例 中断的使能和禁止4 r0 E$ S1 a! e2 I; Z3 U) `
__inline void enable_IRQ(void)' r9 P: ?( ^: F/ S; }
{
" m! n. w, }+ E' ^$ Bint tmp;
3 R- ?# Q" |/ `) A/ K__asm
, b: D; V, C  s0 f! ?{9 Y+ w6 e4 u' y3 w) e: r
MRS tmp,CPSR
& G: T, A; w; M  U( k1 BBIC tmp,tmp,#0x80! i4 D+ H# d5 y! E" x& N: _
MSR CPSR_c,tmp3 D2 d- \2 d9 m0 C
}# @! w. T# R3 [1 z) \$ n! G# v# A4 L
}
; H9 F; {. P$ j" b, `4 Y$ u__inline void disable_IRQ(void)8 D5 {0 a1 v% o# k" t5 F! P; {
{
( ]. m9 c7 t7 B) Q) lint tmp;
2 I4 G) M7 k$ T& T! L& ?__asm
) P  |* `' d7 F% t{" g" C: d7 g/ a/ Q6 w1 |. ?7 E
MRS tmp,CPSR
" N/ m9 M9 |1 D# f5 G/ j- F/ c- \ORR tmp,tmp,#0x80
6 Q4 v  x9 M! q( ^' SMSR CPSR_c,tmp, @$ T7 z7 J; p4 X- [2 W) `
}
: q2 q8 z' P2 w& O}! r0 O* V2 l. [: G
int main(void)
' x) E: L9 l1 k7 {# D: G{3 r/ l9 E  S1 |8 j0 Q4 ?% |
disable_IRQ();
4 x& @- m( }* c9 p% }' ~enable_IRQ();7 }0 x* X' v) D, w2 g) ]/ L4 P
}

该用户从未签到

5#
发表于 2016-9-8 14:42 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈; L* U* o0 k0 S0 a) I+ W$ F1 d4 L7 o4 F

该用户从未签到

4#
发表于 2016-7-18 19:12 | 只看该作者
支持楼主!谢谢分享!4 L8 K6 n  P; ~$ h3 ?* Z% E* }

该用户从未签到

3#
发表于 2016-7-14 15:08 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
0 K: f5 B8 k5 \! i

该用户从未签到

2#
发表于 2016-7-14 08:49 | 只看该作者
支持一下,很不错哦!" [  m- u" N# A& B7 J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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