热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

arm汇编指令集_1.从0开始学ARM安装KeilMDKuVision集成开发环境

关于ARM的一些基本概念,大家可以参考我之前的文章:《0.到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳

关于ARM的一些基本概念,大家可以参考我之前的文章:《0.到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】》

0. 如何学习arm?

ARM的知识点很多很杂,很多同学都遇到过类似的问题,单个的汇编指令一看就懂,但是结合uboot代码后,却一段都看不下去,网上搜资料,一大堆,屡不清楚条理,什么原因呢?

主要是各个知识点之间关系千丝万缕,融汇成一个整体,要想看懂类似于uboot这样的汇编代码,除了了解汇编指令,还要要了解整个SOC的架构,了解各个控制器的使用原理以及各个寄存器的使用方法,代码编译原理等等。如果不按照一定顺序学习,肯定会走很多的弯路。

一口君为了方便众多初学者方便入门,过滤掉一些枯燥的理论知识,一切以实用为主出发,下面会从环境安装开始,一步步教大家如何学习arm,最终能够学会分析uboot代码。

首先我们从安装环境开始吧。

一、KEIL、MDK、uVision、ARM之间的关系

1、KEIL

. 1) 既是公司名称 , 同时也是KEIL公司所有的开发工具。

. 2) 2005年被ARM收购。

2、uVision

. 1) KEIL公司开发的集成开发环境(IDE)。

. 2) 共有4个版本:uVision2、uVision3、uVision4、uVision5。

a85680bbc4f8a957853c78f14f31b29d.png

3、MDK

. 1) 英文全称:Microcontroller Development Kit。

. 2) MDK-ARM = KEIL MDK = RealView MDK = KEIL For ARM,统一用 MDK-ARM 称呼。

c932026485d3162ff63caeacad34c74f.png

MDK-ARM 为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。

MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。

二. 安装

我们采用的安装包是Keil MDK-ARM 4.14版本,包括ARM的编译器和uVision 4集成开发环境。

该环境具有良好的模拟ARM指令环境,非常适合大家学习ARM指令。

软件下载,后台回复【mdk

05d7a175319a4a33d3f93db4fc3983ad.png
mdk

右边点击mdk414.exe -->以管理员身份运行

407e2dc814def5bbbc82180a5832a63d.png
1b88739b611c598db7f90ab8d9df1c28.png

选择安装目录,尽量不要有中文目录:

1f9ef1dc8d0ea002bbe60c4f5071649a.png

输入任意的name、e-mail:

d4b3cc520314c9e6c4332451681e7e01.png
d20db666f0ce0dc05b8c4ffe99bce869.png

74d1085f8aa08e6de87310b6bad6efad.png点击Finish即可:

最终在桌面上会有以下图标:e9693cdd8a8c7ddf1de1e2360cbe7f0d.png

三、创建第一个工程

4481fbcdfea07a222e48e98e5e279b49.png
73145fa3621a07f1661bfea1ff148c6e.png

选择CPU->Samsung->S3C2440A 因为ARM指令集大部分的指令并没有太多差别,所以我们选择S3C2440A。

datasheet 下载,后台回复【exynos】 

5b861d07e8d3806142d19d367c67d06c.png
f12d3a7420db3b721d8844a8e153d3cd.png
在这里插入图片描述

点击是,进入以下界面:

782726410fda24f187fbdc0fa659b1b2.png

代码区域的代码是KEIL提供的基于处理器S3C2440A的一些测试代码,我们暂时先不关心这些代码,直接删除该文件的所有代码,拷贝如下代码【注意缩进】:

 AREA Example,CODE,READONLY    ;声明代码段Example
 ENTRY ;程序入口
Start              ; 程序中的标号,本质上是内存单元(的地址)的别名
 MOV R0,#0     ;设置实参,将传递给子程序的实参存放在r0和r1内
 MOV R1,#10
 BL ADD_SUM    ;调用子程序ADD_SUM 
 B OVER        ;跳转到OVER标号处 进入结尾
ADD_SUM
 ADD R0,R0,R1  ;实现两数相加
 MOV PC,LR     ;子程序返回 R0内为返回的结果
OVER
 END

编译

点击下图的两个按钮都可以实现代码编译:

eb0c8587f5077e168315bc0876108f14.png
build

编译成功后,软件下方会有 **0 Error(s)**字样。

5e85f8f0e345345f1515957686369925.png

四、debug代码

为方便讲解代码,我们后面调试全部进入debug界面,可以点击下面图标或者用快捷键ctrl+F5:

c97a4c8a49842239c8884683f01f0e96.png点击确定即可

9aa071063ae3ca1c0952d0caffc9a651.png进入以下界面:

83bd96a66b06edc1f3f87e0393700a64.png
debug界面

调整界面布局,点击每个标签页面的标题栏拖拽,鼠标放到对应的边框三角形位置即可吸附上去:

f961f85289bb71e9deb9e5e04c3df315.png
在这里插入图片描述

调整界面如下:

35681c6d41777babdd315a38dcdf80e4.png
界面介绍
  1. 程序左侧的黄色箭头,表示程序指令执行的位置;
  2. 左边的R0-R15等等,是ARM在不同模式下的寄存器列表;
  3. 右边是汇编指令对应的内存地址和机器码
  4. 单步执行F10,进入某个函数执行F11

这个代码的含义,我们就暂时先不补详细说明,留待后面详细讲解。相信有汇编基础的同学对这个代码应该比较熟悉。

环境安装完毕,下面我们就可以开始ARM的理论学习了。

下一篇预告《2. 从0开始学ARM-CPU原理,基于ARM的SOC讲解》

其他网友提问汇总

bdfe23a1cf8b7d92911467198fb8de59.gif

 1. 两个线程,两个互斥锁,怎么形成一个死循环?

bdfe23a1cf8b7d92911467198fb8de59.gif

 2. 一个端口号可以同时被两个进程绑定吗?

bdfe23a1cf8b7d92911467198fb8de59.gif

 3. 一个多线程的简单例子让你看清线程调度的随机性

bdfe23a1cf8b7d92911467198fb8de59.gif

 4. 粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数

推荐阅读

【1】到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】 必读【2】Linux面试题100道,看看会多少?【3】Modbus协议概念最详细介绍必读【4】I2C基础知识入门【5】多路复用IO内幕 【6】又一华为程序员进了ICU:压垮一个家庭,一张结算单就够了!必读

 点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看



推荐阅读
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文介绍了如何在Linux和Windows环境中使用C语言中的beep函数来生成不同频率的声音,并提供了详细的代码示例和解释。 ... [详细]
  • 本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 【妙】bug称它为数组越界的妙用
    1、聊一聊首先跟大家推荐一首非常温柔的歌曲,跑步的常听。本文主要把自己对C语言中柔性数组、零数组等等的理解分享给大家,并聊聊如何构建一种统一化的学习思想 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 在 iOS 设备上使用系统 API 进行视图截图时,有时会遇到图片拼接处出现白边的问题。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 单片机入门指南:基础理论与实践
    本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ... [详细]
author-avatar
郝蕾雅老_206
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有