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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、内嵌汇编的方式,使用关键字__asm{汇编指令……},这种方式操作简单,但是限制很多,比如:不能写PC、不支持标号表达式等等,许多正常的汇编指令和伪指令都不用。
下面是个例子:1 C' {2 j, X( Y. v1 V
//******************************************
/ q" g! f- }. B2 U$ L2 g4 bint x = 3;
5 ^& }+ N' B% Nint y = 5;
8 Q8 u0 g9 h  H% yint z;
  h- Y, {4 \1 S8 t) @- n' ~- l/ ~! U
int main(void)* _9 ^( I# e( ~9 ^4 d& \
{
6 @3 V- B7 \: t4 f* {. l__asm& [" o) D6 l( c) G* Z! w* ^
{
) f0 t3 W! I  J2 Q( Y3 v2 C  MOV R0,x. a5 G% z/ N* o4 z3 g* l+ S- J
  MOV R1,y
7 }$ H6 p3 j9 k5 s4 d' t  ADD R0,R0,R1
8 n7 Q" B3 L8 p- w% C  MOV z,R0* i9 u& y! d6 K
}$ b" X2 b( B  T. V) c/ D
while(1);
% e  \7 K" A" W}
4 {& c- L! o% Z, H- U, e. T- ~//******************************************

+ C: l$ ~$ P  q" S$ M
结果即z=x+y
5 _0 {3 ]& Y: p$ `$ S! G如图* l2 V. k" ?: E' ^0 V0 A- E9 J7 j
  O) ]* d5 z3 `0 x" C

) m/ `* a( Z1 r- }6 h

( \4 i4 E2 P+ I8 c; b! H二、调用外部汇编的方式
6 O' M) D4 V$ s; L5 X1) 如果参数不超过4个,依靠R0-R3传递,程序如下:
//******************************************& R. G. {. a" C# S/ O
//main.C
int z;
extern int add(int,int); //外部链接
int main(void)
6 E( m9 @7 e8 I3 L/ k4 U: x{+ M1 m# U% m. D
z = add(3,5);
$ m$ M( l3 I' swhile(1);
2 J8 m  z9 P: y& S- ]}
3 q- h% u$ P; w4 F  l//******************************************
& l( V  R, ^" B* z
;*********************************************- |7 J" Y$ x* k
;add.S
EXPORT add
1 H) u7 }/ c/ a3 M- s9 f( _
' p: M6 ?+ @# P0 ~7 j7 }AREA add,CODE,READONLY
/ v) `1 \  {$ _. P# y- f1 \" bCODE32
8 Y; X% T4 ^. W1 W) y
- k% d- b2 B2 S; U+ {ADD R0,R0,R1
, l/ l. [& t4 D5 bMOV PC,LR  ;返回
- z# T7 `1 H9 z" X& Q3 V4 y
1 c& Q/ M% H* r4 W3 [8 s' r$ j0 ~END. i# ^) I1 R/ t! V* @
;*********************************************
仿真结果: z=3+5
5 ^6 X0 |8 d  i0 r' r5 J* f+ @% p如下图:
$ r9 x4 D4 n) W, O* p, W$ D

5 L" M' R3 u4 u: r
% ^8 ?& }. o; U+ X5 f
/ b" x( u/ E9 M
2) 如果参数超过4个,前四个用R0-R3传递,其余用堆栈传递,程序如下:' ], D$ v1 b2 w. D8 J: w% E) t
//******************************************4 {. s* Z1 G& T# z
//main.C
int z;
extern int add(int,int,int,int,int); //外部链接
int main(void)
: r* E3 E9 k. A. H& ]7 w{
0 Z5 m! t  N5 ]  zz = add(1,2,3,4,5);
9 d' L/ P! o3 Pwhile(1);" w( h" L$ W# E5 E4 x1 Y
}, d# V, C; J& A+ l. q
//******************************************

+ g2 V( j9 t- O5 X+ e" C;*********************************************4 q; A* O" g& d- U/ a
;add.S
EXPORT add
. V0 P/ a2 p/ V+ }# S6 x2 p' r# P- Z8 \! H  D+ r+ |8 g( h1 w
AREA add,CODE,READONLY
* y- Z) P0 T, ~5 _8 F; LCODE32  t/ Y" |( {9 W) p7 q" K
* Q: G3 O; V- X$ r% ?

  s- u) a; l; e1 ~) H* v" bADD R0,R0,R1
; |+ K3 i/ V" h' ZADD R0,R0,R2; t& r7 z! C' l2 |9 J0 E* w/ @
ADD R0,R0,R3: `- y! ^5 w+ p; c: I# A
LDR R1,[SP]  ;取出第五个参数
% C* g  w* c/ D1 B" SADD R0,R0,R13 m5 d- h3 P% a# E. j3 S9 r
ADD SP,SP,#4 ;调整堆栈指针,找到返回地址1 a% l$ {" h# [8 Q1 i" j
MOV PC,LR  ;返回" V2 Z9 V* P% J' Q0 v- V) A+ J

) h4 ~, N8 x4 F# |6 S7 E, y. UEND
9 L# D: Z4 g$ s; T;*********************************************

1 y9 `% Q% e( x+ U仿真结果: z=1+2+3+4+5
( Y$ ]8 Y# t! k8 u/ w9 c* z如下图:* f( Y" R6 k0 D' {" |
! z3 B% X$ y- X) w
; `. s* ^( |( R: F

5 ?* }0 m3 R" B$ k8 c. r! v$ \8 q) N! I; h( ^" V8 R
+ P5 z& D! N. ^9 T# Y, f
6 }. W" `$ j" a. @# A3 \' Z2 K3 {/ S, z2 G

( o$ L4 _$ Q, m, @2 w

: L' p% X- I7 b2 l$ o

该用户从未签到

2#
发表于 2021-9-22 14:47 | 只看该作者
正在学习2440  这是及时雨啊
2 h  f( l; O& w/ k) w. `: R: f

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-18 13:27 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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