目录
一、ARM指令集仿真环境搭建
1.1指令和指令集
指令
能够指示处理器执行某种运算的命令称为指令(如加、减、乘 ...)
指令在内存中以机器码(二进制)的方式存在
每一条指令都对应一条汇编
程序是指令的有序集合
指令集
处理器能识别的指令的集合称为指令集
不同架构的处理器指令集不同
指令集是处理器对开发者提供的接口
1.2汇编的本质
汇编
> 每条汇编都会唯一对应一条机器码,且CPU能直接识别和执行
即汇编中所有的指令都是CPU能够识别和执行的
> 汇编中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等
都需要自己维护
C语言
> 每条C语句都要被编译器编译成若干条汇编指令才能被CPU识别和执行
即C语句中的指令CPU不一定能直接识别,需要编译器进行“翻译”
> C中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等
都是编译器来分配和维护
1.3为什么学习汇编
1.底层开发可能会读/写汇编代码
2.理解CPU是怎样执行程序的
3.理解C的本质,用汇编的思想写出高效的C代码
1.4仿真
硬件仿真
通过硬件接口将CPU和内存中实际的信息读出来
软件仿真
通过软件模拟CPU内部运行程序的状态
1.5Keil
Keil MDK是用于基于ARM Cortex-M 微控制器的完整软件开发环境。它集成了uVision IDE
C/C++编译器、调试器以及其他中间组件,支持众多芯片供应商,易于学习和使用.
1.6环境搭建
1.安装Keil集成开发环境
2.安装gcc交叉编译工具链
3.创建汇编工程,熟悉仿真环境的使用
keil4:
链接:https://pan.baidu.com/s/14601doeTSLFJCS_fH6gDQQ?pwd=ynu7
提取码:ynu7
提取码:ynu7
ARM-gcc_windows:
链接:https://pan.baidu.com/s/1JRPbCr46HBz9Y81vkODpvw?pwd=vrh2
提取码:vrh2
提取码:vrh2
本来打算用mdk5试试的时间太赶了,还是用keil4吧,有感兴趣的朋友可以评论分享一下。
安装方式和安装包在上面都一起分享了。还有新建第一个汇编项目的过程。
1.7汇编工程创建
1. 在任意路径下创建一个文件夹用于后续存放我们的工程(名字任意)
2. 双击打开 Keil
3. 在 Keil 界面下单击“Project”然后单击“New uVision Project...”创建一个新的工程
![](https://i-blog.csdnimg.cn/blog_migrate/70894085adc4a701a68a4a4962963ad9.png)
4. 在弹出的对话框中选择工程的存储目录(选择步骤 1 创建的文件夹)然后单击“打开”
![](https://i-blog.csdnimg.cn/blog_migrate/b77e0ed5c2137c95d6a236e8b5f804a8.png)
5. 输入要创建的工程的名字(
不要有中文),然后单击“保存”将新建的工程保存到该目录
![](https://i-blog.csdnimg.cn/blog_migrate/d5137bf42e843814969ec6fe72f0616c.png)
6. 在弹出的对话框中选择我们要使用的处理器,因为我们是软件仿真所以这里选择一个基 于 ARM 的处理器即可;这里我们选择“Samsung”下的“S3C2410”处理器,选中后右侧 会显示该处理器的相关信息,然后单击“OK”
![](https://i-blog.csdnimg.cn/blog_migrate/64b72af64d90ae19aeaad1c93b9d2abf.png)
7. Keil 会为我们选择的处理器自动生成一段汇编启动代码,这里我们单击“否”不使用其 生成的启动代码
![](https://i-blog.csdnimg.cn/blog_migrate/06227257c81ecc3009016f21ef41d6c9.png)
8. 我们新建的工程中还没有任何文件,单击“New”图标新建一个文件
![](https://i-blog.csdnimg.cn/blog_migrate/ccbc29979a70d489ec0aa56e8c487605.png)
9. 如图单击“保存”图标,然后在弹出对话框中输入文件的名字(
不要用中文,汇编代码 使用.s 后缀),然后单击保存
![](https://i-blog.csdnimg.cn/blog_migrate/64994d9332fa92330b8c6de7ae3faefd.png)
10. 我们虽然新建了汇编文件,但是这个文件和我们的工程并没有任何关系,所以我们需要 将我们创建的文件添加到工程中;如图先展开“Target 1”,然后右击“Source Group 1”, 然后单击“Add Files to Group ‘Source Group 1’...”
![](https://i-blog.csdnimg.cn/blog_migrate/33da05b6674c1d882ea12159aeaf5989.png)
11. 因为默认只显示.c 文件,所以在弹出的对话框中先选择文件类型为“All Files(*.*)”,然后 选中我们创建的汇编文件,然后单击“Add”添加文件到工程,最后单击“Close”
![](https://i-blog.csdnimg.cn/blog_migrate/eabbf1a6cb007d0ef8e0c2eb05bc4bc5.png)
12. 回到主界面展开“Source Group 1”即可看到我们的文件了,右的编辑区可以编辑文件
![](https://i-blog.csdnimg.cn/blog_migrate/32eb3e07c99795156c31a9f4d286c4b8.png)
13. 因为我们要使用自己安装的 gcc 编译器,所以这里需要指定下编译器的信息,如图单击 对应的图标,在弹出的对话框中选择“Folders/Extensions”,然后勾选“Use GNU Compiler” 使用 GNU 的编译器(弹出对话框选‘是’即可),然后在“GNU-Tool-Prefix”位置输入编 译器前缀“
arm-none-linux-gnueabi-”,然后在“GNU-Tool Folder”位置选择编译器路径 “
C:\Program Files (x86)\CodeSourcery\Sourcery_CodeBench_Lite_for_ARM_GNU_Linux” 最后单击“OK”完成设置
![](https://i-blog.csdnimg.cn/blog_migrate/a3e122a030b52a2e9a609ae9c5805321.png)
14. 如图单击“Target Options...”图标,在弹出的对话框中单击“Linker”,设置“Text Start” 即代码的起始地址为“0x00000000”,然后单击“OK”,这样我们写的代码的起始地址就是 从 0x00000000 开始存储
![](https://i-blog.csdnimg.cn/blog_migrate/58aa07df110ed26061285fa4dc6e9256.png)
15. 如图所示,在编辑区可编辑汇编代码(可参考图中进行编辑),编辑完成后单击“保存”, 然后再点击“编译”即可编译汇编代码,在对话框的下方可以看到编译信息(警告和错误), 编译无误后我们可以单击“Debug”进行程序的仿真和调试
![](https://i-blog.csdnimg.cn/blog_migrate/e963a122e2ece512b1573ec8fd55e8fc.png)
注 1:每次修改完代码之后必须先保存再进行编译
注 2:若编译后有以下警告信息,再次单击编译即可消除
Warning: arm-asm.s: Warning: end of file in comment; newline inserted
16. 如图所示为程序仿真界面,单击“复位”可复位程序,单击“单步运行”可单步调试, 单击“Debug”可退出仿真界面,在寄存器信息栏中我们可以看到程序运行过程中寄存器中 的值,在汇编源码栏中我们可以看到程序源码以及当前程序运行的位置,在反汇编栏我们可 以看到汇编代码对应的机器码以及内存地址等信息,在内存信息栏我们可以看到指定内存地 址中的内容,还有很多其他选项这里不再一一赘述... ..
![](https://i-blog.csdnimg.cn/blog_migrate/ec311a26aef62e8cd5b3b12dd9f0944c.png)
二、汇编
2.1汇编中的符号
2.2ARM指令集
2.3简单的ARM程序
.text @表示当前为代码段
.global _start @将_start定义为全局符号
_start: @汇编入口
MOV R1,#1 @汇编指令
MOV R2,#2
MOV R3,#3
stop: @死循环防止程序跑飞
B stop
.end @汇编的结束