第三周--AEM汇编语言编程入门
文章目录
- 一.STM32汇编程序
- 1.keil环境搭建
- 2.stm32程序
- (1).新建工程
- (2).配置环境
- (3).编译调试
- 3.分析HEX文件
- 二、基于MDK创建STM32
- 1.创建一个新工程
- 2.添加文件
- 3.汇编程序
- 4.分析编译生成的Hex文件
- 5.使用汇编实现LED闪硕
一.STM32汇编程序
1.keil环境搭建
keil安装
通过以上链接下载mdk和注册器,点击安装mdk,根据提示自行更改软件路径和支持包路径,填写完注册信息后NEXT,等待安装。安装完成,点击Finish。
注册
1.点击运行注册器程序。\n\n2.在桌面找到keil软件图标,点击右键,以管理员身份运行。\n\n3.点击File–>Lincense Management–>Single-User Lincense,找到CID,复制CID中的内容填写到注册器的CID空白处,将注册器中Target选择为ARM,点击Generate,得到注册码。\n\n4.将生成的注册码复制粘贴到Keil的New Lincense ID Code空白处,点击Add LIC,点击Close。
支持包安装
点击运行下载的支持包,NEXT开始安装,安装完成,点击Finish。
2.stm32程序
(1).新建工程
双击打开keil,点击菜单栏Project–>New μVision Project,新建项目,在弹窗中设置工程项目的名称和路径,在这里,我新建名为TEST的工程文件。
(2).配置环境
选择设备\n\n点击菜单中的Project,找到Options for Target ‘Target 1’并点击,在弹窗中选择相应的目标环境,此处我选的是STM32F103ZE
选择运行环境
添加源文件\n\n右键单击Source Group 1,选择Add New Item to Group,添加Asm File (.s)文件,命名为TEST并保存。\n\n为其添加如下代码
AREA MYDATA, DATAAREA MYCODE, CODEENTRYEXPORT __main__mainMOV R0, #10MOV R1, #11MOV R2, #12MOV R3, #13;LDR R0, =func01BL func01;LDR R1, =func02BL func02BL func03LDR LR, =func01LDR PC, =func03B .func01MOV R5, #05BX LRfunc02MOV R6, #06BX LRfunc03MOV R7, #07MOV R8, #08 BX LR
设置仿真器模式
编译调试
![在这里插入图片描述](https://img-blog.csdnimg.cn/92fdcb2b2fb24dae88d1e7dfd8739df6.png#pic_center
(3).编译调试
3.分析HEX文件
:020000040800F2
:100000000006002031010008390100083B0100080A
:100010003D0100083F010008410100080000000008
:100020000000000000000000000000004301000884
:1000300045010008000000004701000849010008D0
:100040004B0100084B0100084B0100084B01000860
:100050004B0100084B0100084B0100084B01000850
:100060004B0100084B0100084B0100084B01000840
:100070004B0100084B0100084B0100084B01000830
:100080004B0100084B0100084B0100084B01000820
:100090004B0100084B0100084B0100084B01000810
:1000A0004B0100084B0100084B0100084B01000800
:1000B0004B0100084B0100084B0100084B010008F0
:1000C0004B0100084B0100084B0100084B010008E0
:1000D0004B0100084B0100084B0100084B010008D0
:1000E0004B0100084B0100084B0100084B010008C0
:1000F0004B0100084B0100084B0100084B010008B0
:100100004B0100084B0100084B0100084B0100089F
:100110004B0100084B0100084B0100084B0100088F
:100120004B0100084B0100084B0100084B0100087F
:100130000948804709480047FEE7FEE7FEE7FEE77B
:10014000FEE7FEE7FEE7FEE7FEE7FEE704480549B7
:10015000054A064B7047000041020008990200085A
:100160000000002000060020000200200002002005
:10017000704770477047000080B500F001F880BDFF
:1001800082B041F204000021C4F20200019100910A
:1001900050F8041C41F4803140F8041C50F8041C51
:1001A00001F400310091019901310191009919B9CF
:1001B0000199B1F5A06FF1D150F8041C890354BF27
:1001C0000021012100910099012936D142F200015C
:1001D000C4F202010A6842F010020A600A6822F0C2
:1001E00003020A600A6842F002020A6001680160C4
:1001F00001680160016841F480610160016821F4D7
:100200007C110160016841F4E811016050F8041CA0
:1002100041F0807140F8041C50F8041C8901FBD5A2
:10022000016821F003010160016841F002010160F1
:10023000016801F00C010829FAD102B070470000F2
:1002400080B541F20000C4F202000168002241F0D2
:10025000010101604168CFF6FF0211404160016871
:100260004FF6FF72CFF6F66211400160016821F48B
:1002700080210160416821F4FE0141604FF41F01BB
:100280008160FFF779FF4EF60850CEF200004FF084
:100290000061016080BD00004FF00A004FF00B01CB
:1002A0004FF00C024FF00D0300F009F800F00AF8CF
:1002B00000F00BF8DFF81CE0DFF81CF0FEE74FF071
:1002C000050570474FF0060670474FF007074FF0DF
:0C02D00008087047BF020008CB020008BD
:040000050800029954
:00000001FF
该文件为16进制的一串字符。hex文件的第一排字符称之为扩展线性地址记录,也称为32位地址记录或HEX386记录。\n在第一行数据020000040800F2中,其实际表达为0x02 0x00 0x00 0x04 0x08 0x00 0xf2。具体含义为\n\n第一个字节 0x02表示本行数据的长度;\n\n第二、三字节 0x00 0x00表示本行数据的起始地址;\n\n第四字节 0x04表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05\n\n’00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录\n’01’ End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾\n\n’02’ Extended Segment Address Record: 用来标识扩展段地址的记录\n\n’03’ Start Segment Address Record:开始段地址记录\n\n’04’ Extended Linear Address Record: 用来标识扩展线性地址的记录\n\n’05’ Start Linear Address Record:开始线性地址记录\n\n然后是数据,0x08 0x00\n\n最后一个字节 0xf2为校验和。
。
二、基于MDK创建STM32
1.创建一个新工程
(1)点击project在选择保存路径
(2)选择环境配置
对应芯片
运行环境
2.添加文件
1.鼠标右键单击Source Group 1,选择Add New Item to Group,2.选择 Asm File (.s) ,设置源文件的名称,点击Add,随后设置完成。
3.汇编程序
AREA MYDATA, DATAAREA MYCODE, CODEENTRYEXPORT __main__mainMOV R0, #10MOV R1, #11MOV R2, #12MOV R3, #13;LDR R0, =func01BL func01;LDR R1, =func02BL func02BL func03LDR LR, =func01LDR PC, =func03B .func01MOV R5, #05BX LRfunc02MOV R6, #06BX LRfunc03MOV R7, #07MOV R8, #08 BX LR
###调试结果
选择仿真器\n设置硬件仿真器为ST_Link(根据自己的实际情况进行选择),仿真器的模式设置为JTAG接口或者SW(根据自己的实际情况进行选择)。设置完成,连接相应的仿真器会有对应信息显示。\n仿真调试(断点设置是在代码行前点击,出现红点,即表明断点设置成功
调试结果
4.分析编译生成的Hex文件
1.最终生成程序的各部分大小
2.分析Hex文件内容
第一行内容分别是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。\n\n0x02\n该行数据中有两个数据\n0x00 0x00\n本行数据的起始地址位\n0x04\n用来标识扩展线性地址的记录\n该字节还可以是其他值,下面是其他值的含义\n00:用来记录数据,HEX文件的大部分记录都是数据记录\n01:用来标识文件结束,放在文件的最后,标识HEX文件的结尾\n02:用来标识扩展段地址的记录\n03:开始段地址记录\n05:开始线性地址记录\n0x08 0x00\n该行两个字节的数据\n数据类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800\u003C\u003C16) 后作为基地址\n0xF2\n校验和,校验和= 0x100 - 累加和
5.使用汇编实现LED闪硕
1.创建一个新工程\n不需要添加启动代码(startup,core),其他步骤跟上面步骤基本一致。\n2.添加一个汇编文件
LED0 EQU 0x40011004;定义引脚PC2
RCC_APB2ENR EQU 0x40021018;配置RCC寄存器,时钟
GPIOC_CRL EQU 0x40011000;配置CRL寄存器
Stack_Size EQU 0x00000400;栈的大小
;分配一个STACK段,该段不初始化,可读写,按8字节对齐。分配一个大小为Stack_Size的存储空间,并使栈顶的地址为__initial_sp。AREA STACK, NOINIT, READWRITE, ALIGN=3;NOINIT: = NO Init,不初始化。READWRITE : 可读,可写。ALIGN =3 : 2^3 对齐,即8字节对齐。
Stack_Mem SPACE Stack_Size
__initial_spAREA RESET, DATA, READONLY__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerAREA |.text|, CODE, READONLY;开始代码段THUMBREQUIRE8PRESERVE8ENTRY
Reset_Handler BL LED_Init;BL:带链接的跳转指令。当使用该指令跳转时,当前地址(PC)会自动送入LR寄存器
MainLoop BL LED_ONBL DelayBL LED_OFFBL DelayB MainLoop;B:无条件跳转。LED_Init;LED初始化PUSH {R0,R1, LR};R0,R1,LR中的值放入堆栈LDR R0,=RCC_APB2ENR;LDR是把地址装载到寄存器中(比如R0)。ORR R0,R0,#0x04;ORR 按位或操作,将将R0的第二位置1,其他位不变LDR R1,=RCC_APB2ENRSTR R0,[R1];STR是把值存储到寄存器所指的地址中。LDR R0,=GPIOC_CRLBIC R0,R0,#0x0F;BIC 先把立即数取反,再按位与LDR R1,=GPIOC_CRLSTR R0,[R1]LDR R0,=GPIOC_CRLORR R0,R0,#0x03LDR R1,=GPIOC_CRLSTR R0,[R1];将PC2置1MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC};将栈中之前存的R0,R1,LR的值返还给R0,R1,PCLED_ONPUSH {R0,R1, LR} MOV R0,#0LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}LED_OFFPUSH {R0,R1, LR} MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC} DelayPUSH {R0,R1, LR}MOVS R0,#0MOVS R1,#0MOVS R2,#0DelayLoop0 ADDS R0,R0,#1CMP R0,#330BCC DelayLoop0MOVS R0,#0ADDS R1,R1,#1CMP R1,#330BCC DelayLoop0MOVS R0,#0MOVS R1,#0ADDS R2,R2,#1CMP R2,#15BCC DelayLoop0POP {R0,R1,PC} ; NOPEND
相关命令说明:
AREA命令:AREA 命令指示汇编器汇编一个新的代码段或数据段。段是独立的、指定的、不可见的代码或数据块,它们由链接器处理。
格式如下:AREA 段名,段属性1,段属性2,段属性例如: AREA STACK, NOINIT, READWRITE, ALIGN=3.
SPACE命令:SPACE 命令保留一个用零填充的存储器块。
ENTRY命令:声明整个程式的入口点,入口点有且仅有一个。
完成后,编译烧录,最终结果是将开发板上的LED点亮,但是,并没有出现闪烁的现象。
第三周--AEM汇编语言编程入门相关推荐
- ARM汇编语言编程入门实践
文章目录 一.keil的安装 二.安装stm32 pack 三.keil 的简单设置 四.基于STM32汇编程序的编写 4.1 新建工程 4.2 新建test.s文件 4.3 编译程序 4.4 分析H ...
- 【嵌入式系统开发05】ARM汇编语言编程入门实践
本文目的是主要介绍如何搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写.记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义,学习在没有硬件条件下 ...
- 搭建Keil编程环境,ARM汇编语言编程入门实践
多看多学 一.安装及配置环境 01 型号分类及缩写 02 资料共享 03 安装器件支持包 04 Keil简单设置 二.简单程序编译 01 新建工程 02 配置环境 03 添加源文件 04 设置仿真器模 ...
- 利用keil完成ARM汇编语言编程入门实践
文章目录 一.安装keil软件 1.下载安装包 2.安装keil 3.安装stm32 pack 二.简单的stm汇编语言的编程 1.新建工程项目 2.新建main.c文件 3.编译 4.stm32仿真 ...
- 吴恩达Coursera, 机器学习专项课程, Machine Learning:Advanced Learning Algorithms第三周编程作业...
吴恩达Coursera, 机器学习专项课程, Machine Learning:Advanced Learning Algorithms第三周所有jupyter notebook文件: 吴恩达,机器学 ...
- 哈工大C语言程序设计精髓第三周
由于这些代码也是我初学时写的代码,故其中的规范程度及简洁程度并不很好(此处我后来写的有可以参考一下->C语言代码规范),但是能很好的接近出初学者的水平,也更有参考价值!排版不易,喜欢就点个赞吧! ...
- 【中文】【吴恩达课后编程作业】Course 2 - 改善深层神经网络 - 第三周作业
[中文][吴恩达课后编程作业]Course 2 - 改善深层神经网络 - 第三周作业 - TensorFlow入门 上一篇: [课程2 - 第三周测验]※※※※※ [回到目录]※※※※※下一篇: [课 ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
为什么80%的码农都做不了架构师?>>> 本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...
- GPU 编程入门到精通(三)之 第一个 GPU 程序
博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
最新文章
- 二:SpringAOP
- c语言二维数组参数传入,C语言二维数组、参数传递的理解
- golang+数据库定时任务
- html水平分隔线样式,CSS生成漂亮的水平分隔线(horizontal rule)设计效果
- 计算机专业常用图论,同等学力申硕计算机专业--数学公式集合(新增学习笔记)...
- php原生态三级联动_ajax php实现三级联动的方法
- http 和 https 区别?
- jasypt加密_【Jasypt】给你的配置加把锁
- java的 jre是什么_Java中JRE介绍,JRE是什么
- Java微信公众平台开发之素材管理
- 综合练习--The Eighth Week
- 【视角】限贷传闻横扫楼市 专家看空房地产业
- 学之思考试系统安装详细教程
- 浅析部分物化以及冰山立方体的计算方法Star-Cubing
- item_password-获得1688平台淘口令真实url,1688短链接搜索商品接口接入解决方案
- java如何获取当前时间 年月日 时分秒
- 炽热如初 向新而生|ISC2022 HackingClub白帽峰会圆满举办
- 智慧之战——农民工大战博士后
- MIT 线性代数(16—18)读书笔记
- 自动装箱和自动拆箱——源码分析
热门文章
- OkHttp基础概念解释
- 找到卡顿来源,BlockCanary源码精简分析
- Android开发教程--设置ImageView图片的显示比例
- SQL server 2012 SP4设置TLS1.2
- RetinaFace人脸检测
- [转] 在加拿大找不到工作?给你一百个招聘网站够不够?
- 广义相对论-学习记录9-第四章-相对论性的引力理论2
- 用计算机代码查四六级准考证号,四六级查询忘了准考证: 99宿舍找回四六级准考证查分流程...
- 7-3 整除问题 (10 分)
- 地名翻译混乱 广东省质监局出台规范