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 汇编指令




















