|
|
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 |
|