Arm入门第二讲,配置Arm环境

Arm入门第二讲,配置Arm环境

一丶简介

​ 关于市面上Arm的环境应该有好多. 在之前记得又看到过gcc也可以配置. 不过我这里用的是Keil uVision5 程序

这里给出官方下载链接: Keil uVision5 不过鉴于这个程序下载慢配置不稳定.这里我就提供个百度盘链接.

链接:https://pan.baidu.com/s/1Kc-6Bw4v5Y7u2JvUHDtxvw
提取码:5765

二丶工具配置

​ 工具下载之后一Next(继续)下去即可. 跟正常软件安装一样. 不懂上网搜.这里不截图

2.1 工程的建立

​ 当安装之后首先要创建一个功能. 点击Project->New uVision Project 则会出现一个弹出窗口.

我们只需要在下面文件名一览输入你自定义的名字即可. 他则会创建一个工程到这个文件夹下. 点击 保存之后

则需要你选择 设备 如下图 我们选择ARMCM0即可:

点击OK按钮 之后这里就会弹出 Run-Time 环境设置 如下图

这里把上面的选择都勾上即可.下面就说明字段的意思

CMSIS 这个选项是ARM与其它厂商定义的一个公共的接口

Device 设备的意思. 是arm运行需要的

OK之后界面如下

CMSIS Device都是我们在创建的时候选择的. 这里的工程名是我们创建的时候起的名字. 然后在Source Group 1

上面右键选择 Add New Item to Group 'Source Group 1' ... 打开之后就能看到可以创建好多文件.包括C C++的源文件.

为了学习这里选择创建C 源文件 后缀名为.c结尾. 创建之后我们的 Source Group1里面就有我们的C源文件了

我们就可以在里面写 标准的C源代码了 如下:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	printf("HelloWorld");
	return 0;
}

2.2 程序的编译(Build) 与调试配置

  • 1.程序的编译

    ​ 程序编译很简单. 只需要 按快捷键 F7 或者在 hellword.c 位置右键 选择build即可

  • 2.程序的调试配置

    ​ 配置调试 我们首先要打开配置界面. 这里有三种方式

    1 快捷键 Alt+F7

    ​ 2.直接在界面中选择

    ​ 3.在菜单栏 项目(Protect中选择)

    下面两种看下图:

    打开后界面如下 保持选择跟红色框一致即可:

    此时我们就支持调试. F9可以代码前面设置断点. F10 F11分别就是步过和进入的意思. 启动调试可以在菜单栏中的Debug选项中设置. 调试跟其它IDE一样都是有得. 只需要熟悉下即可.

    设置之后就可以看到IDE应有的调试功能了. 包含堆栈 内存 寄存器等

2.3 程序入口与系统入口的了解

​ 我们的程序如下:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	printf("HelloWorld");
	return 0;
}

那么有过C开发知识的人应该知道, main 函数就是入口点. 对这是没错的. 它就是我们程序的入口点

而如果用VC++开发过C程序的人应该知道. main也是由其它封装好的函数调用的. 也就是 _mainstartup 好像是这个名字.

在我们这个程序中,也有类似与 _mainStartup 入口. 也就是我们所说的程序入口.

他就在 Device下的->Startup_ARMCM0.s中.

如下图:

这个简单了解下即可.

三丶编写最简单的Asm

​ 这个项目不光可以建立C文件 也可以建立汇编 Asm文件. 只需要按照配置的时候建立C文件 改为建立ASM文件即可.

建立好 asm文件之后填写下列代码

Version EQU 0    ;set version number     这里设置版本好. 而且和x86汇编一样 分号(;)代表注释
	area IBinary_Armtest,code,readonly  ;这里设置 代码 名字 以及属性值 是只读还是其他. 其中名字可以随便改
	entry							 ;定义我们的入口点
	export main						 ;main 比如与上面我们所讲的系统入口点调用的入口一致,这里就是main

main							    ;函数的名字
start								;函数开头
	mov R0,#0x4
	mov R1,#0x8                       ;这里的汇编与x86一样, r0赋值为4 r1赋值为8  
	add R0,R0,R1;add r0 r0,r1意思就是最后的r0 r1相加. 结果放到最前面的r0中. 与x86也类似
stop
	b stop
	end								;结束

如果你拷贝这个代码到编译器中,并且编译是不会成功的. 原因在于

mov R0,#0x4
mov R1,#0x8                       
改为:
movs R0,#0x4
movs R1,#0x8                       

原因在于这里的mov指令没问题. 可是这种指令必须在后面加上影响标志相关的属性. 这里跟x86不一样. 大体意思就是

你操作完一个指令之后你要告诉我是进位了 是溢出了 还是其它咋地了. 关于标志为在上一节简介过. 这里只需要知道加上s即可.

后面会完整的学习指令.

posted @ 2021-06-30 21:26  Android_IBinary  阅读(620)  评论(0编辑  收藏  举报