|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 l( l& |4 m, g- R( {8 c
一、指令和伪指令
! g+ w& A$ Y+ L- Y
4 O! s; ]3 h( h2 W. H: P 汇编指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以
( o) V' E+ e' \0 H6 p. L+ ~! f& u. _5 c
由CPU读取执行。
9 L2 i) a; i' T/ r. a
- g% k$ N9 l6 A5 B1 `+ l( ~7 p# F$ q 汇编伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供
) ]# Z, h! Z- q- B/ n/ R f/ l' {! p+ O+ v# n2 g
的,目的是用来指导编译过程,经过编译后伪指令不会生成机器码。
' G' v/ n+ y. [% r1 I# p7 V& X. i8 w" |% n
二、两种不同风格的ARM指令( z' ]# G, {# W# n, j
( T" f3 Q2 l& U
1、ARM官方的ARM汇编风格:指令一般用的小、windows中IDE开发环境如:LDR
; D) X4 h) w; E% w7 L f3 J6 h' e& _" x5 X
R0,[R1]+ L5 I7 h+ i; S% A% H8 x2 _
% ~+ x5 d$ @" Y1 o p 2、GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0,[r1]% o. d5 A( j- j9 b
$ O+ q& v9 u/ U( t- {6 c# w0 c三、ARM汇编的特点
' N4 M+ w, Q' S5 j3 K! ^6 Z
' n5 k2 e/ u2 I" Z 1、LDR/STR架构; z: R, o3 h/ b$ s( j
; B4 K' F; w0 Q& I8 y- z: a$ \$ c (1)、ARM采用RISC架构,CPU本身不能直接读取内存,需要将内存中的值加载
7 O5 N. Z+ G+ C9 G2 k4 o# ^+ C o* O1 Y$ b
到通用寄存器中才能被CPU处理。
# s( m. J y& c1 g6 w& f: g- I4 G5 x1 T! \% }3 c1 p2 ]: Z
(2)、ldr指令将内存内容加载入通用寄存器。7 K5 E l8 A* M5 \4 e
- c) s; Q: F x; i- m" G( S0 o (3)、str指令将寄存器中的值加载到内存空间中。+ r' }; o4 R f
: z/ x7 U* M6 N+ F" ?# h9 {- ?
(4)、ldr/str组合用来实现ARM CPU和内存数据交换。
. g* o2 _- J9 C( W ?% c
: t M# w7 ^; |* [ 2、ARM汇编特点:多级流水线
' \% s% h; ]; k! e% ~# k4 |: v" U. x
6 r8 [4 {% F9 J% b- Z; n0 }- ~ -
: s0 S+ K+ l* O$ g5 ]
3 `+ N% E& A0 J. U: K( t 3、8中寻址方式
% T# u# N# U) a( P9 h9 a& W& y8 ~8 F- C' ~0 D G/ H' l* R s
寄存器寻址 mov r1,r2& _9 _# {: t9 x% p! ]8 z
" z3 ?; l6 }; t9 d5 S) b 立即寻址 mov r0,#0xFF00 ( H1 T' g M$ i) g
3 r7 p6 P! W7 R 寄存器移位寻址 mov r0,r1,lsl#3: f' L; b$ P/ o9 H) k7 x
9 t2 F# j1 N: K
寄存器间接寻址 ldr r1,[r2]$ C; f* T' K- K0 `' N
# K' m+ |2 o% @: L8 B3 f2 i 基址变址寻址 ldr r1,[r2,#4]5 J+ ~1 B' |7 T4 R4 X2 @
9 Z# t3 ?7 C( n1 a! |
多寄存器寻址 ldmia r1!,{r2-r7,r12}
5 j( X, T" ?4 B7 ]! ?' F! a$ j; _6 ^4 M; K% G9 @( z
堆栈寻址 stmfd sp!,{r2-r7,lr}, D: f9 V8 x! w$ e
' Z# F; k; p H
相对寻址 beq flag/ A- }+ v+ @6 ?) f7 ~
8 F2 B0 g7 q% [
flag:7 O- [+ H& U! C" @- J- S
) \2 ^6 W; F, g! ]四、ARM常用的汇编指令:9 F/ y& ~: D' `
$ T) O+ i4 z' u0 N7 E( V4 D( J
数据传输指令:mov mvn
: o+ h" d' w" J9 S3 X
: C9 w z" h/ a3 N+ Y \! n 算术指令: add sub rsb adc sbc rsc
6 m' k3 h6 I/ d. w
( m9 L+ j c9 E" B1 _- J. l 逻辑指令: and orr eor bic" q6 F p$ s1 G6 o+ b# \, k
" w7 V6 p7 W H# }1 J* P% }5 X, U
比较指令: cmp cmn tst teq9 B3 A$ O5 V( ]( j
& p9 s* l( U, r; R( k 乘法指令: mvl mla umull umlal smull smlal
0 H1 S& n9 d% d2 S, y. S5 K' u
: l( x5 t* O( j" N( H$ W 前导零计数器 :clz
! r! B J* r; J$ k' G; K$ M+ P9 v* u
CPSR寄存器比较特殊,需要专门的指令访问:这就是mrs和msr6 i+ m/ t& v- I' a' e+ r/ J$ Q
% O1 J8 B" a6 J- W mrs用来读取CPSR的值,msr用来写CPSR8 \* g, q8 d4 z7 y. U* I! W3 }+ b
5 I9 y+ e }/ I( i C" {9 t4 g; u
协处理器cp15操作指令) g9 Q; f, y3 j7 W# U( |
5 n( G) P# p2 r9 M7 \* s6 b8 |+ Y$ ^ mrc用来读取cp15中的寄存器,mcr用来写入cp15中的寄存器
% c- l7 M# q* y* B2 ]( W
% f6 Y, h* Z1 m2 g$ a ?% J ^的作用:在目标寄存器有pc时,会同时将spsr写入到cpsr中,一般用于从异常模式返回。. X- z o3 e3 g! ]: F; Q% A9 ~/ Y
. S/ z& R5 Y" T7 b( i4 F 例如 ldmfd sp!,{r0-r6,pc}^
: h, ]4 e6 x$ d$ T y) z2 A) f9 K# A+ N: a* [
五、伪指令+ w0 S% n/ A4 h6 c9 {) ]# V2 ~: q
: \+ L$ a: Q8 a' h2 F0 K
1、伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
2 Z% |: {( {9 N) [$ k, \& l* z1 k4 G6 \
2、伪指令的意义在于指导编译过程。
! M: P6 t% @; ]. ~9 w5 G
) V* q& p2 L- N 3、伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。
: m) G. p: B p$ {" X, w! v1 p+ O, s' o5 t; O, I
4、@用来做注释。和C语言中的//是相同的。
6 {7 M1 \$ {0 V4 z1 l
; B3 v# K) l! t9 T. K 5、#做注释,一般放在行首,表示这一行都是注释而不是代码$ f. R# L) j. O# x) l6 N
- S$ c. x7 G, m3 h 6、:以冒号结尾的是标号
7 p1 @7 O5 I' _8 M5 D: R# [* D0 O4 e3 I" e1 p
6、.点号在gnu汇编中表示当前指令的地址$ D( ^( ^/ m w3 G
& A: u" T. ]- W2 `( g 7、#立即数,前面要加#或者$
( J( {/ u% _1 k0 T2 w7 h$ }
: Q7 {) e- c# E: k- Q 8、 重要的几个伪指令:
& X' s: ^ ^9 y4 I* _! ^
% J7 A' i; x3 d# A0 {* d: S) J ldr 大范围的地址加载指令
/ f# {4 `; o6 L) `% Q( b
. _7 w ~+ r+ H" ^& I, m: d adr 小范围的地址加载指令) x0 L* S u& m+ O
# B( A. V5 D8 h3 F
adrl 中等范围的地址加载指令
9 t% c0 x5 J9 v" N5 Q$ v9 o. V& F3 J( ^* r: N0 \+ Z7 [- q
nop 空操作4 w) n4 [+ t! l u
3 M' P( d+ i5 T3 [
9、adr和ldr 7 p: N- e) @& I( [
4 r2 R" U7 v3 q adr编译时会被1条sub或者add指令替代,而ldr编译时会被一条mov指令替代或者文字池处理。$ C, W; E$ v4 ?, |: o+ F; K
: h) ?' N0 o, m% ^0 [2 x) v0 e
adr总是以pc为基准来表示地址,因此指令本身和运行地址有关,可以用来检测当前运行地址在
+ S I5 D% s% A$ j( Y3 u$ W6 `2 E! r; w3 K
哪里。4 Z |6 C+ {5 T3 a ^/ b; z) y! Q, S
. w: R& R- U2 E$ E% C6 l; z ldr加载的地址和链接时给定的地址有关,由链接脚本决定。; h0 U% z- h' A" q8 A# z
L. \: P. c1 H. S% @
欢迎各位指出不足之处' d: {+ Z- w z# a: s" k
5 X' ?& R/ T6 L
|
|