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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/132721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

翻转二叉树(C++解法)

题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 给你一棵二叉树的根节点 root ,翻转这棵二叉树&…

Harbor了解及部署

Harbor 无论是使用Docker-distribution去自建仓库,还是通过官方镜像跑容器的方式去自建仓库,通过前面的演示我们可以发现其是非常的简陋的,还不如直接使用官方的Docker Hub去管理镜像来得方便,至少官方的Docker Hub能够通过web界…

openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库

文章目录 openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库120.1 密态等值查询概述120.2 使用gsql操作密态数据库 openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库 120.1 密态等值查询…

drawio连接线使用技巧和功能大全

drawio连接线使用技巧和功能大全 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能,并实现了…

深入理解对象存储(OSD)

对象存储 1、对象存储的起源2、什么是对象存储3、对象存储与块存储、文件存储4、对象存储架构4.1、对象(Object)4.2、对象存储设备(OSD)4.3、元数据服务器(MDS)4.4、对象存储系统的客户端(Clien…

11. EPIC定时器

11. EPIC定时器 EPIT定时器简介EPIT定时器结构分析EPIT 定时器相关寄存器EPITx_CREPITx_SREPITx_LR 加载寄存器EPITx_CMPR 比较寄存器EPITx_CNR 计数寄存器 EPIT 配置步骤 例程代码编写bsp_epittimer.hbsp_epittimer.cmain.c EPIT定时器简介 EPIT定时器是增强的周期中断定时器…

人工智能基础_机器学习024_梯度下降进阶_L1正则可视化图形---人工智能工作笔记0064

然后我们就来用代码实现一下L1正则的可视化,我们来看看 首先导入 import numpy as np 数学计算 import matplotlib.pyplot as plt 画图用的 然后我们把L1正则的公式写出来 可以看到L1的正则 其实就是w1和w2的绝对值相加对吧 然后这里我们写一个公式: f(x,y) = |x|+|y| …

NL2SQL学习

在学习NL2SQL之前先要进行三W提问: 即what 是什么 ; why 为什么使用; how 如何使用 NL2SQL是什么? NL2SQL(NLP Natural Language To SQL)是自然语言处理的新兴研究热点,顾名思义&#xff0…

15 # 手写 throttle 节流方法

什么是节流 节流是限制事件触发的频率,当持续触发事件时,在一定时间内只执行一次事件,这个效果跟英雄联盟里的闪现技能释放差不多。 函数防抖关注一定时间连续触发的事件只在最后执行一次,而函数节流侧重于一段时间内只执行一次…

【基础算法模板梳理】再也不想学算法了!(待更新)

目录 1、【二分】 (1)rmid —— 大于等于某数的最小值 (2)lmid —— 小于等于某数的最大值 2、【前缀和】 (1)一维前缀和 (2)二维前缀和 3、【差分】 (1&#x…

Mac代码文本编辑器Sublime Text 4

Sublime Text 4 for Mac拥有快速响应的功能,可以快速加载文件和执行命令,并提供多种语言支持,包括C 、Java、Python、HTML、CSS等。此外,该编辑器还支持LaTeX、Markdown、JSON、XML等技术领域。 Sublime Text 4 for Mac的插件丰富…

Ubuntu18.04.6共享文件夹的创建,以及在哪打开共享文件夹

目录 1、打开虚拟机的设置页面 2、设置共享文件夹 3、确认是否成功设置共享文件夹 4、完成后在进入到/mnt/hgfs ls查看,发现共享文件夹已经出现可以使用 1、打开虚拟机的设置页面 两种方式: (1)直接点击“编辑虚拟机设置” …

YOLO目标检测——海洋目标检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:海洋监管、海洋资源开发、海洋科学研究数据集说明:海洋目标检测数据集,真实场景的高质量图片数据,数据场景丰富,含有“金属”、“未知”、“橡胶”、“平台”、“塑料”、“木材”、“布”、“纸张”、“…

SAP S4后的一些注意点(一)(更新中)

SAP 此外,我们必须确保 P10 中所有新的 Unicore 代码都是云就绪的。因此,在 ATC 中增加了一项新的检查(自定义),以证明代码的云就绪性。此外,我们还在 ADT 中安装了一个名为 ABAP Cleaner 的新插件&#xf…

初探SVG

SVG,可缩放矢量图形(Scalable Vector Graphics)。使用XML格式定义图像。SVG有以下优点:1)可被非常多的工具读取和修改;2)比JPEG和GIF尺寸更小,可压缩性更强;3&#xff09…

多门店民宿预定系统酒店预订管理系统源码/公寓/农家乐小程序源码

技术栈: thinkphpuniappmysql 支持H5APP小程序 主要功能介绍: 在线预订 支持在线支付或到店付,支持配置免费取消订单时长,支持到店付保留时长设置 房间搜索 支持按日期搜索房间状态,支持按日期区间搜索房间状态…

置换环算法

参考该博客大佬的讲解 置换环 - TTS-S - 博客园 (cnblogs.com) 置换环:一般用于解决数组排序元素间所需最小交换次数这类问题。 置换环思想:置换环是将每个元素指向其应在的位置,最终相连成一个环(若元素就在其应在的位置,则自身…

乡村振兴 品牌引领 “盘锦碱地柿子”亮相第二十届中国国际农产品交易会

2023年11月9日,为期4天的第二十届中国国际农产品交易会在山东青岛成功举办。本次大会以“奋进新征程强农促振兴”为主题。农交会是经党中央、国务院批准,农业农村部主办的大型农业行业盛会,在宣传“三农”政策、展示农业农村发展成就、活跃农…

OSG练习:模仿Ventsim制作三维矿井智能通风系统

1、效果 2、计划内容 1) 三维场景的加载显示;已实现 2)矿井巷道建模及纹理;已实现 3)矿井基础数据采集及修正;已实现 4)通风网络解算算法;已实现 5)通风设备及设施模型制作;未实现 6)风流模拟效果 ;进行中 7)火灾模拟效果;未实现 8)巷道属性查看栏;未实现 9)…

【Linux网络】系统调优之时间同步,搭建内网时间同步服务器

目录 一、时间同步是什么 二、时间同步实验 pc1的chrony配置修改: pc2和pc3时间同步配置一样 关于时间调整再同步回来:ntpdate命令 最后,再总结一下(关于服务端口): 三、命令记录 一、时间同步是什…