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

ARM之ARM汇编

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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