EDA365电子论坛网

标题: ARM体系结构与编程学习(10) [打印本页]

作者: piday123    时间: 2021-1-20 11:04
标题: ARM体系结构与编程学习(10)

$ F- y4 f+ C4 x0 H3 f/ {第六章 ATPCS介绍
; x; A; c/ S- U- h9 y2 z, f4 {3 o! R$ T' G9 g
在汇编编译器中使用-apcs选项。) ?' o( W. F5 f- a: S- }; h, w

3 P& W9 ~1 a: @$ ]0 m( w5 n6.1.2寄存器使用规则+ g2 ^/ @' F+ R4 P. G$ k& g7 C/ k0 F

; n$ l  b: @. b% s  X子程序使用R0~R3来传递参数。用R4~R11来保存局部变量,thumb使用R4~R7。R12记作IP,调用scratch寄存器。R13记作SP,用作数据堆栈指针。R14记作LR,用作保存子程序的返回地址。R15记作PC,是程序计数器。- h7 i, J% J4 H0 N& X' u

3 M" o/ o' T6 v7 g# J4 x5 i. U6.1.3数据栈使用规则' a8 h  L, N! |7 B0 _  o$ }! z  h0 n+ M

" ~" R' b/ v3 i, g9 S有四种堆栈方向:# ]( P; O5 _4 s$ s$ \2 r0 [$ M
! m% D8 U& q- H: [) w; X
FD、FA、ED、EA: ]* |- Y) w# k1 f3 E

; {! T- J: T  m# PATPCS规定使用FD
+ \7 H7 D+ |- u8 o* O, B9 D
8 y% @' C6 T: N" E. x' ]4 B6.1.4参数传递规则
8 j5 j; S& W; G# c7 K- P+ D" y* I3 Q) f2 N# }# R. b
1、参数可变:参数不超过4,使用R0~R3,超过则将多的参数送到数据栈中保存6 f. f) K- ^5 J6 g5 B

, L) T9 [& b9 f  [2、参数固定:第一个参数,通过R0~R3,其他参数使用数据栈。$ v, f- @% p& S( l- q

& }4 c9 }6 [8 M5 [3、结果返回:结果为32位整数,使用R0;结果为64位,使用R0和R1;结果为浮点,使用f0、d0或者s0;
& O6 w7 f/ z7 z4 w6 r( z8 N1 o, k
第七章  ARM和Thumb混合编程, |( q" p  S/ Z4 ~8 a2 l

" B# P# I$ S: z. D. x状态切换指令:8 M- a( e" w, t7 c
" |1 T' H% }+ V: P$ n1 s7 X7 C# D
BLX 、BX      目标地址
$ A( s( g7 ]) E* n( K  V# s
  r5 K: @. f# [# F% z' N$ D( fLDR、LDM及POP  向PC寄存器赋值5 a5 G8 m, r) [* m% B

- A* Q; \% E" v: B% W: D1 g" j         AREA  AddReg  ,CODE ,READONLY  y4 z0 k0 O8 Z* R/ \9 Y% A8 ]
. n9 ~1 b) c9 I# Z6 U( o
          ENTRY
8 H1 x4 p% x- l+ }* `" ~
) s9 C5 z4 C) V) ], m4 R# ]main
0 s$ F: [2 T& Z  c5 G9 {2 \1 e& w* i/ t( {/ I3 \( M+ {/ z8 f8 f
         ADR  R0,ThumbProg+1  ;存储单元的地址肯定是偶数,也就是最低位肯定是0,但ARM与thumb之间的切换是; c6 c" |; v. f

) c- W4 _3 Q" Q9 O, |, i, v2 S2 f* S                                         ;通过Rn的最低位来判断的,1为thumb,0为ARM# U# I; a$ s( Q9 o6 }

7 j# E) u7 i- O4 W2 L         BX     R0                   ;跳转到ThumbPro,并且程序切换到Thumb状态
0 Z% J# b. V6 Q% H. x1 o" h1 H' l- p0 W) ^
             CODE16
7 z! Z, y& d' R& i: z0 E/ h: L
9 c9 w( `. G2 q. h" FThumbProg
; ~' v+ C, S. [" s
3 [; p) a$ i) i/ f+ K. t& m  M- Q              MOV  R2,#2
9 F1 Y" C8 ]( d9 _7 L, k. k2 |* \6 m: g/ J
              MOV R3,#3
( @+ {+ m' g% J, M' v* {6 S5 e' X! U8 X
              ADD  R2,R2,R3! M0 S6 ]  l) j) \. o0 ]

% Q: R& X0 p* ]' Y  A              ADR  R0,ARMProg( s4 e" P2 D1 T) k3 h! p' t

