关于 ARMv8 的基础知识,请查看这篇文章 ARMv8 简介。

ARM 指令

指令编码



逻辑运算指令

  • LSL 逻辑左移
    按操作数所指定的数量向左移位,低位用零来填充
  • ASL 算术左移
    同逻辑左移,ASL 与 LSL 等价
  • LSR 逻辑右移
    按操作数所指定的数量向右移位,左端用零来填充。
  • ASR 算术右移
    按操作数所指定的数量向右移位,左端用最高位位的值来填充 ,如果是负数,最高位为1。
  • ROR 循环右移
    按操作数所指定的数量向右循环移位, 左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数。 当进行寄存器bit位数的循环右移操作时,通用寄存器中的值不改变。

程序流控制

返回指令(ret)

发生函数调用时,函数返回地址存在 lr 寄存器中,函数返回时使用 ret 指令,此时 lr 恢复到 pc 中,继续之前的执行流。

跳转指令(b/bl/blr)

# 跳转指令
# 跳转到 label 标记处的地址执行
b label# 带返回地址的跳转指令,用于子函数调用
# 1. 把下一条指令的地址存储到 `lr` 寄存器中
# 2. 跳转到标记处执行指令
bl label# 与 bl 的区别在于跳转的地址放在寄存器中
blr reg

条件执行

通常配合 cmp 等指令进行判断。beqb.eq 都是可以的写法。

条件执行:condition execution
条件标志:condition flags
条件码:condition code

根据运算结果更新的条件标志,来判断指令的条件码是否符合条件,符合条件才执行。

  • 几乎所有A32的指令都可以基于APSR中的条件标志,进行带条件判断的执行。
  • 寄存器为0与否,CBZ CBNZ;寄存器某个位为0与否, TBZ TBNZ。
条件标志 置位/清除
N 当运算的结果为负数的话置位,其他情况清 0。
Z 当运算的结果为 0 的话置位,其他情况清 0。
C 当运算的结果产生进位或者减法运算没有借位的话置位,其他情况清 0。无符号数加法翻转等。
V 当运算的结果产生溢出的话置位,其他情况清 0。有符号数加法溢出等。

C位是 进位标志 ,最为复杂,可能的情况如下:

  • 无符号(unsigned)加法运算(包括比较指令 CMN)发生了翻转,产生进位,C置位。
  • 无符号(unsigned)减法运算(包括比较指令 CMP)如果没有借位(减完结果是正的),C置位。
  • 移位操作也会影响C位(可以参考我之前文章中对移位操作介绍,ARM汇编指令中灵活的第二操作数),C的值是最后一个被移位器移出的位值,当然这个被移出的位值如果为1那么C值就为1。
  • 除了上面3种情况,C位通常是不会被改变的,但也有特殊指令会造成C位改变,这个如果自己在编程时会用到C位最好参考一下汇编指令手册,确认一下对应的指令是否对C位有特殊影响。

内存操作

ARM 是精简指令集的架构。其采用 Load/Store 的访存内存模式,非常简单,它的含义是数据必须从内存中加载到 CPU 中才能进行后续的算术运算或逻辑运算。

写入与读取内存分别对应 strldr 类的操作。

ldr:偏移为正。
ldur:偏移为负。
str:偏移为正。
stur:偏移为负。

