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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、内嵌汇编的方式,使用关键字__asm{汇编指令……},这种方式操作简单,但是限制很多,比如:不能写PC、不支持标号表达式等等,许多正常的汇编指令和伪指令都不用。
下面是个例子:
( z+ e/ L- l1 s$ T; O0 F//******************************************* V) W2 P/ {4 r5 `
int x = 3;
; |* z4 P, J  u9 ^int y = 5;" d( V2 F5 m+ Y" w( U
int z;
' m$ c: t& k1 J8 I7 g1 x3 |( W& \( \6 B( G( n+ @  e; e1 M
int main(void). _$ e6 M( S- s
{
9 h! Q  W6 k, V# U' c/ ^__asm3 Z6 P. k! }6 {/ Y+ I0 ^8 f
{
, a7 D+ o$ ~) a& w% D1 e; n  MOV R0,x) r/ Z4 z* Q$ O
  MOV R1,y0 o; C* ?) b" e) r8 X% E- F2 o" P
  ADD R0,R0,R1: R% Y: _- s( ~8 _
  MOV z,R0
# a+ K0 l9 n. I, E% ?" m. x}6 e% j9 h* j/ }" O; @: t; Z
while(1);( s# J3 S  f9 _# x
}. [7 M) I) m! j. \$ u
//******************************************

& l% X& u+ T" d+ `) J: V
结果即z=x+y4 i  H4 U4 ]; M/ |  m4 ^
如图
1 j3 g$ L3 ]9 i% c

5 Q3 O" G' b, T3 G' b4 `) l

! O% d# l# C! f* C6 Z2 O
2 Y( U' z1 w9 t! n8 J3 ~" B3 A
二、调用外部汇编的方式; x6 l0 s0 L! n& `
1) 如果参数不超过4个,依靠R0-R3传递,程序如下:
//******************************************
! `( A& u2 u; y) V& R5 p. ^! m  ?//main.C
int z;
extern int add(int,int); //外部链接
int main(void)
9 Z  k* B! y; x& [5 C# w7 T{
# g3 n1 t  s# ]z = add(3,5);& a1 i( h7 n  V6 ^
while(1);
7 S7 b' A" V' p: B/ d, w}( B9 n  i0 I2 c& ]6 I, O7 T
//******************************************
! S2 n: M. y4 j2 r, ]: H6 Z
;*********************************************8 m6 P' _5 n6 O
;add.S
EXPORT add6 C4 {; I+ e9 M* C7 L0 b! b4 h

, N1 l2 g1 {3 Q3 lAREA add,CODE,READONLY
1 v- e) B& F4 }* I! z' v+ ?) |CODE32, z. w( k- s. c6 b

7 w* Y$ q; Y, ^ADD R0,R0,R13 f" j; I4 d" ~5 e* P! Z
MOV PC,LR  ;返回$ |, s2 W2 S: F, e4 C

- D8 G& n6 s) j# Q4 ~( QEND) a4 b) B$ H8 M8 r0 V$ t8 p2 t4 T
;*********************************************
仿真结果: z=3+5
4 N3 e& r* B; S如下图:+ s+ Y- e5 V4 G# `

6 x! H# S; H- ~

& R1 U1 O2 ~% T8 t4 p! c7 w. y" F9 _) t
2) 如果参数超过4个,前四个用R0-R3传递,其余用堆栈传递,程序如下:
9 V- h2 B/ Q  k! [: n  \2 E//******************************************+ v3 _% W0 j) a0 l4 e
//main.C
int z;
extern int add(int,int,int,int,int); //外部链接
int main(void)* J3 r7 t1 D6 E  D
{* h/ G2 J/ r9 j; T& L8 y0 ]
z = add(1,2,3,4,5);
& G7 z! J8 b8 E( O2 T: Kwhile(1);) y. [8 c& O: x; g( f, _8 U- u
}7 ]  x% b. z: D
//******************************************

1 J2 |8 R! P) u;*********************************************" j/ [; Q( U) L* [. h- g
;add.S
EXPORT add- j& ^& E5 A. t. S) T1 F- a$ Q
7 [: W/ I% |  U& S, O2 d
AREA add,CODE,READONLY8 v' f: d5 m4 O0 H7 p0 }( U( q
CODE32. l) I# e4 T, o2 y

; o9 v9 S$ t+ e2 v/ q+ a
4 \/ w4 \) Z# v! U1 s% K0 U# {$ mADD R0,R0,R1
" {! K$ t- a1 T. Q, F: [6 s" eADD R0,R0,R2
- E3 H! \) @& V" u4 ^$ rADD R0,R0,R3
' x: N  F  |7 _6 d9 M+ o. _LDR R1,[SP]  ;取出第五个参数
7 V  G5 I5 D1 S7 ?( [! EADD R0,R0,R1, q0 o0 |/ S9 N8 i& C8 G
ADD SP,SP,#4 ;调整堆栈指针,找到返回地址2 j/ X! s4 h: P1 w5 l9 c
MOV PC,LR  ;返回- P/ h9 Q, K% y8 _

) P( O7 H0 C% c/ ZEND
/ C9 H/ H4 s4 r# j* F) H1 Y;*********************************************

/ U( k" Z8 w* m) a6 a% b仿真结果: z=1+2+3+4+5
# E# f: ]; d  |6 w2 \( E如下图:
* M) y' n6 K+ B9 {9 e. ~) N

6 b# m0 ]: \, x! m) u- E) K
; F% {+ ]8 s; w& c

$ s2 a+ F2 F7 c$ |9 Z- h$ D; l- H
0 T$ u- m/ k5 s2 V3 t' @: s  S
. r. Q& a" y: a+ b, U1 T+ a8 O

0 W; B( b" P! @% I$ ^
9 V5 K6 j  Y$ H, [2 ^

该用户从未签到

2#
发表于 2021-9-22 14:47 | 只看该作者
正在学习2440  这是及时雨啊5 P  h1 u+ _% @, t

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-20 07:07 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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