D5. ARM指令集仿真环境搭建-ARM体系结构与接口技术-嵌入式学习LV9

DAY5. ARM指令集仿真环境搭建


如果出现图片无法查看可能是网络问题,我用的GitHub+图床保存的图片,可以参考我另外一篇文章GitHub的使用方法含网络问题解决
GitHub使用教程含网络问题_github加速器_肉丸子QAQ的博客-CSDN博客

相关软件资料已上传自行下载,也可三连私信我领取
ARM指令集仿真环境搭建资料含教程说明-Linux文档类资源-CSDN文库

1. ARM指令集导学

1.1 汇编的本质

  • 汇编

每条汇编都会唯一对应一条机器码,且CPU能直接识别和执行,

即汇编中所有的指令都是CPU能够识别和执行的,

汇编中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都需要自己维护

  • C语言

每条C语句都要被编译器编译成若干条汇编指令才能被CPU识别和执行

即C语句中的指令CPU不一定能直接识别,需要编译器进行“翻译”

C中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都是编译器来分配和维护


1.2 学习目的

  • 底层开发可能会读/写汇编代码

  • 理解CPU是怎样执行程序的

  • 理解C的本质,用汇编的思想写出高效的C代码


2. Keil仿真环境搭建

2.1 仿真

  • 硬件仿真

    通过硬件接口将CPU和内存中实际的信息读出来

  • 软件仿真

    通过软件模拟CPU内部运行程序的状态

2.2环境搭建步骤

  • Keil

    Keil MDK是用于基于ARM Cortex-M 微控制器的完整软件开发环境。它集成了uVision IDEC/C++编译器、调试器以及其他中间组件,支持众多芯片供应商,易于学习和使用

安装步骤

1. keil安装
  1. 双击‘MDK454’开始安装(若电脑上已安装了其他版本的 Keil,最好先卸载,因为后 续可能会有冲突)

image-20230614170732183

我的电脑安装了keil5做stm32开发,这里建议:如果你也正在使用keil5,建议暂时删掉后再用我分享的软件开发,如果不想删除原来的的话,我建议将软件和keil5安装在不同盘里面然后一切按照默认就行(非常不建议)

  1. 单击“Next”

image-20230614171807667

  1. 如图勾选对应的选项,然后单击“Next”

image-20230614171826863

  1. 如图单击“Browse”选择安装路径(不要有中文路径),然后单击“Next”

image-20230614171847315

  1. 如图先填写相关信息(随意即可,全填空格),然后单击“Next”开始安装,等待安装结束

image-20230614171919317

  1. 单击“Next”

image-20230614171943717

  1. 单击“Finish”完成安装

image-20230614172008760

若弹出该对话框,单击“不安装”即可

image-20230614172040088

  1. 安装完成后即可在桌面看到如图图标,右击图标以管理员身份运行该程序

image-20230614172101174

  1. 打开后单击界面左上角的“File”选项,然后单击“License Management…”

image-20230614172119134

  1. 在弹出的对话框中复制如图所示的 CID,该界面先不要关

image-20230614172142879

  1. 双击打开‘keygen’(打开之前最好把电脑声音调小,因为这个软件会发出非常‘悦耳’ 的声音)

image-20230614172219642

  1. 如图所示,在弹出的界面中选择“Target”为“ARM”,然后将复制的 CID 粘贴到对应的 位置,单击“Generate”生成 License,然后将生成的 License 拷贝到 Keil 界面中对应的位 置,然后单击“Add Lic”,若显示“LIC Added Successfully”表示破解成功,然后关 闭这两个对话框即可(若不破解代码超过 32K 后将不能编译),至此 Keil 集成开发环境安装 完成

image-20230614172245449

2. 交叉编译工具链安装-Windows

这里还需要再安装交叉编译工具不使用keil自带的编译器

  1. Keil 中虽然已经集成了编译器,但在实际开发中 ubuntu 环境下使用较多的编译器是 gcc, 所以这里我们在 Windows 下也安装 gcc 交叉编译器,然后在 Keil 中引用 gcc 进行编译。 右击‘arm-2011.09-70-arm-none-linux-gnueabi’然后单击“属性”

image-20230615150726349

  1. 在弹出的对话框中按照下图进行设置

image-20230615150743543

  1. 设置完成后右击‘arm-2011.09-70-arm-none-linux-gnueabi’然后以管理员身份运行该 程序

image-20230615150822505

  1. 单击“Next”

image-20230615150841968

  1. 勾选“I accept …”,然后单击“Next”

image-20230615150858326

  1. 单击“Next”

image-20230615150912591

  1. 这里使用默认的“Typical”方式,然后单击“Next”

image-20230615150931941

  1. 这里使用默认的安装路径,单击“Next”!!!!!!!!!!!方便后续设置

image-20230615151014774

  1. 单击“Next”

image-20230615151027641

  1. 单击“Next”

