lv11 嵌入式开发 ARM指令集上 5

news/2024/12/31 6:32:59/

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


http://www.ppmy.cn/news/1211992.html

相关文章

Maven Profile组设置

application.properties中xxxx

一步一步详细介绍如何使用 OpenCV 制作低成本立体相机

在这篇文章中,我们将学习如何创建定制的低成本立体相机(使用一对网络摄像头)并使用 OpenCV 捕获 3D 视频。我们提供 Python 和 C++ 代码。文末并附完整的免费代码下载链接 我们都喜欢观看上面所示的 3D 电影和视频。您需要如图 1 所示的红青色 3D 眼镜才能体验 3D 效果。它是…

计算机视觉:使用opencv进行直线检测

1 直线检测介绍 在图像处理中,直线检测是一种常见的算法,它通常获取n个边缘点的集合,并找到通过这些边缘点的直线。其中用于直线检测,最为流行的检测器是基于霍夫变换的直线检测技术。 1.1 什么是霍夫变换 霍夫变换&#xff08…

钉钉统计部门个人请假次数go

前言 最近小组需要统计部门各种请假次数,写了一个方法,第一次实战中用到递归函数,简单记录一下。 效果展示 这些数据不需要返回json,这里这样是为了方便测试。可以通过这些数据完成其它的操作。 功能实现 钉钉服务端调试工具A…

【Docker】Web应用通过jar打包成WAR文件

把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c 创建war包 -v 显示过程信息 -f -M -0 这个是阿拉伯数字,只打包不压缩的意思 解压game.war jar -xvf game.war 解压到当前目录 环境 RedHat Linux 9 VWWare 8.0 SSH 3.2.9 Putty 0.62 问题…

实战Leetcode(三)

Practice makes perfect! 实战一: 带环问题其实我们小学时就接触过,就比如在操场上比赛跑步的追击问题,这里也是一样,如果我们定义两个指针,一个快指针,一个慢指针,快指针走的快&…

Mysql数据库 14.SQL语言 视图

一、视图的概念 视图:就是由数据库中一张或多张表根据特定的条件查询出的数据狗造成的虚拟表 二、视图的作用 安全性,简单性 三、视图的语法 语法 create view 视图表 as select_statement; 代码实现 #创建视图 将查询结果创建称为视图&#x…

短视频矩阵系统源码--剪辑/矩阵/分发/直播

短视频矩阵系统源码--剪辑/矩阵/分发/直播 短视频矩阵系统开发,首先对服务器要求: 源码所需服务器配置 1、规格:最低8核16G 2、硬盘:系统盘40-100G,数据盘不低于100G 3、带宽:10M 4、系统:…