DAY5. ARM指令集仿真环境搭建
如果出现图片无法查看可能是网络问题,我用的GitHub+图床保存的图片,可以参考我另外一篇文章GitHub的使用方法含网络问题解决
GitHub使用教程含网络问题_github加速器_肉丸子QAQ的博客-CSDN博客
相关软件资料已上传自行下载,也可三连私信我领取
ARM指令集仿真环境搭建资料含教程说明-Linux文档类资源-CSDN文库
1. ARM指令集导学
1.1 汇编的本质
- 汇编
每条汇编都会唯一对应一条机器码,且CPU能直接识别和执行,
即汇编中所有的指令都是CPU能够识别和执行的,
汇编中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都需要自己维护
- C语言
每条C语句都要被编译器编译成若干条汇编指令才能被CPU识别和执行
即C语句中的指令CPU不一定能直接识别,需要编译器进行“翻译”
C中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都是编译器来分配和维护
1.2 学习目的
-
底层开发可能会读/写汇编代码
-
理解CPU是怎样执行程序的
-
理解C的本质,用汇编的思想写出高效的C代码
2. Keil仿真环境搭建
2.1 仿真
-
硬件仿真
通过硬件接口将CPU和内存中实际的信息读出来
-
软件仿真
通过软件模拟CPU内部运行程序的状态
2.2环境搭建步骤
-
Keil
Keil MDK是用于基于ARM Cortex-M 微控制器的完整软件开发环境。它集成了uVision IDEC/C++编译器、调试器以及其他中间组件,支持众多芯片供应商,易于学习和使用
安装步骤
1. keil安装
- 双击‘MDK454’开始安装(若电脑上已安装了其他版本的 Keil,最好先卸载,因为后 续可能会有冲突)
我的电脑安装了keil5做stm32开发,这里建议:如果你也正在使用keil5,建议暂时删掉后再用我分享的软件开发,如果不想删除原来的的话,我建议将软件和keil5安装在不同盘里面然后一切按照默认就行(非常不建议)
- 单击“Next”
- 如图勾选对应的选项,然后单击“Next”
- 如图单击“Browse”选择安装路径(不要有中文路径),然后单击“Next”
- 如图先填写相关信息(随意即可,全填空格),然后单击“Next”开始安装,等待安装结束
- 单击“Next”
- 单击“Finish”完成安装
若弹出该对话框,单击“不安装”即可
- 安装完成后即可在桌面看到如图图标,右击图标以管理员身份运行该程序
- 打开后单击界面左上角的“File”选项,然后单击“License Management…”
- 在弹出的对话框中复制如图所示的 CID,该界面先不要关
- 双击打开‘keygen’(打开之前最好把电脑声音调小,因为这个软件会发出非常‘悦耳’ 的声音)
- 如图所示,在弹出的界面中选择“Target”为“ARM”,然后将复制的 CID 粘贴到对应的 位置,单击“Generate”生成 License,然后将生成的 License 拷贝到 Keil 界面中对应的位 置,然后单击“Add Lic”,若显示“LIC Added Successfully”表示破解成功,然后关 闭这两个对话框即可(若不破解代码超过 32K 后将不能编译),至此 Keil 集成开发环境安装 完成
2. 交叉编译工具链安装-Windows
这里还需要再安装交叉编译工具不使用keil自带的编译器
- Keil 中虽然已经集成了编译器,但在实际开发中 ubuntu 环境下使用较多的编译器是 gcc, 所以这里我们在 Windows 下也安装 gcc 交叉编译器,然后在 Keil 中引用 gcc 进行编译。 右击‘
arm-2011.09-70-arm-none-linux-gnueabi’
然后单击“属性”
- 在弹出的对话框中按照下图进行设置
- 设置完成后右击‘
arm-2011.09-70-arm-none-linux-gnueabi
’然后以管理员身份运行该 程序
- 单击“Next”
- 勾选“I accept …”,然后单击“Next”
- 单击“Next”
- 这里使用默认的“Typical”方式,然后单击“Next”
- 这里使用默认的安装路径,单击“Next”!!!!!!!!!!!方便后续设置
- 单击“Next”
- 单击“Next”
- 单击“Install”开始安装(安装之前先将电脑上的杀毒软件关闭)
- 安装完成后单击“Next”
- 单击“Done”完成安装
3. 汇编工程创建说明
- 在任意路径下创建一个文件夹用于后续存放我们的工程(名字任意)
- 双击打开 Keil
- 在 Keil 界面下单击“Project”然后单击“New uVision Project…”创建一个新的工程
- 在弹出的对话框中选择工程的存储目录(选择步骤 1 创建的文件夹)然后单击“打开”
- 输入要创建的工程的名字(不要有中文),然后单击“保存”将新建的工程保存到该目录
- 在弹出的对话框中选择我们要使用的处理器,因为我们是软件仿真所以这里选择一个基 于 ARM 的处理器即可;这里我们选择“Samsung”下的“S3C2410”处理器,选中后右侧 会显示该处理器的相关信息,然后单击“OK”
这里如果你不用我这个版本,就可能会出现没有这个选项,我用的keil5实测没有找到
- Keil 会为我们选择的处理器自动生成一段汇编启动代码,这里我们单击“否”不使用其 生成的启动代码
- 我们新建的工程中还没有任何文件,单击“New”图标新建一个文件
- 如图单击“保存”图标,然后在弹出对话框中输入文件的名字(不要用中文,汇编代码 使用.s 后缀),然后单击保存
- 我们虽然新建了汇编文件,但是这个文件和我们的工程并没有任何关系,所以我们需要 将我们创建的文件添加到工程中;如图先展开“Target 1”,然后右击“Source Group 1”, 然后单击“Add Files to Group ‘Source Group 1’…”
- 因为默认只显示.c 文件,所以在弹出的对话框中先选择文件类型为“All Files(.)”,然后 选中我们创建的汇编文件,然后单击“Add”添加文件到工程,最后单击“Close”
- 回到主界面展开“Source Group 1”即可看到我们的文件了,右的编辑区可以编辑文件
-
因为我们要使用自己安装的 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”完成设置 -
如图单击“Target Options…”图标,在弹出的对话框中单击“Linker”,设置“Text Start” 即代码的起始地址为“
0x00000000
”,然后单击“OK”,这样我们写的代码的起始地址就是 从 0x00000000 开始存储
- 如图所示,在编辑区可编辑汇编代码(可参考图中进行编辑),编辑完成后单击“保存”, 然后再点击“编译”即可编译汇编代码,在对话框的下方可以看到编译信息(警告和错误), 编译无误后我们可以单击“Debug”进行程序的仿真和调试
.text @表示当前段为代码段
.global _start @声明_start为全局符号
_start: @汇编程序的入口
MOV R1,#1 @汇编程序
stop: @死循环,防止程序跑飞
B stop
.end @汇编程序的结束
注 1:每次修改完代码之后必须先保存再进行编译
注 2:若编译后有以下警告信息,再次单击编译即可消除 Warning: arm-asm.s: Warning: end of file in comment; newline inserted
- 如图所示为程序仿真界面,单击“复位”可复位程序,单击“单步运行”可单步调试, 单击“Debug”可退出仿真界面,在寄存器信息栏中我们可以看到程序运行过程中寄存器中 的值,在汇编源码栏中我们可以看到程序源码以及当前程序运行的位置,在反汇编栏我们可 以看到汇编代码对应的机器码以及内存地址等信息,在内存信息栏我们可以看到指定内存地 址中的内容,还有很多其他选项这里不再一一赘述… …
3. ARM指令概述
C语言
1. 语句
a++;
2. 注释:不参与编译
//
3. 预编译指令:带#号不参与编译但是会告诉编译器怎么编译
#if 0
...
#else
...
#endif
汇编
@1. 汇编的符号
@ 1.指令:能够编译生成一条32bit机器码,并且能够被cpu识别和执行
@ 2.伪指令:(3x3---》3+3+3):cpu不能直接认识,但是能通过编译器翻译成若干条指令,!!伪指令不是指令!!
@ 3.伪操作:不会生成指令只是在编译的
ARM
@1. 数据处理指令: 进行数学运算,逻辑运算
@2. 跳转指令: 实现程序的跳转,本质就是修改PC寄存器
@3. Load/Srore指令:访问(读写)内存
@4. 状态寄存器传送指令:用于访问(读取)CPSR寄存器
@5. 软中断指令:触发软中断
@6. 协处理器指令: 操控协处理器的指令
4. 作业
1.简述C语言和汇编语言的本质区别是什么
- 汇编
每条汇编都会唯一对应一条机器码,且CPU能直接识别和执行,
即汇编中所有的指令都是CPU能够识别和执行的,
汇编中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都需要自己维护
- C语言
每条C语句都要被编译器编译成若干条汇编指令才能被CPU识别和执行
即C语句中的指令CPU不一定能直接识别,需要编译器进行“翻译”
C中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都是编译器来分配和维护