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

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

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

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

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

相关文章

32位存储环境下整数范围为什么是[-2^31,2^31-1]?

一、概念:存储单位 1.“位”是数据存储的最小单位。在计算机中的二进制数系统中,位,简记为bit,也称为比特,每个0或1就是一个位。 2.“字节”是计算机信息技术用于计量存储容量的一种计量单位,通常情况下,…

mysql5.7配置用户名密码_MySQL57安装图解

原文:MySQL57安装图解_ma524654165的博客-CSDN博客作者: ma524654165MySQL57安装图解、、、0-需要准备的安装包1在百度下载MySQl开始安装下载的MySQL勾选同意点击Next4选择Server only5点击execute继续6点击next7直接next8配置服务器的端口-默认9设置一个…

vc6.0添加注释快捷键

第一步:工具 第二步:点击定制(Customize)-键盘-All commands-选择CommentOut,在新建快捷键处填写Ctrl/。

python 释放内存_学了4年C++后,我转向了Python

作者 | asya f 编译 | Lisa C 已经学不动了,现在换 Python 还来得及吗?一位四年工作经验的 C 程序员亲述转型历程,这不仅仅是语言上的转变,而是代码思维甚至工作环境的转变。 通常,程序员会认为 Python 编码比较简单&a…

2021-03-07

一、安装和使用Anaconda 1、anaconda是什么? Anaconda在英文中是“巨蟒”的意思,与python的意思相近,它是python的包管理器和环境管理器。 2、为什么需要安装anaconda? 原因有以下几点: 附带一大批常用的数据科学…

python如何实现模拟登录_超详细的Python实现新浪微博模拟登陆(小白都能懂)

最近由于需要一直在研究微博的爬虫,第一步便是模拟登陆,从开始摸索到走通模拟登陆这条路其实还是挺艰难的,需要一定的经验,为了让朋友们以后少走点弯路,这里我把我的分析过程和代码都附上来。 首先,我们先用…

python解二元一次方程组

# a,b,cinput("a b c").split() # afloat(a) # bfloat(b) # cfloat(c)afloat(input("请输入a:")) bfloat(input("请输入b:")) cfloat(input("请输入c:")) dertb**2-4*a*c if dert > 0:x1(-bdert*…

wacom mac驱动_MAC系统装Wacom手绘板的方法及注意事项

⚠️注意事项⚠️:一般Wacom官网的驱动会比苹果最新系统更新慢很多,所以如果你是最新系统,那官网的驱动你目前肯定用不了!要找客服去单独要。电话:4008105460 如果你刚好是老系统,那么恭喜你~?…

C语言变量未赋初值时,输出为乱七八糟解释

解释一: 操作系统回收内存单元后并不会清除其内容,当程序运行时需要为变量分配空间时就从这些回收的单元中分配,因此变量不赋初值,其值是不确定的。在不同的时刻运行,输出不同;在不同的机器上运行&#xf…

linux mplayer_移植mplayer播放器到EK200开发板的步骤浅析

mplayer是一款开源多媒体播放器,以gnu通用公共许可证发布此款软件可在各主流操作系统使用,一方面它资源占用率低;另一方面,无论是音频还是视频方面,它支持的格式相当全面,能支持播放大部分的音频、视频格式…

printf格式字符串和输出列表个数及类型不匹配案例

printf函数不会进行任何类型转换(包括隐式转换),它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式) void main() {int i10.0/3;float j10.0/3;printf("%d\n",i); //3printf…

const 常量_var,let,const 的区别?

为了更好的了解var let const 的区别,我们就来简单的了解它们的过程相信有很多人都会面临面试官问的这个问题 很多的同学都是简单的认为 var声明的变量会提升,而let const 不会,虽然可以这样认为,但不完全对,经过几经波…

C语言按位取反原理

正数取反是先将初始数值转换成二进制数(6》00000110),再对二进制数的每一位取反:即将0变为1、将1变为0。(00000110》11111001),得到的是最终结果的补码,要转换为最终结果的原码则需再…

脚本自动定时打开链接_自动化构建系统

在软件开发过程中,特别是在一些大型多人合作开发的项目中,如何将各个人开发的不同模块集合为一个完整的系统,最终输出一个完整的目标文件,这个过程包括编译,发布,自动化测试等环节。这一过程的完善程度和流…

++ba--运算结果解析

int db&&a--; 此运算其实的操作为&#xff1a; db&&a,然后aa-1,所以d0&#xff0c;a-1. #include<stdio.h> void main() {/*double a97.3;double b98;double c;int c1;printf("%d\n",(int)(a/b));printf("%f",a/b);*/int a0,b2,…

python docker_Docker实践:python应用容器化

一、前言 容器使用沙箱机制&#xff0c;互相隔离&#xff0c;优势在于让各个部署在容器的里的应用互不影响&#xff0c;独立运行&#xff0c;提供更高的安全性。本文主要介绍python应用&#xff08;django&#xff09;跑在docker容器里&#xff0c;编写dockerfile实现镜像构建自…

Python与C++ 局部变量/全部变量作用域讨论

python分为def内和def外 C分为花括号内和花括号外

python删除对象引用_使用Python删除内存中的对象

我正在尝试使用这种方法删除python中的对象。我阅读了Python的文档&#xff0c;声明垃圾收集器将自动删除未引用的对象。def check(): class newOb(): def __init__(self,value): self.value value print self.value return None class ob: ins {} def cr(self,someuniqueid,…

mysql 默认事务隔离级别_上个厕所的功夫,搞懂MySQL事务隔离级别

“隔离级别” 出于MySQL四大特性(ACID)中的“I”&#xff0c;也就是隔离性。目的是实现数据、事务一致性“C”。MySQL在多线程并发场景下&#xff0c;可能会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)这类并发问题&#xff0c;为了解决这些问…

Tg5032smn:高稳定性105℃高温

TG5032SMN是一款频率范围10MHz ~ 54MHz,具有高稳定的TCXO晶振&#xff0c;可与CMOS或限幅正弦输出。外部尺寸5.0 3.2 1.45mm&#xff0c;超小型,质地轻。该系列晶振的额定工作范围-40℃~&#xfe62;105C内可高稳定性工作&#xff0c;使得信号频率的误差很小。TG5032SMN与其他…