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

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. 立即寻址: 操作数本身就是指令中给出.                                                                                                                  例如: ADD R0,R0,#1              R0<-R0+1                                                                                                                  ADD RO,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]                                                                                                                      LDR R0,[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

              ...

              MOV PC,LR

   7.  堆栈寻址:

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

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

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

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

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

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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值