欢迎光临
我们一直在努力

ARM指令的寻址方式

目录

立即寻址

寄存器寻址

寄存器间接寻址

基址加变址寻址

相对寻址

堆栈寻址

块拷贝寻址


  • 立即寻址
  • 本质特征:操作数直接包含在指令中,以“#”为前缀标识
  • 数值表示
  • 十六进制需加“0x”前缀
  • 无前缀默认十进制
  • 典型指令
  • MOV R0,#0x11:将立即数0x11存入R0
  • ADC R0,R0,#99:带进位加法,R0⬅R0 + 99 + C
  • 寄存器寻址
  • 操作特点:直接使用寄存器编号(R0-R15)作为操作数
  • 执行效率:在各类微处理器中效率较高
  • 示例
  • ADD R3,R1,R2:若R1=5,R2=6,则R3=11
  • 识别要点:无特殊符号,直接使用寄存器编号
  • 寄存器间接寻址
  • 核心概念:寄存器存储的是操作数的内存地址而非数据本身
  • 语法标识:用中括号[ ]包裹寄存器编号
  • 操作流程
  • 从寄存器读取地址(如R1=5)
  • 访问该内存地址获取实际数据(如地址6存储值10)
  • 典型指令
  • STR R1,[R2]:将R1值存入R2指向的内存单元
  • 基址加变址寻址
  • 组成要素
  • 基址寄存器(如R11)
  • 地址偏移量(立即数或寄存器)
  • 例如
  • LDR R0, [R1,#3]        R0⬅[R1+3]
  • STR R1,[R2,#6]         [R2+6]⬅R1   把寄存器 R1中的数值,写入到内存地址为 “R2 寄存器的值 + 6” 的位置
  • LDR R0,[R1,#3]!        R0⬅[R1+3],R1⬅R1+3    R1+3地址读数据到R0,同时把 R1更新为R1+3
  • LDR R0,[R1],#3         R0⬅R1,R1⬅R1+3      R1 为地址读数据到R0,再把R1更新为R1+3
  • LDR R0,[R1,R2]         R0⬅[R1+R2]
  • STR R0,[R1+R2]        [R1+R2]⬅R0
  • 应用场景:访问基地址附近的连续内存区域
  • 相对寻址
  • 基准参考:以程序计数器PC当前值为基地址
  • 偏移计算:指令中的标号作为有符号偏移量
  • 典型应用
  • BLSubroutine_A:跳转到子程序
  • MOV PC,LR:子程序返回
  • 方向特性
  • 正偏移:向下跳转(地址增大)
  • 负偏移:向上跳转(实现循环)
  • 堆栈寻址
  • 数据结构:先进后出(FILO),通过专用SP寄存器管理
  • 生成方向
  • 递增堆栈:地址由低向高增长
  • 递减堆栈:地址由高向低增长
  • 四种模式
  • 满递增:SP指向最后数据,低→高地址
  • 满递减:SP指向最后数据,高→低地址
  • 空递增:SP指向下一空位,低→高地址
  • 空递减:SP指向下一空位,高→低地址
  • 块拷贝寻址
  • 别名:多寄存器寻址
  • 批量操作:单条指令可传送最多16个通用寄存器
  • 典型格式
  • STMIA R0!,{R1,R2,R5,R9}:
  • R1→[R0]
  • R2→[R0+4]
  • R5→[R0+8]
  • R9→[R0+12]
  • 最后更新R0=R0+16
  • 赞(0)
    未经允许不得转载:171主机测评 » ARM指令的寻址方式
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址