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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、内嵌汇编的方式,使用关键字__asm{汇编指令……},这种方式操作简单,但是限制很多,比如:不能写PC、不支持标号表达式等等,许多正常的汇编指令和伪指令都不用。
下面是个例子:
6 A. c1 b7 X0 D- K/ \) Z% q//******************************************
) I1 Q$ L2 }$ y. g" pint x = 3;
6 ]3 y9 s: d0 Q6 ^# y/ d$ v0 [int y = 5;2 ?# V( f3 D6 n
int z;7 u: Y0 j8 y3 o- J5 E$ Z. P- ]

2 ^1 V4 ]/ \, G# S- [  `int main(void)
, p: {0 E, L5 S0 A8 o{
3 M, q" W; a- }# ^8 T; W" w' q7 z__asm
- N5 K3 v& b% i{
& a' p8 _' l0 }- U  MOV R0,x
+ h! n/ b3 s+ a( e3 r3 W  MOV R1,y
- [6 X2 [8 }$ C& `5 ?0 M2 M9 R  ADD R0,R0,R1
, Y. J; p; [  Y! c5 n/ }  MOV z,R0
0 o$ E! p8 F9 s# E" f$ E}6 t2 C5 I# [2 J" e8 R  a- `
while(1);
7 |' ]8 t% D% H7 d- p! p* \! I}2 N" A4 O/ A. A& `
//******************************************
5 `4 B' `3 |1 O7 V% l! n6 m0 a
结果即z=x+y9 [" X* b3 z! g! k; a
如图
3 v- U1 m! t- y. T! T" k

6 }1 H( s. h  F
# ?* m$ R/ d9 S

" k7 J; |, b3 M% ]二、调用外部汇编的方式- V3 n" V; {1 m3 d: O
1) 如果参数不超过4个,依靠R0-R3传递,程序如下:
//******************************************3 u! u& U7 f. q! J
//main.C
int z;
extern int add(int,int); //外部链接
int main(void)
3 }0 J7 {5 |8 j% x; U4 b9 z{
$ ~, D" L  k2 j* }, ]z = add(3,5);0 B6 Y& P& Z2 s$ p' Y% r: f. g) n
while(1);9 L* y8 X6 y6 w6 M
}. `& Q3 P" w  g$ u& `8 L! R
//******************************************

8 j* b  a6 z- l& q3 y) E;*********************************************' S" @2 A6 z, O2 u
;add.S
EXPORT add9 y( Q  M, f! p  v
' D6 f( X7 Y1 i* Y+ Q& F" u
AREA add,CODE,READONLY
6 z, F+ A; H; a/ ]CODE32
9 @" ?6 A% b% H6 \- }
' q% }& Z# M* h" C& h  n" l$ OADD R0,R0,R1
6 N' h/ T6 i3 P9 @, c) EMOV PC,LR  ;返回
1 F) m5 z6 Q' P  w$ x2 r1 M$ O' w# I' t8 u. U. P7 l
END
/ s* Y( F2 W4 ~5 w9 A7 e" r;*********************************************
仿真结果: z=3+5
( L, L& `6 N/ _8 [如下图:
0 v- V$ \: U" b7 m% n: ~; Z; h
4 y- c" g5 |' _& c; p
0 t/ E/ M' e& z# B
9 O8 j0 S0 v! n
2) 如果参数超过4个,前四个用R0-R3传递,其余用堆栈传递,程序如下:
5 t! u  M: O, l& r0 s+ j  I  X//******************************************, d9 q$ v7 Q; ~1 x, ~: z
//main.C
int z;
extern int add(int,int,int,int,int); //外部链接
int main(void)9 _4 ?- R& d* h- p$ w* H
{. z) ?* X( ?7 A& |  c& p
z = add(1,2,3,4,5);
" g9 M0 U" U& ^4 V/ J6 Bwhile(1);" d' N. }& e/ _. S, T- t
}& s4 ~. e" B2 Z* [
//******************************************

0 p& V; N0 f5 D6 G! {7 n;*********************************************
# n+ i- l& Z4 `8 r;add.S
EXPORT add' I+ P/ R8 o( z$ l( {& p: ?

- P+ `1 ]6 M% N0 n0 iAREA add,CODE,READONLY
, q: `" q0 x9 {- \CODE32
6 n2 F* Q" W6 @/ \4 t/ I1 W" D4 p; X
" Q/ g2 N4 f6 k5 w$ a+ O; d# Y
ADD R0,R0,R1
  Y7 U! ]3 d2 Q& I9 X, Z( |( mADD R0,R0,R22 c+ n5 G' l4 F
ADD R0,R0,R3& @: V2 O1 m9 {. _! }8 l4 I
LDR R1,[SP]  ;取出第五个参数
- v8 ~) H7 y( I2 {ADD R0,R0,R1
6 p  t0 E$ D% b9 y" z" W# V& YADD SP,SP,#4 ;调整堆栈指针,找到返回地址
+ f2 }9 k0 O9 y) W$ EMOV PC,LR  ;返回2 C7 ]1 T' x3 S7 {

# {4 h/ [6 Z% J, Z0 j4 k7 HEND& X1 B( E& p- N$ a; z
;*********************************************

* e/ H8 [" N1 E/ P: [. H7 I仿真结果: z=1+2+3+4+5
1 W. i* l1 ~- i: F如下图:5 p8 K( m7 E# r+ D

8 y0 p2 ?* F0 g$ w& ^2 @, Z
7 y/ J: ]( L, H0 Y

- f$ X$ O+ w7 o# d; Q/ i# b' _6 L
' x  {, v$ G( G) i" I  J
9 Z: y$ {. X/ z& j/ i3 H9 {
/ B& C6 |! Q) u) X  H4 Y

$ s' w! t( u4 Q. ]8 o: g  J4 r
; t; q% x( U2 F- L

该用户从未签到

2#
发表于 2021-9-22 14:47 | 只看该作者
正在学习2440  这是及时雨啊% a8 |6 F" `* J

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-21 17:47 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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