EDA365电子论坛网
标题:
arm指令分类及其寻址方式
[打印本页]
作者:
guanshen
时间:
2021-9-24 10:50
标题:
arm指令分类及其寻址方式
一. ARM指令长度及数据类型
& F6 I8 r1 s: U
ARM微处理器的指令长度可以是32位(ARM状态下), 也可以是16位(在Thumb状态下)
3 M8 F; V9 i/ Y; W6 J
ARM微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,字需要4字节对齐(地址低两位为0),半字需要2字节对齐(地址的最低位为0)
, R( d. k: C/ D5 R
程序的启动都是从ARM指令集开始, 所有的ARM指令集都可以是有条件执行的.
' Q! N; g/ E \+ }1 X0 t0 K
二. ARM汇编指令格式
; L8 v- H6 a9 N8 q* M
8 e. y+ M! ~5 T, k0 B
{cond}: 指令执行的条件编码, 如EQ,NE
% g( Y0 J) U+ r6 k% J
<opcode>: 指令操作符编码, 如LDR, STR
5 L1 E% g6 I6 y+ k
{S}: 决定指令的执行是否影响CPRS的值
6 e) `( q8 x" L) }
<Rn>: 包含第一个源操作数的寄存器编码
9 [+ x/ R5 _( {8 X7 B' x
<Rd>: 目标寄存器编码
) D5 Z) H- @; Z( F: s8 I3 P( u/ J
<shifter_operand>: 第二个源操作数
7 n2 {' R* d: b* R: Q. n& I. ~
ARM指令语法格式中,<>中的内容是必需的, 而{}中的内容是可选的
6 y1 D I- W' n# q9 m2 P* q
6 z3 e7 p4 `& p% M, r t( X
三. ARM指令的条件码域
) {7 [# T" @* m; u6 g( G
大多ARM指令都可以条件执行, 也就是根据CPSR中条件码的状态决定是否执行该指令.
" ]% J. ~# M1 C& A* \8 `0 W6 i
只有在CPSR的条件码标志满足指定的条件时,带条件码的指令才可以执行,否则被忽略(相当于一条空操作NOP指令)
6 @; Y$ b1 _8 V! ^7 A3 R4 Q! g
每一条ARM指令编码中包含4位的条件码.位于指令编码的最高4位[31:28]
$ l1 P# A+ w" h C4 h
四. ARM指令的条件码域
6 ^" p. o6 J, u( U1 ]5 ]
* {7 I' C$ Q2 R2 C' O8 v) _, e
五. ARM寻址方式
" Z; C D& l9 }# d# T
立即寻址: 操作数本身就是指令中给出. 例如: ADD R0,R0,#1 R0<-R0+1 ADD RO,R0,#0x3f R0<-R0+0x3f
8 ?3 Y+ T) O+ Y: p) R- G
寄存器寻址: 利用寄存器中的数值作为操作数. 例如: ADD R0,R1,R2 R0<-R1+R2
1 q2 E. ]& q0 v+ P, n
寄存器间接寻址: 以寄存器中的值作为操作数的地址, 而操作数存放在存储器中. 例如: ADD R0,R1,[R2] R0<-R1+[R2] LDR R0, [R1] R0<-[R1] STR R0,[R1] [R1]<-R0
& M% f/ |! ?2 F4 j5 I
基址变址寻址: 将寄存器的内容与指令中给出的地址偏移量相加, 从而得到一个操作数的有效地址 例如: 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
+ U! A/ l! f: Q8 S
多寄存器寻址: 一条指令可以完成多个寄存器值得传送. 例如: LDMIA R0,{R1,R2,R3,R4} R1<-[R0],R2<-[R0+4],R3<-[R0+8], R4<-[R0+12]
( z/ g' ~! E, j0 m% R! d, j
相对地址:基地址为程序计数器PC的当前值,偏移量为目的地址和现行地址之间差的基址变址寻址,将PC的值与偏移量相加之后的得到的操作数的有效地址.
' p8 i/ W _6 h- c" ]6 ?
例如: BL NEXT
2 I6 \) F# l% ?6 P
...
5 }( f, @: }: ?3 h- b7 l8 C
NEXT
% p) Y+ A* L& U) q
...
7 h3 F8 k7 [. n, s7 N1 E6 n' k
MOV PC,LR
) ~5 W; C/ _- L9 f
7. 堆栈寻址:
1 }6 k }& ^, o; l% C% P) ~* Z/ K
递增堆栈: 向高地址方向生长
O5 f! @1 e9 V1 y* ]" j
递减堆栈: 向低地址方向生长
( P4 P0 E% W0 J5 m5 V
满堆栈: 指针指向最后压入堆栈的有效数据项.
! U( f" H) A" [6 d
空堆栈: 指针指向下一个要放入数据的空位置.
: D# r' e& J0 [+ ]- t1 @& T
例如: STMFD R13!,{R0,R4-R12,LR} 将寄存器列表中的寄存器(R0,R4~R12,LR)内容压入堆栈
7 |- Y& M {. A" ~+ G2 n: T
LDMFD R13!,{R0,R4-R12,PC} 将堆栈内容恢复到寄存器中(R0,R4~R12,PC)中.
* k6 I, O: B; a" `* h) L, d# ]0 u
# a) K0 k' D) `
/ v9 ~: p9 O+ A: a {
作者:
muzitongxue
时间:
2021-9-24 11:10
大多ARM指令都可以条件执行, 也就是根据CPSR中条件码的状态决定是否执行该指令
作者:
xiaoming11
时间:
2021-9-24 15:51
程序的启动都是从ARM指令集开始, 所有的ARM指令集都可以是有条件执行的
* P& G$ e2 v0 a$ l; o1 {
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2