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

ARM之ARM汇编

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-4-28 11:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
! V* B* Q  \/ T8 q# J! N9 z
一、指令和伪指令" L' Q$ a  a; H& E1 g; f" L# B
  G; l$ p# Y3 j
    汇编指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以. R8 h4 C  M: @* o. a5 ]

  P8 u3 c+ o. Y+ l. a# c    由CPU读取执行。
; \. W# B5 S7 |
# X  z" h0 Q% t* F+ l; L. k. j    汇编伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供
$ q) B  Y5 L7 r8 H( p) ?9 |/ }* [3 d1 f3 x5 b. V% U8 z- S
    的,目的是用来指导编译过程,经过编译后伪指令不会生成机器码。
8 i  A% `6 G- P& o) Q
$ Y3 }" z+ W  k3 A% c二、两种不同风格的ARM指令+ T7 |1 T9 ?0 b5 U
) H; H) T( o# T3 C' a
    1、ARM官方的ARM汇编风格:指令一般用的小、windows中IDE开发环境如:LDR; R1 _8 i. w& K$ Z1 J& D. V

, K& c( S9 v% P9 c$ b" ^& t        R0,[R1]5 S  P3 H; t# [: k' Q( J
5 }) G0 E4 H) s$ O& C4 e
    2、GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0,[r1]6 `" @. u2 E# K% X, `7 @

  `9 n2 `1 O& Z! H, u三、ARM汇编的特点/ v4 y* ?: B  ^( _% G. h( h4 T
$ L6 E  g  H. ^. a) p; ~) q
    1、LDR/STR架构% t4 w- b, Q, f# Y! l: {

$ p& {6 j% a0 I5 H/ Y+ u0 }. f        (1)、ARM采用RISC架构,CPU本身不能直接读取内存,需要将内存中的值加载
& y3 N: U+ P+ D6 \- v* h; d' T. o; c' a/ i
            到通用寄存器中才能被CPU处理。
! d9 B: d' D0 P5 |1 T2 J7 J
  Q+ a2 j. P7 w        (2)、ldr指令将内存内容加载入通用寄存器。5 l7 m" a- H* S1 {8 K, Z

# J- n2 W2 o. u        (3)、str指令将寄存器中的值加载到内存空间中。
+ W: I! T* Q3 h# e1 Y' m( X! v6 F/ n( I5 U; q
        (4)、ldr/str组合用来实现ARM CPU和内存数据交换。
; \9 N( `7 Y: P+ d0 v8 `3 `. z1 i9 j$ r5 S" p
    2、ARM汇编特点:多级流水线
6 o2 f, r; Z3 q# w! M' A
" v. S5 B) N/ C' u        - ' P0 w' S6 d4 [8 q+ [6 k9 V' @- P
: v- i: Z6 \- Y( i) P
    3、8中寻址方式
5 x8 h1 g2 t6 k( _; M' }. \) Z& r, p0 n& R) n0 F
        寄存器寻址               mov r1,r27 q0 @0 [, z! R$ Y1 I3 |

. e: q; t. E( {- k/ G& j        立即寻址                  mov r0,#0xFF00 + e4 t+ Q8 B3 _% N1 \3 ?2 O4 p
/ p$ {' M; q2 P) O4 B; Q
        寄存器移位寻址        mov r0,r1,lsl#30 R$ m- [2 U1 ^

& E1 s- ~' q' M3 ~8 Q3 @        寄存器间接寻址        ldr r1,[r2]) {. l! q- @4 W& v1 {6 L

4 g- s6 J: b3 @        基址变址寻址           ldr r1,[r2,#4]
3 M: C& M5 @: ]+ r4 u) ?% C' M) Q0 L  ^3 M1 J
        多寄存器寻址          ldmia r1!,{r2-r7,r12}
6 H4 c& M+ l; g  Q" ]& ?' B
. e! I, R5 z' ?( }# i- N        堆栈寻址                 stmfd sp!,{r2-r7,lr}6 p( ?: q& z! Y) u: x
/ y7 q/ C7 |( A# S6 E
        相对寻址                         beq flag
3 J. N9 Y/ H0 p
$ z5 r! L' n; A6 q' G' @                                        flag:
, I1 z8 N( d  ^3 V0 S/ w
( \' D2 E" C7 J/ Q/ Y9 K四、ARM常用的汇编指令:
5 }3 `# k* M5 d( R. m
5 b/ W7 F$ F8 V        数据传输指令:mov mvn
' p" \9 [) t" M2 \* h* n; q2 k) x$ z& F7 D. {
        算术指令:    add sub rsb adc sbc rsc
& L& P, w8 N, l" _  U* v: n, s. A9 T
        逻辑指令:    and orr eor bic
* p8 R$ R/ q# d. ]- Y2 }' o6 R! R" c) R7 n" q+ e5 O$ P) o+ m3 ^
        比较指令:    cmp cmn tst teq
$ r# R8 d8 ]' ~& S' T' e
! e/ g0 W+ g  ~3 b        乘法指令:    mvl mla umull umlal smull smlal0 U" i* x6 f" V% h) m
" Z! F/ X% F) l9 [2 n
        前导零计数器 :clz+ p* H" X5 V; B- c, X5 q7 J

, U+ ~9 V- ]6 q0 e5 K, }2 g        CPSR寄存器比较特殊,需要专门的指令访问:这就是mrs和msr
0 F% R# W. `4 u0 Z+ C/ @# O$ k8 O7 H* N- r% V4 ~
            mrs用来读取CPSR的值,msr用来写CPSR9 U9 ^8 I! ?/ j1 p9 U. I

