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处理器上可以运行的
3 汇编指令