热门标签 | 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:压垮一个家庭,一张结算单就够了!必读

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



推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
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社区 版权所有