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

2440裸机编程之一 C语言调用汇编语言编程

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、内嵌汇编的方式,使用关键字__asm{汇编指令……},这种方式操作简单,但是限制很多,比如:不能写PC、不支持标号表达式等等,许多正常的汇编指令和伪指令都不用。
下面是个例子:# L. r7 e( M7 e% z2 L) O
//******************************************
# g0 P5 F! {0 E0 B& _int x = 3;
; ~9 Z0 }/ Z! M! t1 x  zint y = 5;
9 E& {8 G& {6 M5 a& U7 I' hint z;
, x% F0 ]8 }: {, @" g- M
, j; _, {) I( iint main(void)
1 f/ e. t( _3 ?7 z{6 m/ \. U* b% F% T
__asm$ ^7 P4 d7 o) F+ X
{
& [, U9 l8 w2 A; O, z7 j  MOV R0,x
/ J7 O, V) ^  m3 i. p+ T  MOV R1,y: o+ Q  Z: X- h6 Z4 P! ]
  ADD R0,R0,R1
2 `) I4 E% R9 E: I2 G8 S  MOV z,R0: J) N0 g5 d6 X! J9 q
}/ P7 b. q6 @9 n2 l
while(1);' V5 V# x0 r) }% j* V  ~& o. K- A
}* w, K( a# y* Z7 U) h2 t# {4 n
//******************************************
/ v) C& [2 h  L/ A6 j/ w1 T
结果即z=x+y% o: U; ^% n+ b. {+ a8 s$ W5 l0 F
如图
/ }* [! W8 Z( _( b
9 K) e2 T5 P( H0 X; q- o( T

3 k$ P6 w! p  v- U( Z& O* f) T

" K4 O. T7 Y  y- j, o二、调用外部汇编的方式
. _1 p7 M2 e9 \0 `4 E4 D- y1) 如果参数不超过4个,依靠R0-R3传递,程序如下:
//******************************************
& f: y  J* R7 L' E8 J//main.C
int z;
extern int add(int,int); //外部链接
int main(void)
/ E6 [3 f+ ~8 X- o{
  q* G. u& ]7 w2 I4 F( yz = add(3,5);
1 P/ X& q( n7 |8 C! |( Ewhile(1);
% D# B" X) K: f6 o1 l}
3 a3 j& u% U# }* \" y6 \% u//******************************************
6 x$ F) k. p: J* G8 `0 b2 o3 [
;*********************************************4 h4 [& w9 k+ @. `+ x' K. ?- T$ H  q! S6 V
;add.S
EXPORT add& {$ v7 E2 u" M$ E+ E7 |+ O

0 q2 l) V- V: I6 ?# j/ TAREA add,CODE,READONLY% C: t/ D' C: g6 ^
CODE32
9 X# g$ L, [$ |  v- V( y3 e4 o5 L
2 P& Z; a% h( c2 U  [ADD R0,R0,R1
$ Q% G& l5 j% lMOV PC,LR  ;返回
) s: I  N' o, N" R- }( L- I6 f* V  s6 W, S
END: E8 @. u% s0 N& f
;*********************************************
仿真结果: z=3+5
5 O/ \/ Q( }6 I$ Z- c+ t如下图:
2 |' U3 s9 f. {
) e6 X$ q  o1 F' J6 R
% C0 h6 G- I+ R- h

7 i9 m! L- u6 s' Z" {
2) 如果参数超过4个,前四个用R0-R3传递,其余用堆栈传递,程序如下:
6 ~' [1 A' l# y1 u0 \3 _9 `; h  r) A//******************************************5 e+ s+ [  }3 f" ~
//main.C
int z;
extern int add(int,int,int,int,int); //外部链接
int main(void)
. e& A/ O9 `* J2 h( w/ d{  \( l# ^4 Y$ R. u9 u1 Z
z = add(1,2,3,4,5);- j  s( ]3 ]# {! y9 o, w# |* f  k
while(1);
0 u/ w5 |5 q% M; \}- V5 v' ?$ [( J8 C/ F% T) ]
//******************************************
8 M7 k+ |4 _: Y8 u( _% F
;*********************************************- |/ m5 N9 j/ D. P
;add.S
EXPORT add' T5 x+ A2 K. I* e, I# }0 O8 ^

  H- j1 f  I% \" L, Z# U  t) `7 AAREA add,CODE,READONLY4 q" f2 y+ ]  k  d: ^7 f4 A& c+ \
CODE32
2 R3 U/ g% `" ]% q6 f3 {7 T- o3 r. e$ [% w

8 O2 ~( [1 {( ?6 G5 W* sADD R0,R0,R1
# ~6 T3 R+ Y* [4 |* _( qADD R0,R0,R2; x$ h. o4 V1 a$ K
ADD R0,R0,R3
  A9 S7 K" s; x8 r. h  \+ qLDR R1,[SP]  ;取出第五个参数
/ x  p& ~; q8 e4 AADD R0,R0,R1  a$ ^  _. x/ z+ c+ W8 |
ADD SP,SP,#4 ;调整堆栈指针,找到返回地址& @5 H6 Z5 ?- X$ F9 F0 J
MOV PC,LR  ;返回
. g! f+ u6 j2 F3 \  X: \# N8 E
1 k6 O, I% T0 m$ T( ^- cEND9 N3 S& _- Y  x: h. |( B8 y
;*********************************************

4 V% s& h8 h, e仿真结果: z=1+2+3+4+5  A# [4 B9 U, P' L# a# D" T+ a
如下图:
! x- K7 _" u$ R; N* D! z  `# O

& Q3 I9 Y: ]/ A$ ?& J- V) _

8 t& e. t5 l% T9 `9 j4 k% ?8 g4 R; |6 e% b; W& ?

0 b  p( d1 J$ a& S2 w
! l% P  h0 S! I) b9 S: n! X4 x& f! J1 s6 v6 d

/ h* g; _1 c4 a4 Y. n, J

5 ~6 Y/ T# o# w: {. p

该用户从未签到

2#
发表于 2021-9-22 14:47 | 只看该作者
正在学习2440  这是及时雨啊
5 l8 D2 w8 S5 P5 k0 k- ?

该用户从未签到

3#
发表于 2021-9-22 15:51 | 只看该作者
学习了      感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 22:58 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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