码迷,mamicode.com
首页 > 编程语言 > 详细

专题3-汇编语言玩得转

时间:2015-04-15 18:28:16      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

一.汇编概述
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.常用反汇编来查看指令的实际动态,进场对比机器码

专题3-汇编语言玩得转

标签:

原文地址:http://www.cnblogs.com/YanfeiHao/p/4429068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!