ARM (二) arm指令分类及其寻址方式

来源:互联网 发布:提花组织软件 编辑:程序博客网 时间:2024/05/20 10:13

ARM

一.ARM指令长度及数据类型

  1. ARM微处理器的指令长度可以是32位(ARM状态下),也可以是16位(在Thumb状态下)
  2. ARM微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,字需要4字节对齐(地址低两位为0),半字需要2字节对齐(地址的最低位为0)
  3. 程序的启动都是从ARM指令集开始, 所有的ARM指令集都可以是有条件执行的.

二. ARM汇编指令格式

ARM <wbr>(二) <wbr>arm指令分类及其寻址方式

  1. {cond}: 指令执行的条件编码, 如EQ,NE
  2. <opcode>: 指令操作符编码,如LDR, STR
  3. {S}: 决定指令的执行是否影响CPRS的值
  4. <Rn>:包含第一个源操作数的寄存器编码
  5. <Rd>: 目标寄存器编码
  6. <shifter_operand>:第二个源操作数

ARM指令语法格式中,<>中的内容是必需的, 而{}中的内容是可选的

 

三. ARM指令的条件码域

  1. 大多ARM指令都可以条件执行, 也就是根据CPSR中条件码的状态决定是否执行该指令.
  2. 只有在CPSR的条件码标志满足指定的条件时,带条件码的指令才可以执行,否则被忽略(相当于一条空操作NOP指令)
  3. 每一条ARM指令编码中包含4位的条件码.位于指令编码的最高4位[31:28]

四. ARM指令的条件码域

ARM <wbr>(二) <wbr>arm指令分类及其寻址方式

五. ARM寻址方式

  1. 立即寻址:操作数本身就是指令中给出.                                                         例如: ADDR0,R0,#1       R0<-R0+1                                                         ADDRO,R0,#0x3f    R0<-R0+0x3f    
  2. 寄存器寻址:利用寄存器中的数值作为操作数.                                                   例如: ADD R0,R1,R2  R0<-R1+R2
  3. 寄存器间接寻址: 以寄存器中的值作为操作数的地址,而操作数存放在存储器中.                     例如: ADD R0,R1,[R2]  R0<-R1+[R2]                                                        LDR R0, [R1] R0<-[R1]                                                                      STR R0,[R1]  [R1]<-R0
  4. 基址变址寻址: 将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址       例如: LDR R0,[R1,#4] R0<-[R1+4]                                                            LDRR0,[R1,#4]  R0<-[R1+4],R1<-R1+4                                                          LDR R0,[R1],#4 R0<-[R1],R1<-R1+4
  5. 多寄存器寻址:一条指令可以完成多个寄存器值得传送.                                           例如: LDMIA R0,{R1,R2,R3,R4}R1<-[R0],R2<-[R0+4],R3<-[R0+8],R4<-[R0+12]
  6. 相对地址:基地址为程序计数器PC的当前值,偏移量为目的地址和现行地址之间差的基址变址寻址,将PC的值与偏移量相加之后的得到的操作数的有效地址. 

     例如:   BL NEXT

              ...

             NEXT

             ...

              MOVPC,LR

  7.  堆栈寻址:

           递增堆栈:向高地址方向生长

          递减堆栈: 向低地址方向生长

          满堆栈: 指针指向最后压入堆栈的有效数据项.

          空堆栈: 指针指向下一个要放入数据的空位置.

       例如: STMFD R13!,{R0,R4-R12,LR} 将寄存器列表中的寄存器(R0,R4~R12,LR)内容压入堆栈

             LDMFD R13!,{R0,R4-R12,PC} 将堆栈内容恢复到寄存器中(R0,R4~R12,PC)中.

 

六. 伪指令集  (略) 具体看笔记

0 0
原创粉丝点击