2 O, ^8 P7 d) ]/ t1 \* o6 r        协处理器cp15操作指令
4 e/ D8 g0 m8 I# N' X) ^
+ }8 c7 e$ _7 }            mrc用来读取cp15中的寄存器,mcr用来写入cp15中的寄存器8 Y/ k% X: \5 H6 K+ G% t
. C8 a! E- r9 h/ e( w1 q
       ^的作用:在目标寄存器有pc时,会同时将spsr写入到cpsr中,一般用于从异常模式返回。9 w8 k; [% J& k( N0 j. b

5 {) C$ k* K$ l7 o- Z        例如 ldmfd sp!,{r0-r6,pc}^% C# T& h& D  q& u( {9 l. p) `

6 Q/ b) A7 e" Z  ]五、伪指令
9 t, s  p: M& d9 B5 a' ?6 w+ u6 K/ t1 X* [7 `
    1、伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
0 [! ]$ o2 J- U' d( I" y: e7 u  F1 N7 R% o+ Y; |# }. f7 u# D2 r0 y1 k
    2、伪指令的意义在于指导编译过程。
5 p7 s" Z* T% E4 i1 X: Q# [& h* ]4 f. ^8 D6 g& o" R
    3、伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。2 N1 a, ]: {1 A& l. l9 y; S
: n8 z" z5 V0 C! b5 ]; F
    4、@用来做注释。和C语言中的//是相同的。
( E; Z* H0 x: [: F$ @: k( |" I4 L* k/ _  q  J8 V
    5、#做注释,一般放在行首,表示这一行都是注释而不是代码6 V# a9 ?/ u. N
& W8 @0 W- w# y* r
    6、:以冒号结尾的是标号
* m$ U! w0 h! v  e. N$ O" ^- d" V# P: E% W
    6、.点号在gnu汇编中表示当前指令的地址% ~* w) Z* |1 {! N/ Q; e# l

0 i% L. o7 \& W1 L1 N* \    7、#立即数,前面要加#或者$
7 `7 [. Y# \( @/ g' R$ o4 I: _' w5 }+ z, d" z5 w1 |  m
    8、 重要的几个伪指令:# _; M6 x! y+ i6 ?5 y$ I
$ y% g* k* K3 \1 Y7 l/ N
        ldr    大范围的地址加载指令2 W( Z, \! X2 L, `9 I5 y, y# j. a

2 r" ^9 {7 V  q2 b; E        adr 小范围的地址加载指令( y- |7 h; P+ c$ g  s- t% h

1 ?# i6 S: S% I# |0 z        adrl 中等范围的地址加载指令' A1 d0 r8 a8 X' H) W

  O+ s6 V8 G: g9 Y& O        nop 空操作
- ~! P! Y3 f5 w# a1 [( L4 l7 c1 F* L5 U# P  O. G
    9、adr和ldr
! s  ]. u! N; n& C' i
# |+ R* b& Y: r) C5 q        adr编译时会被1条sub或者add指令替代,而ldr编译时会被一条mov指令替代或者文字池处理。' F% V$ n6 o8 \, b
0 k, K' c5 _& m2 ^6 L! J
        adr总是以pc为基准来表示地址,因此指令本身和运行地址有关,可以用来检测当前运行地址在
1 Z6 r% M1 C2 d$ P' o- q3 b: c; Y
8 q2 t( E, @& g% h) z& h7 I- ^. Y2 g        哪里。% c6 S# m% t3 B7 B0 U) V; B

' y* I9 C- {- t/ |        ldr加载的地址和链接时给定的地址有关,由链接脚本决定。; u; i# C$ W3 m, B6 }; q+ h
2 D, S6 G( }* X. W; Y
    欢迎各位指出不足之处
+ S' k( E9 E  R
: \: u: w7 F: |3 Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 13:12 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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