|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一. ARM指令长度及数据类型7 a% l+ E/ n( b+ [8 Y" {
ARM微处理器的指令长度可以是32位(ARM状态下), 也可以是16位(在Thumb状态下)
C( q$ K( S1 Y" C' GARM微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,字需要4字节对齐(地址低两位为0),半字需要2字节对齐(地址的最低位为0)
+ r$ \+ G0 v( n4 M6 D! j4 F程序的启动都是从ARM指令集开始, 所有的ARM指令集都可以是有条件执行的.
7 k; i: V, w0 v" W7 u2 R; o二. ARM汇编指令格式
{ d: q' V: z% ^1 t+ z7 K2 s+ E$ S) \- d! N" E
{cond}: 指令执行的条件编码, 如EQ,NE
9 a# x8 X& l1 Y<opcode>: 指令操作符编码, 如LDR, STR
8 Y# b- N6 G% S3 {{S}: 决定指令的执行是否影响CPRS的值; ?7 m* v0 l' P+ F& w; s) h1 n
<Rn>: 包含第一个源操作数的寄存器编码; C4 o. ^" U, U
<Rd>: 目标寄存器编码
3 m, u/ ]- W+ x# c<shifter_operand>: 第二个源操作数$ M" V7 O' @+ o/ e, B% P! c
ARM指令语法格式中,<>中的内容是必需的, 而{}中的内容是可选的9 F/ i: \. D! x3 G3 R
6 H; N( h) t% E
三. ARM指令的条件码域6 Y g3 r8 I( V% V- }
大多ARM指令都可以条件执行, 也就是根据CPSR中条件码的状态决定是否执行该指令.
1 a6 X1 ]6 {2 l6 Q* X! p只有在CPSR的条件码标志满足指定的条件时,带条件码的指令才可以执行,否则被忽略(相当于一条空操作NOP指令)
4 z" @' P) O& i1 ~! \2 a A每一条ARM指令编码中包含4位的条件码.位于指令编码的最高4位[31:28]
) z. a# x S9 N: ?2 m- k+ g四. ARM指令的条件码域
; U- U8 ?) G' Z* J5 p3 U1 r9 g
1 K4 x: Y9 u, f4 z) F4 H! E1 G: @五. ARM寻址方式
" I& A5 z7 c- \, M立即寻址: 操作数本身就是指令中给出. 例如: ADD R0,R0,#1 R0<-R0+1 ADD RO,R0,#0x3f R0<-R0+0x3f
0 h3 t! C. ^+ N9 I: u" N寄存器寻址: 利用寄存器中的数值作为操作数. 例如: ADD R0,R1,R2 R0<-R1+R2
9 `$ T" s# z2 g3 e寄存器间接寻址: 以寄存器中的值作为操作数的地址, 而操作数存放在存储器中. 例如: ADD R0,R1,[R2] R0<-R1+[R2] LDR R0, [R1] R0<-[R1] STR R0,[R1] [R1]<-R0
$ t0 F3 T. w+ |基址变址寻址: 将寄存器的内容与指令中给出的地址偏移量相加, 从而得到一个操作数的有效地址 例如: 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+4
, v2 p2 h- V' @3 m多寄存器寻址: 一条指令可以完成多个寄存器值得传送. 例如: LDMIA R0,{R1,R2,R3,R4} R1<-[R0],R2<-[R0+4],R3<-[R0+8], R4<-[R0+12]5 D/ x" k, `# o
相对地址:基地址为程序计数器PC的当前值,偏移量为目的地址和现行地址之间差的基址变址寻址,将PC的值与偏移量相加之后的得到的操作数的有效地址. 5 ~* g6 q0 i+ B( `' o5 `
例如: BL NEXT/ P$ B% o" d7 m2 ]2 N
...# Q- G; [9 h; l
NEXT0 o9 s4 m+ c2 D4 E6 A N
..." ]! _2 Z7 E! i6 n; a
MOV PC,LR
$ w9 `0 d+ k1 n7 a9 u3 x! y& a9 p7 Q 7. 堆栈寻址:
6 C, t, @" k$ E 递增堆栈: 向高地址方向生长8 ?: I0 B% l( I/ u
递减堆栈: 向低地址方向生长
* u9 t; b; `7 ` 满堆栈: 指针指向最后压入堆栈的有效数据项.
7 n) ?+ |; r' o' Y! i 空堆栈: 指针指向下一个要放入数据的空位置.
. p; h5 N/ }: k( S8 g( V( ~' L" R 例如: STMFD R13!,{R0,R4-R12,LR} 将寄存器列表中的寄存器(R0,R4~R12,LR)内容压入堆栈
# c+ Y! @0 I7 G. T. ~9 U LDMFD R13!,{R0,R4-R12,PC} 将堆栈内容恢复到寄存器中(R0,R4~R12,PC)中. R' @/ \+ G* G6 ]# y7 o1 T! p
- e% Y' f0 r/ ]" r7 X. i- @$ {. l6 s$ P7 }
|
|