寻址方式是针对源操作数来说的

6.1 立即数寻址

  • 源操作数是立即数
  • 立即数:操作码以 # 号开头的数字为立即数
  • 立即数寻址: MOV   R0, #0x300
  • 伪指令:        LDR   R0,=0x12345678
  • 注意:
    • 立即数是 8 位数据存储,用  X 表示(0~255),4 位存移位的次数,用 Y 表示(0~15),立即数 = X 循环右移 2 * Y 个位
    • 立即数 0xf200 是由 0xcf2 间接表示的,即是由 8 位的 F2 循环右移 24 位(2 * 12)得到 X = 0xf2; Y = 0xC

6.2 寄存器寻址

  • MOV R0,R1
  • 源操作数是 寄存器

6.3 寄存器移位寻址

  • 将寄存器寻址的源操作数进行移位
  • MOV R0, R2, LSL, #3
  • 将 R2 左移 3 位后,赋值给 R0

6.4 寄存器间接寻址

  • ARM 中由 L/S 结构,即 load/store
  • LOAD 是将内存的数据载入到寄存器中
  • STROE 是将寄存器中的数据存储到内存中
  • 指令:
    • LDR R0,{R1}      把 {R1} 中的值取出来放入到 R0 中
    • STR R0,{R1}  把 R0 中的值取出来放入到 R1 中
    • {R1} 表示取 R1 存放的地址中的数据,换成 C 语言,即 *R1
 MOV R1, #0x40000000
LDR R0, {R1}
STR R0, {R1} //若 R1 中的数据 0x40000000 所代表的数据是 0x55,则 R0 的值为 0x55

6.5 基址变址寻址

  • MOV R0, #44
  • MOV R1, #0x40000008
  • STR R0, [R1, #-4]
  • [R1, #-4] 的意思是将 R1 存储的地址值 - 4
  • #-4 表示偏移量
  • STR R0, [R1, #-4]!
  • ! 表示回写,即 C 语言中的 i--,上一句则先把 R1 的地址值赋值到 R0 中,再将 R0 中的值 - 4
  • 上一句相当于 STR R0,[R1], #-4

6.6 多寄存器寻址

  • STMIA R0!, {R1 - R3, R5}
  • 将 R1 R2 R3 R5 中的值,存放在以 R0 为起使的地址空间中
  • 大括号中的内容表示寄存器中的值,R0 对应的是存储器的地址
  • STM: 操作多个存储器的值
  • 对应的命令是 LDMIA
  • I/D(increase/decrease)   A/B(after/before)

  

6.7 堆栈寻址

  • 进行栈的操作,栈的寄存器是 R13,即 SP 寄存器
  • STMFD SP!, {R1-R3}    压栈,寄存器号大的先入栈,与书写顺序没关系
  • LDMFD SP!, {R1-R3}   出栈
  • 组合:  F(FULL)/E(EMPTY)   I/D

    • 一般都写成 FD,因为 ARM 的地址空间是满递减的
    • 满堆栈:堆栈指针指向最后压入的有效数据项
    • 空堆栈:堆栈指针指向下一个待压入数据的空位置
  • MOV SP, #0x40000010
  • STMFD SP!, {R1-R4}
  • 即将 R4 R3 R2 R1 的值存入 0x4000000c 0x40000008 0x40000004 0x40000000

6.8 相对寻址

  • 51 中用的 jmp 和 call 指令
  • 相对寻址就是一个跳转,相对寻址是相对于 PC 而言的,跳转指令:B   BL   BLX   BX
  • B:跳转指令
  • BL:带返回的跳转指令
  • BLX:带返回和状态切换的跳转指令
  • BX:带状态切换的跳转指令

六、ARM 寻址方式的更多相关文章

  1. ARM寻址方式,王明学learn

    ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...

  2. 2.4 ARM寻址方式

    所谓的寻址方式就是处理器指令中给出的信息来找到指令所需要的操作数的方式 1. 立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即 ...

  3. ARM寻址方式

    寻址方式: 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 1.立即数寻址 2.寄存器寻址 3.寄存器间接寻址 就是寄存器中存放的是操作数在内存中的地址 例如以下指令: LDR ...

  4. (六)ARM状态寄存器-PSR

    ARM程序状态寄存器Program State Register 在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的 ...

  5. ARM 寻址方式

    寻址方式有 9种 1.寄存器 2.立即数 3.寄存器位移 4.寄存器间接 5.基址 6.多寄存器 7.堆栈 8.块拷贝 9.相对 1. MOV R1,R2 R1 = R2 2. MOV R0,#0x1 ...

  6. [国嵌笔记][023][ARM寻址方式]

    寻找方式 1.处理器根据指令中给出的信息来找到指令所需操作数的方式 2.立即数寻址 操作数本身在指令中给出,立即数前加”#”表示立即数寻址,操作数在指令中 3.寄存器寻址 利用寄存器中的数值作为操作数 ...

  7. 【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)

    : 12MHz 晶振 对应 405 ~ 532 MHz 处理速度; -- : 16K 指令缓存, 16K 数据缓存; -- : 32KB 指令缓存, 32KB 数据缓存; (3) 内存接口对比 : 提 ...

  8. ARM汇编语言

    ---恢复内容开始--- arm汇编语言 汇编语言是一种程序设计语言,arm处理器是一种16/32位的嵌入式RISC微处理器.一开始我把这混为一谈了.ARM汇编的特点:汇编语言,又叫助记符语言. 1) ...

  9. Arm寄存器介绍及汇编基础

    一.ARM处理器支持7种工作模式 ① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state) ② 快速中断模式(FIQ): 用于高速数据 ...

