当前位置: 首页 > news >正文

ARM汇编

ARM 汇编

汇编语言特点

  • 汇编的实质:机器指令(机器码)的助记符,是一种低级符号语言,是一款CPU的本质特征
  • 不同CPU的机器指令集设计不同,汇编语言不能在不同CPU之间互相移植
  • 汇编程序可以充分发挥CPU的设计特点,在操作系统内核中效率极其重要处都需要用汇编处理

ARM汇编指令

ARM汇编指令与伪指令

  • 指令
    CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行
  • 伪指令
    本质上不是指令(只是和指令一起写在代码中),是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令不会生成机器码

ARM汇编特点

  • ldr/str架构
    • ARM采用RISC架构,CPU本身不能直接读取内存,而需要先把内存中的内容加载到CPU的通用寄存器中才能被CPU处理
    • ldr(load register)指令:将内存中的内容加载入通用寄存器
    • str(store register)指令:将寄存器中的内容存入内存空间中
    • ldr/str组合用来实现ARM CPU和内存数据交换
  • 8种寻址方式
    类型指令
    寄存器寻址mov r1, r2
    立即寻址mov r0, #0XFF00
    寄存器移位寻址mov r0, r1, lsl #3
    寄存器间接寻址mov r1, [r2]
    基址变址寻址mov r1, [r2, #4]
    多寄存器寻址ldmia r1!, {r2-r7, r12}
    堆栈寻址stmfd sp!, {r2-r7, lr}
    相对寻址beq flag
    flag:
  • 指令后缀
    同一指令经常附带不同后缀,变成不同的指令含义。如:
    • B(Byte):功能不变,操作长度变为8位(如:ldr,ldrb)
    • H(Half word):功能不变,操作长度变为16位(如:ldr,ldrh)
    • S(signed):功能不变,操作数变为有符号(如:ldr,ldrsb,ldrsh)
    • S(S标志):功能不变,影响CPSR标志位(如:mov,movs)
  • 条件执行后缀
    操作码助记符标志含义
    0000EQZ=1相等
    0001NEZ=0不相等
    0010CS/HSC=1无符号数大于或等于
    0011CC/LOC=0无符号数小于
    0100MIN=1负数
    0101PLN=0正数或0
    0110VSV=1溢出
    0111VCV=0没有溢出
    1000HIC=1,Z=0无符号数大于
    1001LSC=0,Z=1无符号数小于或等于
    1010GEN=V有符号数大于或等于
    1011LTN!=V有符号数小于
    1100GTZ=0,N=V有符号数大于
    1101LEZ=1,N!=V有符号数小于或等于
    1110AL任意无条件执行(指令默认条件)
    1111NV任意从不执行(不要使用)
  • 多级指令流水线
    • 为增加处理器指令流的速度,ARM使用多级流水线
    • 运行多个操作同时处理,而非顺序执行
    • PC指向正被取指的指令,而非正在执行的指令
      取指
      从存储器中读取指令
      解码
      解码指令中用到的寄存器
      执行
      寄存器读 / 移位及ALU操作 / 寄存器写

ARM常用指令

  • 数据处理指令

    类别指令
    数据传输指令mov mvn
    算术指令add sub rsb adc sbc rsc
    逻辑指令and orr eor bic
    比较指令cmp cmn tst teq
    乘法指令mvl mla umull umlal smull smlal
    前导零计数clz
  • cpsr访问指令
    cpsr寄存器比较特殊,需要专门的指令访问,即:mrs、msr

    • mrs:读psr
    • msr:写psr
  • 跳转(分支)指令

    指令描述
    b直接跳转
    bl跳转前把返回地址放入lr中,以便返回,以便于函数调用
    bx跳转同时切换到ARM模式,一般用于异常处理的跳转
    (现在基本不用了)
  • 访存指令

    指令描述
    ldr/str单字/半字/字节访问
    ldm/stm
    (load/store register mutiple)
    多字批量访问
    swp数据交换
  • 软中断指令

    • swi(Software interrupt):用来实现操作系统中系统调用

立即数

包括合法立即数、非法立即数

  • 合法立即数:经过任意位数的移位后非零部分可以用8位表示

四种栈

  • 空栈:
    栈指针指向空位,存入时可以直接存入,然后指针移动一格;取出时,需要先移动一格才能取出
  • 满栈
    栈指针指向栈中最后一格数据,存入时需要先移动指针,再存入;取出时可以直接取出,然后再移动栈指针
  • 增栈
    栈指针移动时向地址增加的方向移动的栈
  • 减栈
    栈指针移动时向地址减小的方向移动的栈

八种后缀

  • ia(increase after):先传输,再地址+4
  • ib(increase before):先地址+4,再传输
  • da(decrease after):先传输,再地址-4
  • db(decrease before):先地址-4,再传输
  • fd(full decrease):满递减堆栈
  • ed(empty decrease):空递减堆栈
  • fa(full add):满递增堆栈
  • ea(empty add):空递增堆栈

特殊符号的作用

  • !号作用
    如:ldmia r0!, {r2 - r3}
    r0的值在ldm过程中发生的增加或减少最后写回到r0,会改变r0的值
  • ^号作用
    如:ldmfd sp!, {r0 - r6, pc}^
    在目标寄存器中有PC时,会同时将spsr写入到cpsr。一般用于从异常模式返回

ARM汇编伪指令

  • 伪指令不是指令,和指令的根本区别是:伪指令编译后不会生成机器码
  • 伪指令的意义在于:指导编译过程
  • 伪指令和具体的编译器相关,使用gnu工具链时,只需学习gnu环境下的汇编指令

gnu汇编中常用符号

符号描述
@注释。可以在行首,也可以在代码行尾。类似C语言“//”
# 1注释。行首
# 2立即数前面要加#或$,表示立即数
以冒号结束的是标号
.点号在gnu汇编中表示当前指令的地址

gnu汇编中常用伪指令

伪指令描述
.global _start给_start外部链接属性
.section .text指定当前段为代码段
.ascii .byte .short .long .word
.quad .float .string
定义数据
.align 4以2^4=16字节对齐
.balignl 16 0xabcdefgh以16字节对齐填充
.equ类似于C中宏定义
.end文件的结束
.include头文件包含
.arm / .code32声明为arm指令
.thumb / .code16声明为thumb指令
nop空操作
ldr大范围的地址加载指令。
伪指令ldr使用,如:ldr r0, =0xff
区别于指令ldr使用,如:ldr r0, #0xff
adr小范围的地址加载指令
adrl中范围的地址加载指令
  • adr和ldr的差别
    • adr编译时会被一条sub或add指令替代;ldr编译时会被一条mov指令替代或者文字池方式处理
    • ldr加载的地址在链接时确定;adr加载的地址在运行时确定

ARM协处理器

协处理器(CP coprocessor)

  • 协处理器是SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。
  • ARM 设计上支持多大16个协处理器,但一般SOC上只实现其中的CP15
  • 协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟映射、cache管理等有关

协处理器指令

  • mrc:读取CP15中的寄存器
  • mcr:写入CP15中的寄存器
http://www.lryc.cn/news/617345.html

相关文章:

  • word格式设置-论文写作,样式,字号等
  • 【大模型】强化学习算法总结
  • 用户管理系统后台管理界面
  • Python面试题及详细答案150道(41-55) -- 面向对象编程篇
  • VBA即用型代码手册:计算选择的单词数Count Words in Selection
  • 5种无需USB线将照片从手机传输到笔记本电脑的方法
  • vue+flask基于规则的求职推荐系统
  • Spring Boot启动事件详解:类型、监听与实战应用
  • 腾讯云Edgeone限时免费
  • 有序矩阵中第K小的元素+二分查找
  • 使用 Rust 创建 32 位 DLL 的完整指南
  • 数据大集网:精准获客新引擎,助力中小企业突破推广困局
  • CSPOJ:1561: 【提高】买木头
  • 请求报文和响应报文(详细讲解)
  • nomachine的安装和使用
  • 零基础学习jQuery第三天
  • 用 Python 绘制企业年度财务可视化报告 —— 从 Excel 到 9 种图表全覆盖
  • DDIA第五章:分布式数据复制中的一致性与冲突处理
  • 第5节 大模型分布式推理通信优化与硬件协同
  • 在Debian上安装MySQL
  • Excel 实战:基因表达矩阵前处理中测序符号的快速剥离方法
  • golang 基础案例_02
  • 设计模式笔记_结构型_享元模式
  • 深入解析Prompt缓存机制:原理、优化与最佳实践
  • Agent在供应链管理中的应用:库存优化与需求预测
  • Python FastAPI + React + Nginx 阿里云WINDOWS ECS部署实战:从标准流程到踩坑解决全记录
  • typecho博客设置浏览器标签页图标icon
  • 【工控】线扫相机小结 第六篇
  • uncalled4
  • 麒麟系统使用-PATH设置