|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一. ARM指令长度及数据类型8 A K* S( Q% ?: g
ARM微处理器的指令长度可以是32位(ARM状态下), 也可以是16位(在Thumb状态下)1 }) B) J5 y' j1 D
ARM微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,字需要4字节对齐(地址低两位为0),半字需要2字节对齐(地址的最低位为0)
, D5 C" m# X/ T6 U) O, }程序的启动都是从ARM指令集开始, 所有的ARM指令集都可以是有条件执行的.
+ e' v7 U$ T) V& y* P; Y; s二. ARM汇编指令格式
9 K0 Q1 G6 |* _" L3 I- b: w" m. H, K: Y* V# V
{cond}: 指令执行的条件编码, 如EQ,NE
6 y4 g! f! C8 } O5 s: ~0 m<opcode>: 指令操作符编码, 如LDR, STR' z8 b) T* F) j2 J1 B3 u8 U
{S}: 决定指令的执行是否影响CPRS的值$ Y2 f5 l2 ?( z
<Rn>: 包含第一个源操作数的寄存器编码
' B4 F6 y: M# L) Q- w<Rd>: 目标寄存器编码( ~. Y: x s! i$ [
<shifter_operand>: 第二个源操作数
- d; R% O/ R, K# U) T( M- YARM指令语法格式中,<>中的内容是必需的, 而{}中的内容是可选的
7 ]& c2 U2 a2 W0 S8 C 1 K$ K" y: `, ?6 @) c0 s* b
三. ARM指令的条件码域
* B1 h2 n) Z8 Z大多ARM指令都可以条件执行, 也就是根据CPSR中条件码的状态决定是否执行该指令.
- D& o/ V) i* i$ |: G# }只有在CPSR的条件码标志满足指定的条件时,带条件码的指令才可以执行,否则被忽略(相当于一条空操作NOP指令), u+ E$ Y- G7 P* K. L& E$ C9 h
每一条ARM指令编码中包含4位的条件码.位于指令编码的最高4位[31:28]4 T- F1 s5 V) ^3 y& M# F7 M
四. ARM指令的条件码域' C! h8 ~8 W; `$ k9 N# y& c
( w/ f, x' t) C/ Y: c五. ARM寻址方式
# K& z, C2 B1 i$ W5 n立即寻址: 操作数本身就是指令中给出. 例如: ADD R0,R0,#1 R0<-R0+1 ADD RO,R0,#0x3f R0<-R0+0x3f 6 M: n' \; i0 d+ a5 T* l2 t7 B
寄存器寻址: 利用寄存器中的数值作为操作数. 例如: ADD R0,R1,R2 R0<-R1+R2; K0 `# s* ]+ y7 B/ l1 I% U
寄存器间接寻址: 以寄存器中的值作为操作数的地址, 而操作数存放在存储器中. 例如: ADD R0,R1,[R2] R0<-R1+[R2] LDR R0, [R1] R0<-[R1] STR R0,[R1] [R1]<-R0
8 r) A3 W, Q8 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
# F7 |( J, Y6 O3 m% @多寄存器寻址: 一条指令可以完成多个寄存器值得传送. 例如: LDMIA R0,{R1,R2,R3,R4} R1<-[R0],R2<-[R0+4],R3<-[R0+8], R4<-[R0+12]
( ]( H$ I6 p7 p4 ?相对地址:基地址为程序计数器PC的当前值,偏移量为目的地址和现行地址之间差的基址变址寻址,将PC的值与偏移量相加之后的得到的操作数的有效地址.
( ~; @+ S# ?' g+ U( c 例如: BL NEXT6 g1 q# Y! n/ k# U0 S$ A
...
+ `5 h f2 @4 X/ S& g1 Z* V NEXT
* I2 b8 C. U, b6 t% x0 t! L .... o. V# B& a: C2 c8 u, q+ c1 f% G
MOV PC,LR
/ J- V1 N$ e! S# X 7. 堆栈寻址:
: k( s/ |( O% `. H8 X- A" k" _" j7 A4 [ 递增堆栈: 向高地址方向生长$ O1 X8 R2 U/ A% t# X
递减堆栈: 向低地址方向生长 I( F! T& E; X2 Y6 ?8 H8 g
满堆栈: 指针指向最后压入堆栈的有效数据项.' p' S W# v0 P' S, N% L
空堆栈: 指针指向下一个要放入数据的空位置., o+ G5 n( u6 }8 |
例如: STMFD R13!,{R0,R4-R12,LR} 将寄存器列表中的寄存器(R0,R4~R12,LR)内容压入堆栈8 x) q8 j7 F8 ^8 i8 _+ {$ i
LDMFD R13!,{R0,R4-R12,PC} 将堆栈内容恢复到寄存器中(R0,R4~R12,PC)中.$ ^. {- S; S+ x7 r H. T3 n$ F
0 ]$ w# t, i$ C" B) r, P. D3 v+ a( T u
; [& U# ^0 w X7 p |
|