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

ARM之ARM汇编

[复制链接]

该用户从未签到

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

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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