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

ARM汇编

目录

一、指令,伪指令

二、汇编特点

2.1、LDR/STR

2.2、8种寻址方式

2.3、指令后缀

2.4、条件执行后缀

2.5、多级指令流水线

三、汇编指令

3.1、数据处理指令

3.2、cpsr访问指令

3.3、跳转指令

3.4、访存指令

3.5、软中断指令

3.6、cp15操作指令

四、协处理器

五、伪指令


一、指令,伪指令

指令:cpu机器指令的助记符

伪指令:本质不是指令,编译器环境提供,目的是指导编译过程,不会生成机器码

二、汇编特点

2.1、LDR/STR

ARM采用RISC架构,CPU本身不能直接读取内存,需要先将内存加载到寄存器才能CPU处理。

ldr:将内存加载到通用寄存器

str:将通用寄存器内容存入到内存

LDR r0,[r1]
LDR     R0, =__main //伪指令

2.2、8种寻址方式

寄存器寻址:mov r1,r2                        r1=r2;

立即寻址:mov r0,#0xff00                 

寄存器移位寻址:mov r0,r1,lsl #3

寄存器间接寻址:ldr r1,[r2]      

基址变址寻址:ldr r1,[r2,#4]

多寄存器寻址:ldmia r1!,[r2-r7,r12]

堆栈寻找:stmfd sp!,[r2-r7,lr]

相对寻址:flag:

2.3、指令后缀

B:功能不变,操作长度变为8位

H:功能不变,长度16位

S:功能不变,操作数变为有符合。 如:ldr ldrb ldrh ldrsb ldrsh

S:功能不变,影响CPSR标志位。如:MOV和MOVS  movs r0,#0

2.4、条件执行后缀

1、条件后缀执行是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果

2、条件后缀只是决定本句代码是否执行,并不影响下一句代码

EQ,NE等

moveq r1,r2      类似c语言:if(eq){r1=r2;}

2.5、多级指令流水线

取指令--------->译码------------>执行

三、汇编指令

3.1、数据处理指令

数据传输指令:mov mvn

算术指令:add sub rsb adc sbc rsc

逻辑指令:and orr eor bic 

比较指令:cmp cmn tst teq

乘法指令:mvl mla umull umlal smull smlal

前导零计数:clz

3.2、cpsr访问指令

mrs:读psr

msr:写psr

3.3、跳转指令

b:直接跳转

bl:跳转前把地址放入lr寄存器,用于函数调用

bx:跳转同时切换到ARM模式,用于异常处理

3.4、访存指令

单字/半字/字节访问:ldr/str

多字批量访问:ldm/stm

swp

ldmia r0!,{r2-r3}  !作用:就是r0值在ldm过程中发生增加减少最后写回到r0,也就是ldm时会改变r0值。

ldmfd sp!,{r0-r6,pc} ^    ^作用:在目标寄存器有pc时,会同时将spsr写入cpsr,用于异常模式返回

8种后缀

  • ia 先传输,再地址+4
  • ib 先地址+4,再传输
  • da 先传输,再地址-4
  • db 先地址-4,再传输
  • fd 满递减堆栈
  • ed 空递减堆栈
  • fa 满递增堆栈
  • ea 空递增堆栈

四种栈

  • 空栈,满栈,增栈,减栈

3.5、软中断指令

swi :用来实现操作系统的系统调用

3.6、cp15操作指令

mrc:读取cp15中的寄存器

mcr:写入cp15中的寄存器

四、协处理器

协助主cpu实现某些功能

ARM设计上支持多达16个协处理器,但是一般soc只实现其中的cp15

协处理器和MMU,cache,TLB等处理有关,功能上和操作系统的虚拟地址映射,cache管理等有关

例如:

mrc p15,0,r0,c1,c0,0

orr r0,r0,#1

mcr p15,0,r0,c1,c0,0

五、伪指令

gnu汇编符号

@注释
:结尾标号
.  当前指令地址
# 立即数


@c语言的死循环 while(1);

flag:
    b flag

b .
@2种死循环

gnu伪指令

.global _start  @给_start外部链接属性,相当于extern
.section .text @指定当前段为代码段
.ascii .byte .short .long .word .quad .float .string @定义数据
.align 4 @以16字节对齐
.balignl 16 0xabcdefgh @以16字节对齐填充
.equ @类似c宏定义

.end @标识文件结束
.include @ 头文件包含
.arm / .code32 @声明以下为arm指令
.thumb / .code16 @声明以下为thubm指令



AAA:
    .word 0xabcdef
@等价于 unsigned int AAA = 0xabcdef;

最重要的几个伪指令

ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
nop 空操作


@adr,ldr区别
ldr加载的地址在链接时确定,而adr加载的地址在运行时确定
我们可以通过adr和ldr加载的地址比较来判断当前程序是否在链接时指定的地址运行

相关文章:

  • Docker部署并启动RabbitMQ
  • 树莓派远程音乐播放器
  • LeetCode用数组建立二叉树
  • Leetcode560. 和为 K 的子数组
  • Docker部署Tomcat
  • NFT交易量下滑 传统品牌布局热情未衰
  • 2022下半年各省软考报名费用汇总,不知道的看这里
  • 社交网络的数据挖掘与分析,什么是社交网络分析
  • Allegro DVT与SiMa.ai携手优化嵌入式边缘应用的能效
  • 2022-8-30 第七小组 学习日记 (day54)JavaWeb、Servlet、HTTP-请求 响应、乱码问题
  • U9二次开发之BE插件开发
  • 推荐系统-Hive基础
  • 通信原理 | 基本概念:信源、信道、噪声、信宿等
  • 关于Flask高级_RequestParser中的add_argument方法参数详解
  • flume系列之:基于zookeeper部署flume agent升级guava和curator版本
  • iOS 系统授权开发
  • Javascript 原型链
  • Java的Interrupt与线程中断
  • MaxCompute访问TableStore(OTS) 数据
  • node 版本过低
  • Promise面试题,控制异步流程
  • Python_网络编程
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Shadow DOM 内部构造及如何构建独立组件
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 分类模型——Logistics Regression
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于webpack 的 vue 多页架构
  • 浅谈web中前端模板引擎的使用
  • 巧用 TypeScript (一)
  • 一个项目push到多个远程Git仓库
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​queue --- 一个同步的队列类​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #if和#ifdef区别
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C语言)二分查找 超详细
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (四) 虚拟摄像头vivi体验
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net程序帮助文档制作
  • .NET性能优化(文摘)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .考试倒计时43天!来提分啦!
  • @Autowired和@Resource装配