随机推荐

  1. 尚硅谷Docker---docker安装及简介

    尚硅谷Docker---docker安装及简介 一.总结 一句话总结: docker就相当于是一个极微型的linux系统,独立 1.使用Docker的步骤? 1).安装Docker 2).去Docke ...

  2. 在SOUI3.0中使用数值动画

    上一篇介绍了插值动画,插值动画是直接作用于窗口对象的. 数值动画则可以作用于任何对象. SOUI内置了3种数值类型的动画,分别是SIntAnimator, SFloatAnimator, SColor ...

  3. leetcode 107.Binary Tree Level Order Traversal II 二叉树的层次遍历 II

    相似题目: 102 103 107 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode ...

  4. E: 错误,pkgProblemResolver::Resolve 发生故障,这可能是有软件包被要求保持现状的缘故。 E: 无法更正依赖关系

    mentohust:i386 已经是最新的版本了. 您可能需要运行"apt-get -f install"来纠正下列错误: 下列软件包有未满足的依赖关系:  mentohust:i ...

  5. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_3 Mybatis中编写dao实现类的使用-修改删除等其他操作

    update和上面的Insert代码基本是一样的,只需要修改这里, 测试Update的方法 删除 findById 测试方法 findByName 测试方法 findTotal

  6. HTTP学习记录:二、请求方法

    学习资源主要为:@小坦克HTTP相关博客 最基础的是4种,GET.POST.PUT.DELETE对应着对资源的查.改.增.删.最常用的是GET和POST. GET一般用于获取/查询资源信息: POST ...

  7. 【工具安装】MAC 安装 netdiscover 使用教程

    日期:2019-06-27 15:54:19 作者:Bay0net 介绍:在 mac os 下,如何安装 netdiscover 及基本使用方法 0x01.当前环境 MAC os 10.14.4 已安 ...

  8. golang 千位分隔符

    项目需求将统计出的数字以千位分隔符分隔的形式展示(如将 1234567.89 格式化为 1,234,567.89),而 golang 的标准库中并无这样的函数. 万能的 google 找到解决办法,可 ...

  9. Hibernate一级缓冲

    Hibernate的一级缓冲 什么是缓冲 缓冲概念: 数据存在数据库中,数据库本身就是一个文件系统,使用流的方式操作文件,但是文件中有很多的内容,用流的操作得效率就低. 解决办法: 把数据存在内存中, ...

  10. linux下搭建mysql数据库

    linux下搭建mysql数据库 1.下载mysql: http://dev.mysql.com/downloads/mysql/5.6.html#downloads wget http://dev. ...