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

news2024/11/17 14:29:12

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.coloradmin.cn/o/1196932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

雷达检测及MATLAB仿真

文章目录 前言一、雷达检测二、Matlab 仿真1、高斯和瑞利概率密度函数①、MATLAB 源码②、仿真 2、归一化门限相对虚警概率的曲线①、MATLAB 源码②、仿真 3、检测概率相对于单个脉冲 SNR 的关系曲线①、MATLAB 源码②、仿真 4、改善因子和积累损失相对于非相干积累脉冲数的关系…

EtherCAT报文-LRW(逻辑寻址读写)抓包分析

0.工具准备 1.EtherCAT主站 2.EtherCAT从站(本文使用步进电机驱动器) 3.Wireshark1.EtherCAT报文帧结构 EtherCAT使用标准的IEEE802.3 Ethernet帧结构,帧类型为0x88A4。EtherCAT数据包括2个字节的数据头和44-1498字节的数据。数据区由一个或多个EtherCAT子报文组成,每个子…

超简单的Linux FTP服务搭建教程

目录 前言1、检查vsftp是否已安装2、安装vsftpd3、启动ftp服务4、测试ftp服务5、上传文件配置总结 前言 本文记录了在Kylin Linux Desktop V10(SP1)系统上搭建FTP服务的过程。FTP是File Transfer Protocol的缩写,译为文件传输协议,是用于在网络上进行文…

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接:https://download.csdn.net/d…

Leetcode-2 两数相加

不知道为什么有些测试用例通不过,思路很明晰,改不明白了,求大佬指点!!!! /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNo…

箱线图(boxplot)

箱线图 boxplot 简述原理绘制方法python - matplotlib加载功能模块加载数据绘制boxplot python - seaborn加载功能模块加载数据绘制boxplot R - ggplot加载功能模块加载数据绘制boxplot 简述 因图形形状如箱子而得名。箱线图常用于展示一组连续型数据的分散情况。学术界普遍认…

Linux AMH 服务器管理面板远程访问

文章目录 1. 前言2. Linux 安装AMH 面板3. 本地访问AMH 面板4. Linux安装Cpolar5. 配置AMH面板公网地址6. 远程访问AMH面板7. 固定AMH面板公网地址8、结语 1. 前言 AMH 是一款基于 Linux 系统的服务器管理面板,它提供了一系列的功能,包括网站管理、FTP …

第十八章 Swing 程序设计

目录 概述 Swing常用窗体 JFrame 窗体 JDialog 对话框 JOptionPane 小型对话框 1.自定义对话框 2.确认框 3.输入框 4.通知框 常用布局管理器 null绝对布局 FlowLayout 流布局管理器 BorderLayout 边界布局管理器 GridLayout 网络布局管理器 常用面板 JPa…

Linux RPM包安装、卸载和升级

我们以安装 apache 程序为例。因为后续章节还会介绍使用源码包的方式安装 apache 程序,读者可以直观地感受到源码包和 RPM 包的区别。 RPM包默认安装路径 通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到表 1 所…

Doris:多源数据目录(Multi-Catalog)

目录 1.基本概念 2.基本操作 2.1 查看 Catalog 2.2 新增 Catalog 2.3 切换 Catalog 2.4 删除 Catalog 3.元数据更新 3.1手动刷新 3.2定时刷新 3.3自动刷新 4.JDBC Catalog 4.1 上传mysql驱动包 4.2 创建mysql catalog 4.3. 读取mysql数据 1.基本概念 …

抖音小程序开发:探索技术创新的代码之旅

随着抖音小程序的兴起,企业纷纷将目光投向这个充满活力的平台。抖音小程序开发不仅为品牌提供了更广泛的曝光机会,更是技术创新的舞台。本文将带领读者深入探索抖音小程序开发的技术要点,探讨如何通过代码实现个性化、高效的小程序。 1. 小…

JavaScript从入门到精通系列第三十三篇:详解正则表达式语法(二)

文章目录 一:正则表达式 1: 检查一个字符串中是否有. 2:第二种关键表达 3:第三种关键表达 ​编辑4:第四种关键表达 5:第五种关键表达 6:第六种关键表达 二:核心表达二 1&am…

拓扑排序软件设计——ToplogicalSort_app(含有源码、需求分析、可行性分析、概要设计、用户使用手册)

拓扑排序软件设计 前言1. 需求分析2. 可行性分析2.1 简介2.2 技术可行性分析2.2.1 技术实现方案2.2.2 开发人员技能要求2.2.3 可行性 2.3 操作可行性分析2.4 结论 3. 项目报告3.1 修订历史记录3.2 软硬件环境3.3 需求分析3.4 详细设计3.4.1 类设计3.4.2 核心流程描述3.4.3 核心…

水果音乐编曲软件 FL Studio v21.1.1.3750 中文免费破解版下载(附中文设置教程)

FL studio21中文别名水果编曲软件,是一款全能的音乐制作软件,包括编曲、录音、剪辑和混音等诸多功能,让你的电脑编程一个全能的录音室,它为您提供了一个集成的开发环境,使用起来非常简单有效,您的工作会变得…

内网安全-基础设施构建-cobaltstrike远控工具beacon使用

kali在CS文件目录下,打开终端,运行命令: /teamserver 192.168.77.128 123456 在windows中双击bat文件: 填写图下信息: 双击运行,CS上线 自查方法:1、kali与物理机可互通 2、物理机与windows10跳板…

黑客技术-小白学习手册

一、黑客是什么 原是指热心于计算机技术,水平高超的电脑专家,尤其是程序设计人员。但后来,黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实,网络信息空间安全已经成为海陆空之…

告别龟速,从GitHub快速下载项目的技巧分享,简单又高效!

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…

【mysql】将逗号分割的字段内容转换为多行并group by

先说需求: 公司想让我通过mysql导出一个报表,内容为公司每个人参加会议的次数,现在有一个会议表fusion_meeting,正常的逻辑是通过人员直接group by就可以得出结果,但是我们的参会人是通过逗号分割这种方式存在一个字段…

Linux的命令——关于操作用户及用户组的命令

目录 1.Linux的命令格式 2.用户与用户组管理 2.1用户管理 添加用户 设置用户密码 删除用户 修改用户 2.2用户组管理 新增用户组 删除用户组 修改用户组属性 用户组切换 用户组管理 用户切换 1. su 2.sudo 1.Linux的命令格式 Linux系统中几乎所有操作&#xff0…

【Unity细节】Unity中如何让组件失活而不是物体失活

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…