|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一. ARM指令长度及数据类型; |" O7 D) r% m& N! v4 w# u8 K
ARM微处理器的指令长度可以是32位(ARM状态下), 也可以是16位(在Thumb状态下)
' l0 Q$ ~9 v. p0 i! A: RARM微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,字需要4字节对齐(地址低两位为0),半字需要2字节对齐(地址的最低位为0)2 B* Y5 O& @& ]
程序的启动都是从ARM指令集开始, 所有的ARM指令集都可以是有条件执行的.
3 r; f, P. I% }4 @二. ARM汇编指令格式; k* e4 ?2 v5 |9 h) q- Y
: o" j+ ^7 f( F+ S" \: u{cond}: 指令执行的条件编码, 如EQ,NE
) W5 R: \0 _* Z( e5 e9 E9 Q& Z. [, E<opcode>: 指令操作符编码, 如LDR, STR! i, G0 y( _, D& w! z0 L; @
{S}: 决定指令的执行是否影响CPRS的值; ~8 r4 \6 |3 H3 {" V9 r. l
<Rn>: 包含第一个源操作数的寄存器编码6 E! O! K. D0 B8 K
<Rd>: 目标寄存器编码
* [" p) s: f) s( K. F<shifter_operand>: 第二个源操作数" V' Z' M1 m; b6 X& P0 j
ARM指令语法格式中,<>中的内容是必需的, 而{}中的内容是可选的! u4 F% D! u0 I3 s! t3 n3 w% g5 t
! T1 I" ~8 S: C' l- Q, C" H6 }3 Y三. ARM指令的条件码域! p4 ^9 q K+ r4 U; N1 h
大多ARM指令都可以条件执行, 也就是根据CPSR中条件码的状态决定是否执行该指令.
2 @* u0 M: R4 R) i$ _只有在CPSR的条件码标志满足指定的条件时,带条件码的指令才可以执行,否则被忽略(相当于一条空操作NOP指令)
% K, q9 V( i% T2 p' F4 {每一条ARM指令编码中包含4位的条件码.位于指令编码的最高4位[31:28]
; ]. @* ]4 U7 y e四. ARM指令的条件码域& _' @5 f1 a( ^, \' ~1 _
$ K4 C/ b9 i; R" i$ K9 c# @1 l/ ~* E五. ARM寻址方式% _& |- ^. [" x v8 T, a
立即寻址: 操作数本身就是指令中给出. 例如: ADD R0,R0,#1 R0<-R0+1 ADD RO,R0,#0x3f R0<-R0+0x3f ' X6 k- f' v) M/ S! r# O$ i+ E
寄存器寻址: 利用寄存器中的数值作为操作数. 例如: ADD R0,R1,R2 R0<-R1+R2+ Z, z4 T" X9 a
寄存器间接寻址: 以寄存器中的值作为操作数的地址, 而操作数存放在存储器中. 例如: ADD R0,R1,[R2] R0<-R1+[R2] LDR R0, [R1] R0<-[R1] STR R0,[R1] [R1]<-R02 q0 k# n! e2 {7 p2 {+ `1 O
基址变址寻址: 将寄存器的内容与指令中给出的地址偏移量相加, 从而得到一个操作数的有效地址 例如: LDR R0, [R1,#4] R0<-[R1+4] LDR R0,[R1,#4] R0<-[R1+4],R1<-R1+4 LDR R0,[R1],#4 R0<-[R1],R1<-R1+44 u7 V+ O- {" f+ z
多寄存器寻址: 一条指令可以完成多个寄存器值得传送. 例如: LDMIA R0,{R1,R2,R3,R4} R1<-[R0],R2<-[R0+4],R3<-[R0+8], R4<-[R0+12]
" ~; `* E8 X! v3 |3 @, E相对地址:基地址为程序计数器PC的当前值,偏移量为目的地址和现行地址之间差的基址变址寻址,将PC的值与偏移量相加之后的得到的操作数的有效地址.
- x1 V: ^7 W3 ?' j" p& v* j 例如: BL NEXT, m1 T5 A" P( y+ [! g d- l
...; s6 Q) ]' c: }0 C/ u, S- u3 r
NEXT1 x% m- m- n! r1 E" x
...
! n; R1 u9 i" M% b3 u( s2 u MOV PC,LR/ x6 _( z2 p& W9 t# J# ]1 X
7. 堆栈寻址:+ J0 D+ d" Z( q1 |* u' c& }
递增堆栈: 向高地址方向生长
% g* Z' V' ^& H! b1 S 递减堆栈: 向低地址方向生长
- R# L8 D$ u( h6 b9 }( Q8 G7 Q+ G 满堆栈: 指针指向最后压入堆栈的有效数据项.
3 [+ V7 Y0 Q! Z c) G; \ 空堆栈: 指针指向下一个要放入数据的空位置.# |! S3 u s2 Q; O. v
例如: STMFD R13!,{R0,R4-R12,LR} 将寄存器列表中的寄存器(R0,R4~R12,LR)内容压入堆栈
8 K/ J5 P2 v, N7 C( p/ d LDMFD R13!,{R0,R4-R12,PC} 将堆栈内容恢复到寄存器中(R0,R4~R12,PC)中.
: q5 L" c: N6 M* T* m- e c1 |
D0 ?) ~. r4 U6 r$ u8 p
( l% \' O+ d; U* x$ C8 p |
|