image-20230615151043008

  1. 单击“Install”开始安装(安装之前先将电脑上的杀毒软件关闭

image-20230615151132159

  1. 安装完成后单击“Next”

image-20230615151154533

  1. 单击“Done”完成安装

image-20230615151206190

3. 汇编工程创建说明
  1. 在任意路径下创建一个文件夹用于后续存放我们的工程(名字任意)

image-20230615151308329

  1. 双击打开 Keil

image-20230615151327128

  1. 在 Keil 界面下单击“Project”然后单击“New uVision Project…”创建一个新的工程

image-20230615151342189

  1. 在弹出的对话框中选择工程的存储目录(选择步骤 1 创建的文件夹)然后单击“打开”

image-20230615151355520

  1. 输入要创建的工程的名字(不要有中文),然后单击“保存”将新建的工程保存到该目录

image-20230615151422076

  1. 在弹出的对话框中选择我们要使用的处理器,因为我们是软件仿真所以这里选择一个基 于 ARM 的处理器即可;这里我们选择“Samsung”下的“S3C2410”处理器,选中后右侧 会显示该处理器的相关信息,然后单击“OK”

image-20230615151457528

这里如果你不用我这个版本,就可能会出现没有这个选项,我用的keil5实测没有找到

  1. Keil 会为我们选择的处理器自动生成一段汇编启动代码,这里我们单击“否”不使用其 生成的启动代码

image-20230615151555747

  1. 我们新建的工程中还没有任何文件,单击“New”图标新建一个文件

image-20230615151611649

  1. 如图单击“保存”图标,然后在弹出对话框中输入文件的名字(不要用中文,汇编代码 使用.s 后缀),然后单击保存

image-20230615151630387

  1. 我们虽然新建了汇编文件,但是这个文件和我们的工程并没有任何关系,所以我们需要 将我们创建的文件添加到工程中;如图先展开“Target 1”,然后右击“Source Group 1”, 然后单击“Add Files to Group ‘Source Group 1’…”

image-20230615151646287

  1. 因为默认只显示.c 文件,所以在弹出的对话框中先选择文件类型为“All Files(.)”,然后 选中我们创建的汇编文件,然后单击“Add”添加文件到工程,最后单击“Close”

image-20230615151720436

  1. 回到主界面展开“Source Group 1”即可看到我们的文件了,右的编辑区可以编辑文件

image-20230615151733155

  1. 因为我们要使用自己安装的 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”完成设置

    image-20230615151823519

  2. 如图单击“Target Options…”图标,在弹出的对话框中单击“Linker”,设置“Text Start” 即代码的起始地址为“0x00000000”,然后单击“OK”,这样我们写的代码的起始地址就是 从 0x00000000 开始存储

image-20230615151841193

  1. 如图所示,在编辑区可编辑汇编代码(可参考图中进行编辑),编辑完成后单击“保存”, 然后再点击“编译”即可编译汇编代码,在对话框的下方可以看到编译信息(警告和错误), 编译无误后我们可以单击“Debug”进行程序的仿真和调试

image-20230615151913953

.text				@表示当前段为代码段
.global _start		@声明_start为全局符号
_start:				@汇编程序的入口

	MOV R1,#1		@汇编程序
	
stop:				@死循环,防止程序跑飞
	B stop
	
.end				@汇编程序的结束

注 1:每次修改完代码之后必须先保存再进行编译

注 2:若编译后有以下警告信息,再次单击编译即可消除 Warning: arm-asm.s: Warning: end of file in comment; newline inserted

  1. 如图所示为程序仿真界面,单击“复位”可复位程序,单击“单步运行”可单步调试, 单击“Debug”可退出仿真界面,在寄存器信息栏中我们可以看到程序运行过程中寄存器中 的值,在汇编源码栏中我们可以看到程序源码以及当前程序运行的位置,在反汇编栏我们可 以看到汇编代码对应的机器码以及内存地址等信息,在内存信息栏我们可以看到指定内存地 址中的内容,还有很多其他选项这里不再一一赘述… …

image-20230615152017930

3. ARM指令概述

C语言

1. 语句
    a++;
2. 注释:不参与编译
    //
3. 预编译指令:带#号不参与编译但是会告诉编译器怎么编译
#if 0
...
#else 
    ...
#endif

汇编

@1. 汇编的符号
@	1.指令:能够编译生成一条32bit机器码,并且能够被cpu识别和执行
@	2.伪指令:(3x3---》3+3+3):cpu不能直接认识,但是能通过编译器翻译成若干条指令,!!伪指令不是指令!!
@	3.伪操作:不会生成指令只是在编译的

ARM

@1. 数据处理指令: 进行数学运算,逻辑运算
@2. 跳转指令: 实现程序的跳转,本质就是修改PC寄存器
@3. Load/Srore指令:访问(读写)内存
@4. 状态寄存器传送指令:用于访问(读取)CPSR寄存器
@5. 软中断指令:触发软中断
@6. 协处理器指令: 操控协处理器的指令



4. 作业

1.简述C语言和汇编语言的本质区别是什么

  • 汇编

每条汇编都会唯一对应一条机器码,且CPU能直接识别和执行,

即汇编中所有的指令都是CPU能够识别和执行的,

汇编中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都需要自己维护

  • C语言

每条C语句都要被编译器编译成若干条汇编指令才能被CPU识别和执行

即C语句中的指令CPU不一定能直接识别,需要编译器进行“翻译”

C中寄存器的使用、栈的分配与使用、程序的调用、参数的传递等都是编译器来分配和维护

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉丸子QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值