1 导学
1.1 指令集
指令
能够指示处理器执行某种运算的命令称为指令(如加、减、乘 ...)
指令在内存中以机器码(二进制)的方式存在
每一条指令都对应一条汇编
程序是指令的有序集合
指令集
处理器能识别的指令的集合称为指令集
不同架构的处理器指令集不同
指令集是处理器对开发者提供的接口
1.2 汇编的本质
汇编
- 每条汇编都会唯一对应一条机器码,且CPU能直接识别和执行,即汇编中所有的指令都是CPU能够识别和执行的
- 汇编中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都需要自己维护
C语言
- 每条C语句都要被编译器编译成若干条汇编指令才能被CPU识别和执行,即C语句中的指令CPU不一定能直接识别,需要编译器进行“翻译”
- C中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都是编译器来分配和维护
1.3 学习目的
底层开发可能会读/写汇编代码
理解CPU是怎样执行程序的
理解C的本质,用汇编的思想写出高效的C代码
2 KEIL仿真环境搭建
2.1 仿真
硬件仿真 通过硬件接口将CPU和内存中实际的信息读出来
软件仿真 通过软件模拟CPU内部运行程序的状态
2.2 Keil
Keil MDK是用于基于ARM Cortex-M 微控制器的完整软件开发环境。它集成了uVision IDE C/C++编译器、调试器以及其他中间组件,支持众多芯片供应商,易于学习和使用
2.3 环境搭建
2.3.1.安装Keil集成开发环境(keil v4.54)
Keil
安装说明
1.
双击‘
MDK454
’开始安装(
若电脑上已安装了其他版本的
Keil
,最好先卸载,因为后
续可能会有冲突
)
2.
单击“
Next
”
3.
如图勾选对应的选项,然后单击“
Next
”
4.
如图单击“
Browse
”选择安装路径(
不要有中文路径
),然后单击“
Next
”
5.
如图先填写相关信息(随意即可),然后单击“
Next
”开始安装
安装过程可能需要几分钟... ...
6.
单击“
Next
”
7.
单击“
Finish
”完成安装
若弹出该对话框,单击“不安装”即可
8.
安装完成后即可在桌面看到如图图标,右击图标
以管理员身份运行
该程序
9.
打开后单击界面左上角的“
File
”选项,然后单击“
License Management...
”
10.
在弹出的对话框中复制如图所示的
CID
,
该界面先不要关闭
11.
双击打开‘
keygen
’(打开之前最好把电脑声音调小,因为这个软件会发出非常‘悦耳’
的声音)
12.
如图所示,在弹出的界面中选择“
Target
”为“
ARM
”,然后将复制的
CID
粘贴到对应的
位置,单击“
Generate
”生成
License
,然后将生成的
License
拷贝到
Keil
界面中对应的位
置,然后单击“
Add Lic
”,若显示“
***LIC Added Successfully***
”表示破解成功,然后关
闭这两个对话框即可(若不破解代码超过
32K
后将不能编译),至此
Keil
集成开发环境安装
完成
2.3.2 安装gcc交叉编译工具链 (arm-2011.09-70-arm-none-linux-gnueabi)
交叉编译工具链
-Windows
安装说明
1. Keil
中虽然已经集成了编译器,但在实际开发中
ubuntu
环境下使用较多的编译器是
gcc
,
所以这里我们在
Windows
下也安装
gcc
交叉编译器,然后在
Keil
中引用
gcc
进行编译。
右击‘
arm-2011.09-70-arm-none-linux-gnueabi
’然后单击“属性”
2.
在弹出的对话框中按照下图进行设置
3.
设置完成后右击‘
arm-2011.09-70-arm-none-linux-gnueabi
’然后
以管理员身份运行
该程序
4. 单击“
Next
”
5.
勾选“
I accept ...
”,然后单击“
Next
”
6.
单击“
Next
”
7.
这里使用默认的“
Typical
”方式,然后单击“
Next
”
8.
这里
使用默认的安装路径
,单击“
Next
”
9.
单击“
Next
”
10.
单击“
Next
”
11.
单击“
Install
”开始安装(
安装之前先将电脑上的杀毒软件关闭
)
安装过程可能需要几分钟的时间
......
12.
安装完成后单击“
Next
”
13.
单击“
Done
”完成安装
2.3.3 创建汇编工程,熟悉仿真环境的使用
汇编工程创建说明
1.
在任意路径下创建一个文件夹用于后续存放我们的工程(名字任意)
2.
双击打开
Keil
3.
在
Keil
界面下单击“
Project
”然后单击“
New uVision Project...
”创建一个新的工程
4.
在弹出的对话框中选择工程的存储目录(选择步骤
1
创建的文件夹)然后单击“打开”
5. 输入要创建的工程的名字(
不要有中文
),然后单击“保存”将新建的工程保存到该目录
6.
在弹出的对话框中选择我们要使用的处理器,因为我们是软件仿真所以这里选择一个基
于
ARM
的处理器即可;这里我们选择“
Samsung
”下的“
S3C2410
”处理器,选中后右侧
会显示该处理器的相关信息,然后单击“
OK
”
7. Keil
会为我们选择的处理器自动生成一段汇编启动代码,这里我们单击“否”不使用其
生成的启动代码
keil会给很多芯片提供现成代码,我们自己需要写汇编,所以不需要了。
8.
我们新建的工程中还没有任何文件,单击“
New
”图标新建一个文件
9.
如图单击“保存”图标,然后在弹出对话框中输入文件的名字(
不要用中文,汇编代码
使用
.s
后缀
),然后单击保存
10.
我们虽然新建了汇编文件,但是这个文件和我们的工程并没有任何关系,所以我们需要
将我们创建的文件添加到工程中;如图先展开“
Target 1
”,然后右击“
Source Group 1
”,
然后单击“
Add Files to Group ‘Source Group 1’...
”
11.
因为默认只显示
.c
文件,所以在弹出的对话框中先选择文件类型为“
All Files(*.*)
”,然后
选中我们创建的汇编文件,然后单击“
Add
”添加文件到工程,最后单击“
Close
”
12.
回到主界面展开“
Source Group 1
”即可看到我们的文件了,右的编辑区可以编辑文件
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
”完成设置
14.
如图单击“
Target Options...
”图标,在弹出的对话框中单击“
Linker
”,设置“
Text Start
”
即代码的起始地址为“
0x00000000
”,然后单击“
OK
”,这样我们写的代码的起始地址就是
从
0x00000000
开始存储
15.
如图所示,在编辑区可编辑汇编代码(可参考图中进行编辑),编辑完成后单击“保存”,
然后再点击“编译”即可编译汇编代码,在对话框的下方可以看到编译信息(警告和错误),
编译无误后我们可以单击“
Debug
”进行程序的仿真和调试
注
1
:每次修改完代码之后必须先保存再进行编译
注
2
:若编译后有以下警告信息,再次单击编译即可消除
Warning: arm-asm.s: Warning: end of file in comment; newline inserted
16.
如图所示为程序仿真界面,单击“复位”可复位程序,单击“单步运行”可单步调试,
单击“
Debug
”可退出仿真界面,在寄存器信息栏中我们可以看到程序运行过程中寄存器中
的值,在汇编源码栏中我们可以看到程序源码以及当前程序运行的位置,在反汇编栏我们可
以看到汇编代码对应的机器码以及内存地址等信息,在内存信息栏我们可以看到指定内存地
址中的内容,还有很多其他选项这里不再一一赘述
... ...
0x00000000是内存地址 E3A01001是编译后的二进制机器码,展开为2进制的话是32位
2.3.4 总结
keil的编译器与gcc编译器编译的代码不一样,所以还要装一个gcc编译器
gcc x86,是x86Ubuntu下可以运行的
arm gcc, 是arm处理器上可以运行的