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* M8 e. y+ M! ~5 T, k0 B
{cond}: 指令执行的条件编码, 如EQ,NE
% g( Y0 J) U+ r6 k% J<opcode>: 指令操作符编码, 如LDR, STR5 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