str x0, [x1, #04]
stur x0, [x1, #-04]
ldr x0, [x1, #04]
ldur x0, [x1, #-04]

值得注意的是 ARM 寻址时的 post-indexed addressingpre-indexed addressing,以及地址的 writeback

访存的地址由基址寄存器和偏移计算得出,访存后基址寄存器的值不发生变化。
Pre-indexed
The offset is combined with the value in the base register, and the base register is updated with this new address before being used to access memory.

访存的地址由基址寄存器给出,访存后基址寄存器更新为基址寄存器和偏移的计算结果。
Post-indexed
The value in the base register alone is used to access memory. Then the the offset is combined with the value in the base register, and the base register is updated with this new address after accessing memory.

LDRD<c> <Rt>, <Rt2>, [<Rn>{, #+/-<imm>}]
LDRD<c> <Rt>, <Rt2>, [<Rn>, #+/-<imm>]!
LDRD<c> <Rt>, <Rt2>, [<Rn>], #+/-<imm>ldrd r0, r1, [r2, #4] # pre-index, no writeback, r2 不变
ldrd r0, r1, [r2, #4]! # pre-index, writeback, r2 = r2 + 4
ldrd r0, r1, [r2], #4 # post-index, writeback, r2 = r2 + 4

关于数据的非对齐访问请查看另一篇文章 非对齐访问——以ARM为例。

ARM 指令 对齐访问等相关推荐

  1. ARM非对齐访问和Alignment Fault

    转载自ARM非对齐访问和Alignment Fault - 者旨於陽 - 博客园 (cnblogs.com) 1.指令对齐 A64指令必须word对齐.尝试在非对齐地址取值会触发PC alignmen ...

  2. ARM指令寻址方式之: 内存访问指令寻址

    4.2  内存访问指令寻址 根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种. ① 字及无符号字节的Load/Store指令的寻址方式. ② 杂类Load/Store指令的寻址方式. ③ ...

  3. arm 指令1(转)

    指令格式:  指令{条件}{S} {目的Register},{OP1},{OP2} "{ }"中的内容可选.即,可以不带条件只有目的寄存器,或 只有目的寄存器和操作数1,也可以同时 ...

  4. 单片机(MCU)如何才能不死机之对齐访问(Aligned Access)

    从一个结构体说起.如下,在 STM32F0 的程序中,我们定义了一个结构体My_Struct ,那么这个结构体占用多少内存呢? struct Struct_Def { uint8_t Var_B; u ...

  5. ARM指令——跳转指令

    目录 一.跳转指令 方式一:直接修改PC寄存器的值(不建议使用,需要自己计算目标指令的绝对地址) 方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址 方式三:带返回的跳转指 ...

  6. thumb指令和arm指令

    参考https://www.embedded.com/introduction-to-arm-thumb/ 一.为什么一个芯片需要thumb和arm两套指令集 许多复杂的功能在复杂指令集(CISC)处 ...

  7. 结构体成员非对齐访问所带来的思考

    [摘要]本文介绍了内存访问时为什么需要对齐及不对齐时带来的影响.接着介绍了如何改变对齐规则来保证CPU能够访问非对齐内存.最后介绍了结构体设计时需要注意的问题,如何调整成员顺序或者填充特定单元来避免平 ...

  8. 常用ARM指令总结(未完待续)

    ARM指令集介绍 7种工作模式,2种工作状态 ARM指令的种类,共有7类指令,可以完成存储器访问,数据运算,程序跳转,处理器控制,以及帮助编程的伪指令等. 数据处理指令大致分为三类: a.数据传送指令 ...

  9. Trumb/ARM 指令模式

     ARM ARM 指令集是一组提供一整套运算的 32 位指令. ARMv4T ARMv4T 及更高版本定义了一个名为 Thumb 指令集的 16 位指令集. 32 位 ARM指令的多数功能都可用,但有 ...

最新文章

  1. nginx使用HttpImageFilterModule
  2. 【转】Weblogic的集群
  3. 使用shell定时自动备份mysql数据库
  4. DataGrid中的高级ToolTip
  5. 简明writeStream实现
  6. “敏捷”联袂“ALM” 上演市场模范夫妻秀
  7. MDK5软件入门之新建工程项目模板
  8. 全开源!Office多人协作应用,在线编辑Word、Excel和PPT文档
  9. NetSuite Saved Search不是啥都能查
  10. 电脑图标出现蓝色问号解决方法
  11. 中国科学院计算机研究所上级单位,陈援非(中国科学院计算技术研究所高工)_百度百科...
  12. python哪里最难用_Python里最难的Asyncio,这里有一份非常适合小白的教程
  13. 一个关于springboot的junit使用错误,空指针异常
  14. vue实现当前组件重新加载
  15. 收费的Chemdraw跟不上时代潮流
  16. linux查看某个端口的流量_linux流量查看工具汇总
  17. 去金坛长荡湖吃船菜,原来1947年就有前辈在努力发展中国的计算机产业
  18. SSH远程连接Ubuntu【局域网】
  19. leelen可视对讲怎么接线_无线可视对讲门铃怎么样 无线可视对讲门铃性能特点【详解】...
  20. 阿里云服务器ECS接入多IP_ECS绑定多个弹性公网IP搭建

热门文章

  1. 基于ArduPilot的旋翼式无人机飞行器开发系列(一,入门)
  2. [转]《乒乓世界》封面故事:中国男乒直板三人行
  3. matlab水印攻击代码,可以运行的水印MATLAB程序(嵌入 提取 攻击测试等)
  4. 基于matlab多功能相控阵雷达资源管理的服务质量优化
  5. html文章font-family字体集合
  6. AutoHotKey使用技巧
  7. 下一个倒下的是不是Genesis
  8. RobotFramework功能自动化测试框架基础篇
  9. protues仿真中12864液晶屏串行编程的感想(从实际硬件驱动芯片 ST7565R到仿真硬件驱动芯片SED1565)
  10. Windows XP SP2之初体验