% f/ o7 S( o5 [9 n5 M( g. i3 H              BX    R0                  ;跳转到ARMProg,并且切换到ARM状态
# u  p- {3 Y; Z# U" h3 n: z# f- s1 V$ r+ m8 p* q2 v
            CODE32
5 o7 s5 i& q# x. H% f' L) X  n7 i) [  k6 o
ARMProg
% H% L+ R- {! L  y5 y1 _- j% C( f
: g. p1 x0 M8 s' m0 a            MOV  R4,#4
$ u, h9 }+ D' H7 P3 q% Y8 n/ H( y( H% J3 g
            MOV  R5,#5
( r. k$ \% Y4 Q9 Z* c6 ^) l% U; ?. m# z: k
            ADD  R4,R4,R5
. r' m% J2 R4 i9 W. O; t
7 n7 ~- x* P( _: Wstop
1 k# S6 Z( D9 l* E) s
8 j+ r) z1 Y3 f/ p3 O8 E, ]  i6 S! P            MOV  R0,#0X182 w, {7 \" ~2 p4 j# Y! Q( H7 Q

  Y4 u# F$ Y" K9 g1 s            LDR   R1,=0X20026; p: P: f; J! J6 M

) ?5 y& w5 j' `( N! M            SWI   0X123456: j  f! ?4 X2 w5 @# K

+ q4 A) _  D* }  J/ a0 x            END
: k- `& K2 e; Y2 e1 S9 D
, m- W7 @4 Q7 a' ]+ W+ m6 W//C程序调用汇编程序
5 M( s" M( B: L5 y, f+ }; ]1 d* Q, T/ M- b
#include <stdio.h>
% z7 ]2 b5 z* J: ^, R* Y& _
0 T# ?9 n6 A# @9 y) Sextern  void  strcopy(char *d,const char  *s) ;      //使用关键字extern声明外部函数,即调用的汇编程序" }/ ]- G3 ?0 B! S
3 S% ^! t# i2 @. t! w# }% ~0 Y
int main(void)
; ]9 N$ A! v! [! U3 I/ K9 T+ R" }) Y
{
5 a* ^+ W' h$ y9 }  a     const  char *srcstr="Source string";
6 a, e2 [; i' v4 D
) \; n+ `. c( R6 w" @# O     char  dststr[]="Destination string";
4 C8 L) a  b" o
& c3 D6 F& J! e8 b, t( B) e     printf("Before copying :/n");/ ~/ u; T5 S* ?2 j8 I8 P* z- N

# c# m9 `9 n$ v" K  B0 J9 l( N     printf("%s/n  %s/n",srcstr,dststr);
, q. t* j7 n6 l7 t7 t  e7 g. p' Z7 c: A
     strcopy(dststr,srcstr);    7 H% n. f; K" w( L2 `' d7 J

