|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, _ P9 e. W \
一、指令和伪指令
; l; P; l7 k, l- V, F* w( p" @2 n, g2 l
! Q0 `& {% Z1 e 汇编指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以6 \. C* G8 T. I9 M w
: }$ w( R( |* s& j6 s
由CPU读取执行。 f! x2 |! q0 |& J& k
( R+ b6 D: }1 ^/ T# _- T+ a0 A 汇编伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供# p' g: N( v, `) U
. t7 x3 z0 Q7 d0 Q 的,目的是用来指导编译过程,经过编译后伪指令不会生成机器码。
6 [ [7 W1 U0 { O& ]' {+ T" ^( E' w8 p; U& m5 g- Y) T2 w( P$ j
二、两种不同风格的ARM指令
, ?. _8 N8 d' C O# u$ I" S" H( ~) K; G% y3 }% w
1、ARM官方的ARM汇编风格:指令一般用的小、windows中IDE开发环境如:LDR
6 d% x2 ^, ]! f0 j1 A% z. n1 K
$ P: L. L# l1 J1 `# J# q/ x R0,[R1]7 f% J" W q- b) r+ h# \$ w6 M- R; R
& {6 Z; x+ k, O2 X( D4 m8 D- f, ~ 2、GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0,[r1]% C q( D. W" w" q( L
2 H( L6 Y) J8 h7 C
三、ARM汇编的特点$ q& t4 S0 g. U( i! Q
; X8 N. B6 H+ U 1、LDR/STR架构
( j3 \* ~8 f+ }' C. a
) f: t c% T( ]& ^ (1)、ARM采用RISC架构,CPU本身不能直接读取内存,需要将内存中的值加载% R, r) H0 Q# l
, V/ N" p% V, C5 o1 c% g 到通用寄存器中才能被CPU处理。
% J6 r) a0 Y3 ?) {: {
% [9 I2 s: [9 U: N5 |5 s( B& @0 E1 ^; v) j0 L (2)、ldr指令将内存内容加载入通用寄存器。% k/ z& o& M$ O7 ^- D: _7 B3 z
E1 E& I' |5 R- i1 M) F( E2 s
(3)、str指令将寄存器中的值加载到内存空间中。" z# O8 k; c6 j' r+ V0 p, N" R! b
- y, j( ^6 n" J$ p0 H+ f* [ (4)、ldr/str组合用来实现ARM CPU和内存数据交换。' e" q9 |6 B' \+ |8 I
- R4 s) R% a( K) B+ M' O8 u, N% x+ A 2、ARM汇编特点:多级流水线5 W. k) `. g- O$ @- R
- _4 X0 F, u5 T; C. N
-
9 V5 o; y* i# R
9 r0 @1 i) t3 G' @; p2 S% a+ p1 c
3、8中寻址方式6 m, l& Z4 [" y' M; d# B$ s
/ }5 T+ k6 J) y2 ?* o% I 寄存器寻址 mov r1,r2
! ~, T# z) y0 Z* [' @6 r
6 @' y5 E' q/ W: E 立即寻址 mov r0,#0xFF00
( _, O" E+ A) D" K- J: p4 Q
0 @4 ?$ ?7 e$ y# k& G7 e 寄存器移位寻址 mov r0,r1,lsl#3
4 c# D$ H5 p7 `9 @
1 x1 n, U7 I7 f7 Y% ]( \- Z 寄存器间接寻址 ldr r1,[r2]
7 ^0 _3 y7 A8 C; G5 ~+ s
( t% _: c% i1 A Y1 u2 } 基址变址寻址 ldr r1,[r2,#4]& ^/ j$ t' P% Z3 e* H, e
4 n8 A, r% f Q3 R
多寄存器寻址 ldmia r1!,{r2-r7,r12}& A! c) k( ~" }1 g
. A4 h3 [, L5 E7 ?2 ]; ?" N7 j1 _
堆栈寻址 stmfd sp!,{r2-r7,lr}+ A) _. [# L. K# f5 V1 ]& t
& x) j( }8 V, f 相对寻址 beq flag3 M) m5 T: `1 @/ R0 R
1 m$ F' H- q# @; Z4 {0 \ flag:
, K1 G c L( N& R& F) ?" j* e6 N3 T# O
四、ARM常用的汇编指令:
+ u' _) \" A- ?3 w0 a0 _
# R) e; M1 p7 w 数据传输指令:mov mvn
5 B+ N S5 P4 ?- N% _
! D% J) Y( E# h3 U E/ Q 算术指令: add sub rsb adc sbc rsc
9 y$ i5 i+ C! V4 T' ~: y( f; u5 A7 }+ x, S" Z
逻辑指令: and orr eor bic" Z- I% a5 L0 u4 T
9 g3 P. b5 D: Y0 v
比较指令: cmp cmn tst teq& c& `" i0 w0 w4 i
" K: q3 }) L. i! o: q/ M7 v2 W( { 乘法指令: mvl mla umull umlal smull smlal
# }/ j+ m% d( M( e/ T1 F; A$ q8 ?& r
前导零计数器 :clz% f4 \! d' l! \7 l( g2 ~ t
6 v: a9 z7 }$ ?' } CPSR寄存器比较特殊,需要专门的指令访问:这就是mrs和msr
5 |1 m4 k( Q/ c8 z* ^" q. n ]! n1 X
mrs用来读取CPSR的值,msr用来写CPSR! c* s) c% l7 {- [5 n4 v
/ ~7 c) b. }6 J5 j0 C
协处理器cp15操作指令9 b6 {9 l! P2 z7 @4 c+ c( B3 o- r
0 Y" m1 k# ~" i mrc用来读取cp15中的寄存器,mcr用来写入cp15中的寄存器
5 F* S3 s3 j3 q O/ }, c3 |3 z J2 |/ e7 |) k
^的作用:在目标寄存器有pc时,会同时将spsr写入到cpsr中,一般用于从异常模式返回。% H9 p' c* Q* E$ T3 Y; O3 i4 }
% {9 ]9 J8 u. N: y* g 例如 ldmfd sp!,{r0-r6,pc}^
8 g. u2 B# i6 m5 f" J
( X2 {9 }% F- K$ U3 S2 y五、伪指令
! Q1 l% j4 i! j- {( M; B: z: H& S/ _7 S& k$ C
1、伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。. O- ] m9 O3 n$ m4 V1 z7 U
% C2 C' `9 A* T% I& z7 X 2、伪指令的意义在于指导编译过程。
2 q+ W1 s6 G: I
; z1 B7 a6 K u h$ P! n- u2 q 3、伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。
$ x' [/ q% f) e7 \% A, H1 p# e0 w) H7 u7 M9 U& J' E
4、@用来做注释。和C语言中的//是相同的。' P* I' B' J. J/ q9 H; O e
) ?0 ^7 R; w/ l8 g* f6 u" W& K# e 5、#做注释,一般放在行首,表示这一行都是注释而不是代码$ b2 R- ^* L% h- W) b
+ b J% k" b+ d" T' S 6、:以冒号结尾的是标号
# E+ v1 R8 f! i T: v* w
9 u' [0 I. p+ j2 `7 \ 6、.点号在gnu汇编中表示当前指令的地址
# w+ D' o; e! w2 k$ U; d; w' b
1 z1 W' c6 k; ? 7、#立即数,前面要加#或者$
- Q; v4 w( K) m7 I. n$ w% D- a/ Y$ `3 z
8、 重要的几个伪指令:
) {& D" c5 ~7 R3 m% G+ L# k1 X& D! t* l {: x5 q
ldr 大范围的地址加载指令! ]. Y6 E3 s x }0 D: a& u# N
4 ^& Q% w# @: o) l+ ~: j
adr 小范围的地址加载指令# l; ], i; w% I( V
/ P) W* I) N( z
adrl 中等范围的地址加载指令
6 h6 u' p- D- T3 i& {* t9 a* E% v8 H5 Z" b
nop 空操作, u/ a/ l- Y5 @( x& [
z# N$ J. c' r! i
9、adr和ldr
: n1 {- @6 r& l7 }0 U) {
0 Z4 D+ ]& d3 M9 n adr编译时会被1条sub或者add指令替代,而ldr编译时会被一条mov指令替代或者文字池处理。
% v/ `& t% r- h6 w+ k
1 a9 Y( B/ n. [& Q& x. r5 x2 j adr总是以pc为基准来表示地址,因此指令本身和运行地址有关,可以用来检测当前运行地址在$ G8 l2 i% C3 Y
( E' l7 |& a; G9 P! c2 Y 哪里。
6 L7 @8 n7 O3 W" l" P. _. \! b7 U5 ~, g* @9 n
ldr加载的地址和链接时给定的地址有关,由链接脚本决定。
7 E6 U( n1 w( C L) I
A" w, V, a& n& n- h' C( s, s 欢迎各位指出不足之处
* ?1 b' X, T; \6 g* h( b/ W S3 H E
|
|