一、内嵌汇编的方式,使用关键字__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 O2 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 |