+ q1 D. Z+ q1 s) j) A2 d     printf("After copying :/n");6 e/ O2 K1 n9 J9 }, q3 a5 {$ b6 c

. F% K3 h) w3 P. Q1 \; |     printf("%s/n  %s/n",srcstr,dststr);7 }/ O( h6 G2 o% z0 q7 b
( r. E1 r0 K; X: W+ D: o! X0 B
     return 0;4 q/ o1 {3 {+ m, o4 Q

4 F8 C/ p7 l* a) A}) u- O  t1 L$ m7 [# x% ^* }

% C, Z# }$ r! h# a;汇编程序- B" \' d  q. ^- P9 a

$ O) G% O2 R* U0 b1 X5 {' \0 J! U          AREA  STRCOPY  ,CODE,READONLY" n4 y/ }0 z/ P% C+ j3 d3 N
4 n3 z/ `; r7 n
          EXPORT  strcopy    //使用EXPORT伪操作声明汇编程序. G: {4 V2 s7 C- v- ^

( E) T0 o8 Q, r7 V  W9 Qstrcopy
  v1 q9 {/ ^0 q9 ]% F0 u/ X. X, h) z& O
          LDRB  R2,[R1],#1   //寄存器R1中存放第srcstr地址
- q, H$ K9 ]* O0 a
1 z* P3 q$ {: i! X' @; c- |# D# {2 u# b          STRB  R2,[R0],#10 m1 K7 S8 p! i/ S( X% j
& s1 q+ R! e4 |* v0 ?' S
          CMP  R2,#03 `! E; \! M4 o2 l& t
1 e% m2 L; ?" g
          BNE  strcopy( P* n' L4 Q2 ~% k6 C" C
: }* ]1 s( [- _6 M
          MOV PC,LR
' h8 C2 a& b" I- b+ r6 q; f7 ]5 q2 K- V- f# p
          END" d) T: y3 @5 a3 ~( l
% C" O0 u$ {# g; z7 K! Y$ T
;汇编程序调用C程序
! L' w# q7 D" m/ _7 W6 J; w3 L$ b* D$ Q
int sum(int a,int b,int c,int d, int e)7 |! e6 y, y; h0 X' m
8 J- F: C& {7 E9 B
{% I6 _6 [4 y% i% m, h, @2 z
     return  a+b+c+d+e;' A% n* C" E4 o2 Q6 c, L2 ]

, R$ E  V9 t5 T- C7 v6 h/ x% \2 e* C}, N& w3 v, @4 [6 O

5 _- c% i9 O! Z         EXPORT  CALLSUM
/ e/ V* W4 G3 m! L$ ?% s7 J4 y" {& _) l6 ]' h
        AREA  F ,CODE ,READONLY& \9 ?& k3 ~! b5 r5 f& x
* G" B& \2 Q; \7 }( x4 w
        IMPORT  sum                             ;使用IMPORT 声明C程序sum()' q* a% r2 E/ b' {0 _
' D) L; o8 X+ I
CALLSUM
" O0 T" @$ C/ ?+ [- j1 V' Q1 g7 Z: C
        STR   LR,SP!           ;保存返回地址
& d# R& y, N7 @+ h$ _1 H( A+ V5 t9 M8 T. B  [. u
        ADD   R1, R0,R0           ;假设进入程序时R0=I,设R1=2I
6 u5 `: ^- i8 V& T
3 {6 w' @. p. y0 J5 u& _        ADD   R2,R1,R04 e& O2 }+ |3 m# H) ]& F% \

8 L. {7 A6 V) V8 h        ADD   R3,R1,R2. E) J( t% ^# ]& x% Y

* Y1 Z$ x2 q5 D        STR   R3,[SP,#-4] !         ;第五个参数通过数据栈传递/ C0 @6 I3 E8 q. ]$ k

6 a: _" X0 h* M0 P        ADD   R3,R1,R12 r# F, z/ B: e0 Q+ ?

& ~; x. V! z8 Z) m* |( a* B        BL    sum0 O' a" a+ o) w
* R+ Z! x6 m; m9 r5 e: S/ [
        ADD  SP,SP,#4                ;调整数据栈指针,准备返回/ E! v6 Q, B# k) U5 N
  E& U5 N. F4 c5 c  ?* x. x  h
        LDR  PC,[SP],#4              ;返回
5 J/ b2 s. k6 q4 x7 O( R7 B  u- U
1 p2 g- L5 s+ g  w1 [! l0 m        END
作者: SsaaM7    时间: 2021-1-20 13:35
ARM体系结构与编程学习(10)




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2