ARM汇编:(APCS过程调用标准)

汇编:用助记符(如$ # .)代替操作码,用地址符号或标签代替地址码的编程语言

特点:

优点:可以直接访问硬件,目标代码简短,执行速度快(CPU启动时需要直接操作,所以用汇编)

缺点:可移植性差,可阅读性差(不同平台指令有差别)

ARM指令集特点

1 指令码长度固定,如32bit

2 几乎所有指令都是有条件执行

3 寄存器与内存之间交换数据采用专用指令集

CPU内部有很多通用寄存器,如R0-R15,R0-R12可以随便存储数据,寄存器中的数据主要是从外存取出来的,所以为了提高效率把寄存器和寄存器里面交互使用专用指令,寄存器与内存之间交互也使用另一种专用指令,这样就可以把他们分离开,让数据操作变的效率更高。

指令格式:

opcode:指令助记符

cond:执行条件

s:是否影响CPSR寄存器的值

Rd:目标寄存器

Rn:第一个操作数的寄存器

operand2:第二个操作数

指令编码格式:

32-28

27-25

24-21

20

19-16

15-12

11-0

cond

001

opcode

S

Rn

Rd

11-8(移位)

7-0(数据)

operand2

代码格式:

数据运算指令:

指令

功能

实例

注释

mov

给一个寄存器赋值

mov r0,#10

r0=10

mov r0,r1

r0=r1

mvn

把一个数值按位取反后赋值给一个寄存器

mvn r0,#0xff

r0=~0xff

mvn r0,r1

r0=~r1

add

计算两个数值的加法

add r0,r0,#10

r0=r0+10

add r0,r0,r1

r0=r0+r1

sub

计算两个数值的减法

sub r0,r0,#10

r0=r0-10

sub r0,r0,r1

r0=r0-r1

mul

乘法

mul r0,r1,r2

r0=r1*r2

cmp

比较

cmp r0,r1

r0-r1影响CPSR标志位

cmp r0,#10

r0-10影响CPSR标志位

ldr r5,=20008000  ;20008000不是立即数,而是将它赋值为r5,此条指令是伪指令:伪指令在编译器编译的时候把伪指令分解为几条指令实现;

往寄存器中存放数据有三种方式:

1 mov 有效立即数

2 mvn 立即数按位取反的数

3 ldr 任何数

数据运算指令:

指令

功能

实例

注释

orr

按位或

orr r0,r0,r1

r0=r0|r1

orr r0,r0,#10

r0=r0|10

and

按位与

and r0,r0,r1

r0=r0&r1

and r0,r0,#10

r0=r0&10

bic

位取反

bic r0,r0,r1

r0=r0&(~r1)

bic r0,r0,#10

r0=r0&(~10)

内存操作指令

指令

功能

实例

注释

swp Rd,Rm,[Rn]

将寄存器中的值与内存地址中的值交换

注:Rn不能与Rd和Rm相同

swp r0,r1,[r2]

r0=*r2

*r2=r1

ldr

把数据从内存加载到寄存器

ldr r0,=addr

r0=addr

ldr r1,[r0]

r1=*r0

ldr r1,[r0,#4]

r1=*(r0+4)

ldr r1,[r0,#4]!

r1=*(r0+4);r0+=4

ldr r1,[r0],#4

r1=*r0;r0+=4

str

把数据从寄存器保存到内存

str r1,[r0]

*r0=r1

str r1,[r0,#4]

*(r0+4)=r1

str r1,[r0,#4]!

*(r0+4)=r1;r0+=4

str r1,[r0],#4

*r0=r1;r0+=4

str r1,[r0] 把r1存储到r0指向的内存地址(r0指向的地址是0x40000000)

ldr r1,[r0] 把r0指向的内存地址中的数据存储到r1寄存器中

/******************
r1、r2、r3、r4四个数据存储到0x20000000为首的地址空间 *****************/
mov r0,#0x20000000
mov r1,#0x11
mov r2,#0x22
mov r3,#0x33
mov r4,#0x44 str r1,[r0]
add r0,r0,#
str r2,[r0]
add r0,r0,#
str r3,[r0]
add r0,r0,#
str r4,[r0]
add r0,r0,#

内存连续操作指令

指令

功能

实例

ldmfd

把数据从内存加载到寄存器

ldmfd sp!,{r0-r12,lr}

stmfd

把数据从寄存器保存到内存

stmfd sp!,{r0-r12,lr}

ldr r0,=0x20000100
mov r1,#0x11
mov r2,#0x22
mov r3,#0x33
mov r4,#0x44
stmfd r0! ,{r1-r4} ;r0向下存储,先减4,在存储
ldmfd r0! ,{r5-r8} ;r0向上读取,先读取,再加4 

实际中什么时候用到连续的存储数据或者读取数据?

在函数发生跳转或标签发生跳转的时候,我们需要保存现场和恢复现场。

CPU当前工作在一种模式下,比如SVC管理模式下,管理模式操作寄存器只有这么多,当发生函数跳转的时候,当前函数肯定有一些变量存到寄存器。跳转到另一个函数也有一些变量要存到寄存器,有可能冲突。所以需要保存现场

保存现场:保存到内存中stmfd

恢复现场:从内存恢复到寄存器ldmfd

保存现场

apcs规定r13(sp):指向内存地址

ldr sp,=0x20000100

mov r1,#0x11

mov r2,#0x22

stmfd sp! ,{r0-r12,r14}  ;已经保存现场可以跳转到其他函数

ldmfd sp!,{r0-r12,r14};恢复现场

;可以跳转到其他函数

;函数不管跳转几次,始终要保证跳转之前和执行完毕,sp保持不变

跳转指令

指令

功能

实例

注释

b

跳转

b lable

跳转lable处执行

bl

跳转并保存返回地址

bl lable

保存下一条指令的地址到lr,并跳转到lable处执行

mov r0.#0x01

mov lr,pc  ;lr专门用于备份pc,保存下一条指令(保存了mov r2,#0x02的地址)

b func1  ;如果没有mov lr,pc和mov pc,lr 函数就不会运行mov r2,#0x02

mov r2,#0x02

func1

mov r1,#0x03

mov pc,lr ;手动修改pc内容,函数返回返回

程序运行到mov lr,pc时,pc指针已经指向了mov r2,#0x02

mov lr,pc

b func1

这两天语句可以写为:bl funcl

注:b,bl都是相对跳转,通过偏移量跳转,最大跳转距离是±32MB,实现长跳转可以通过修改pc实现(绝对跳转)

;mov pc,#0x10  ;0x10代表func1所在地址

ldr pc,=0x10

总结:

1 b bl(相对跳转)短跳转

2 mov ldr修改pc实现长跳转(绝对跳转)

3 b mov ldr都不会保存返回地址,bl会保存返回地址

ARM基础的更多相关文章

  1. ARM基础知识

    ARM处理器模式: 模式可以理解为 工作环境. 异常模式:SVC管理模式. FIQ 快速中断模式 . IRQ中断模式.Abort中止.Undef 未定义模式: 正常模式:System系统模式. Use ...

  2. Ok6410裸机驱动学习(二)ARM基础知识

    1.ARM工作模式 ARM微处理器支持7种工作模式,分别为: l  用户模式(usr):ARM处理器正常的程序执行状态(Linux用户态程序) l  快速中断模式(fiq):用于高速数据传输或通道处理 ...

  3. arm指令bne.w改成b,即无条件跳转

    近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...

  4. 【ARM】arm系列知识框架

    [ARM编程模型] 硬件: 电路原理图 软件: 体系结构, 指令集, 寄存器组 [ARM编程技术] 汇编/C语言 编译, 链接, 烧写和调试 windows: MDK linux  : gcc [AR ...

  5. Rancher与ARM深化战略合作,“软硬结合”加速边缘计算时代

    时至今日,许多企业已将边缘计算列为战略目标,对于部分企业而言,边缘计算则已成为它们势在必行的部分.而随着对应用软件和硬件能力的需求不断增长,容器和Kubernetes已发展为边缘计算领域备受瞩目的一项 ...

  6. 嵌入式Linux学习路线

    最近比较忙,对于嵌入式的相关学习一直没有很好的开展.今天也看了不少的嵌入式Linux的学习路线,也和几个工作过的朋友聊了聊,想把之后的学习过程记录下来. 自己以后想从事驱动开发这方面的工作,因为大多数 ...

  7. 适合初学者的嵌入式Linux计划

    俗话说万事开头难,刚开始的时候,你是否根本就不知如何开始,上网查资料被一堆堆新名词搞的找不到北,去图书馆看书也是找不到方向?又是arm,又是linux,又是uboot头都大了,不知道自己究竟从哪里开始 ...

  8. (翻译)与.NET容器映像保持同步

    原文:https://blogs.msdn.microsoft.com/dotnet/2018/06/18/staying-up-to-date-with-net-container-images/ ...

  9. 1.ARM的基础知识

    ARM简述 ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权.ARM技术具有很高的性能和功效,因而容易被厂商接受.同时,合作伙伴的增多,可获得更多的第三方工具.制造和软件支持,这又会使整个系统 ...

随机推荐

  1. java模拟http请求(代理ip)

    java实现动态切换上网IP (ADSL拨号上网) java动态设置IP java模拟http的Get/Post请求 自动生成IP模拟POST访问后端程序 JAVA 动态替换代理IP并模拟POST

  2. RabbitMQ之路由键转发消息

    RabbitMQ学习 参考:https://www.jianshu.com/p/6b62a0ed2491 消息队列:目前流行的有 Kafka.RabbitMQ.ActiveMQ等 功能:为了解决消息的 ...

  3. MSSQL:查看所有触发器信息的命令

    转自:http://www.2cto.com/database/201307/228708.html 编写程序,有时或为了偷懒,或为更简单地实现所需功能,使用了触发器.这可是把双刃剑,用得不好,程序出 ...

  4. stm32f7699遇到的犯二问题

    没有看到stlink的驱动,难道板子坏了?? 结果:USB线的问题,换了一根用过的线,就行了:

  5. LIBS入门

    样品汽化产生自由原子,原子电子的激发诱导光辐射产生表征原子的分立光谱,采集和分析光辐射. 光源:1064nm Nd:YAG固态激光器,10ns脉冲,焦点光密度1 GW·cm−2 可见和紫外光源.   ...

  6. Gradle依赖无法下载问题

    之前一直在使用maven构建框架,对gradle还比较陌生.最近碰到依赖一直无法下载的问题.我采用了以下步骤进行排查: 1. 查看gradle本地仓库是否有依赖(肯定没有) 2. 查看私服是否有依赖( ...

  7. mysql脚本手动修改成oracle脚本

    今天有一个需求,立了一个新项目,新项目初步定了使用了现有的框架,但数据库要求由原来的mysql改成oracle,所以原来的基础版本的数据库脚本就需要修改成符合oracle的脚本,修改完成后,总结了一下 ...

  8. vivi.c框架

    内核文档: V4L2-framework.txt UVC:usb video controll UVC驱动框架: system call: open read write -------------- ...

  9. SpringBoot2.0整合mybatis、shiro、redis实现基于数据库权限管理系统

    转自https://blog.csdn.net/poorcoder_/article/details/71374002 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管 ...

  10. js 整数型数组和字符型数组相互转换

    需求背景: 需要将 a = [1,2,3,4,5] 转换成  a = ['1','2','3','4','5'](整数型数组转换成字符型没找到直接的方法,思路就是先将数组转换成字符串,然后再将字符串转 ...