标签:
一.汇编概述
1.使用汇编的原因(1)启动代码:在bootloader和内核的初始化部分要用到汇编,因为此时还没有简历c语言的运行环境。
(2)对效率有特殊要求的代码:汇编代码效率高。
2.分类
(1)arm标准汇编:适用于ARM公司的汇编器,适合在windows环境下和ADS一起使用。
(2)GNU汇编:适用于GNU的交叉编译器,适用于Linux环境下。现在大多使用GNU汇编。
3.汇编程序框架
(1)入口: _start: 《汇编代码》
(2)在入口前面当然前面要有.global _start标明是全局的入口
(3)在全局声明的前面,应该有.section.text标明后面存放的是代码段
(4)在最开始可以有
.section.data
《初始化的数据》
以及
.section.bss
《为初始化的数据》
图片:1.png
4.准备工作(1)安装JLinkGDNserver
(2)硬件连接(3)编写汇编源代码以及Makefile
(4)启动eclipse,创建新工程(5)和前面章节类似,配置debug环境,进行调试,一般在线调试都是针对elf文件
0.GNU汇编小写为主
1.算术逻辑指令(1)
图片:2.png
(2)
图片:3.png
(3)
图片:4.png
(4)
图片:5.png
(5)
(6)
图片:7.png
ARM标准汇编的%代表二进制,但是GNU汇编必须用0b表示二进制
2.比较类指令
(1)
图片:8.png
(2)
图片:9.png
3.跳转指令/分支指令
(1)
图片:10.png
(2)
(3)上述指令可用的条件如下
图片:12.png
图片:13.png
(4)b跳转的时候不会保存返回地址到链接寄存器,这是与Bl的区别
4.移位类指令
(1)LSL
图片:14.png
(2)ROR
图片:15.png
5.程序状态字访问指令
不可直接操作程序状态字寄存器
(1)msr
从通用寄存器到状态字寄存器
(2)mrs
从状态字指令到通用寄存器
6.以上都是针对ARM核寄存器的指令
(1)ldr
从内存到内部寄存器
(2)str
从内部寄存器到内存
图片:16.png
[attachment=1829]
图片:17.png
(3)LDM
图片:18.png
图片:19.png
协处理器指令
1.协处理器:用于执行特定的任务,减轻处理器核的负担。一共可以支持16个协处理器,cp15最重要。
2.CP15:系统控制协处理器,提供了很多寄存器,有利于控制cache,MMU,时钟系统等。
访问他主要是访问她的寄存器,从而达到对系统的控制
3.cp15里的有的寄存器会标明处理器的型号以及ID
4.mcr:从通用寄存器到协处理器
5.mrc:从协处理器到通用寄存器
6.redhat通过注销用户点击下方空白栏可以更改语言环境
图片:20.png
图片:21.png
伪指令
1.机器码由汇编程序经过汇编器生成,有一定的格式,不同的指令有不同的格式,以数据传送类指令
图片:22.png
后面的低12位表示的数据范围有限,所以要用伪指令来处理这种困局。
2.定义类伪指令:主要在编译的时候起作用
看起来像指令的作用一样,但是只是像而已。它本身不产生机器码,而是在编译的时候起作用,告诉编译器如何编译,另一种作用就是转换为其他的实际的指令。
GNU风格一般会在前面加上一个点
(1)global:把一个符号定义为全局的。通常标号类似于c语言的子函数
(2)data:用来定义数据段。存放已初始化的数据。
(3)ascii:字符串类型的数据
(4)byte:字节型数据
(5)word:子数据
(6)equ:类似于C语言的宏定义 .equ DA,0x89
(7)align:控制对齐。加在需要被对齐(被调整)的标号(地址/指令)之前
3.操作类伪指令
(1)ldr:和存储器访问指令ldr同名。前面不需要加一点。
但是一般的指令能访问的立即数不能超过二进制的8位,因为机器码的低12位有四位是用来存放移位情况的,所以只有8位可以用来存放真实的操作数。
此时的立即数用=来标示使用的是ldr伪指令而不是存储器访问指令ldr。
ARM的pc指针指向当前指令的后面的8个偏移量
(2)nop:空操作,延时。为了满足时序要求。
4.常用反汇编来查看指令的实际动态,进场对比机器码
标签:
原文地址:http://www.cnblogs.com/YanfeiHao/p/4429068.html