汇编点灯练习

要求:

1、轮流将LED1、LED2、LED3及蜂鸣器点亮

2、基于STM32MP157AAA,阅读原理图和STM32MP157芯片手册

3、ARM汇编指令点灯

1、运行效果

汇编点灯

2、通过查询原理图和芯片手册,得到以下结论:

3、汇编源码

cpp 复制代码
.text 
.global _start
_start:
@R0 存放寄存器在内存中的map地址
@R1 存放寄存器的值

@1 配置RCC: LD1、LD2、LD3和蜂鸣器的使能
ldr R0, =(0x50000000+0xA28)
ldr R1, [R0]
orr R1, R1, #0x32
str R1, [R0]

@2 配置MODER寄存器
@2.1 配置LED1、LED3
ldr R0, =0x50006000
ldr R1, [R0]
bic R1, #(0x33<<16)
orr R1, #(0x11<<16)
str R1, [R0]
@2.2 配置LED2
ldr R0, =0x50007000
ldr R1, [R0]
bic R1, #(0x3<<20)
orr R1, #(0x1<<20)
str R1, [R0]
@2.3 配置蜂鸣器
ldr R0, =0x50003000
ldr R1, [R0]
bic R1, #(0x3<<12)
orr R1, #(0x1<<12)
str R1, [R0]

@3 配置OTYPER寄存器
@3.1 配置LED1、LED3
ldr R0, =(0x50006000+0x04)
ldr R1, [R0]
bic R1, #(0x5<<8)
str R1, [R0]
@3.2 配置LED2
ldr R0, =(0x50007000+0x04)
ldr R1, [R0]
bic R1, #(0x1<<10)
str R1, [R0]
@3.3 配置蜂鸣器
ldr R0, =(0x50003000+0x04)
ldr R1, [R0]
bic R1, #(0x1<<6)
str R1, [R0]

@4 配置OSPEEDR寄存器
@4.1 配置LED1、LED3
ldr R0, =(0x50006000+0x08)
ldr R1, [R0]
bic R1, #(0x33<<16)
str R1, [R0]
@4.2 配置LED2
ldr R0, =(0x50007000+0x08)
ldr R1, [R0]
bic R1, #(0x3<<20)
str R1, [R0]
@4.3 配置蜂鸣器
ldr R0, =(0x50003000+0x08)
ldr R1, [R0]
bic R1, #(0x3<<12)
str R1, [R0]

@5 配置PUPDR寄存器
@5.1 配置LED1、LED3
ldr R0, =(0x50006000+0x0C)
ldr R1, [R0]
bic R1, #(0x33<<16)
str R1, [R0]
@5.2 配置LED2
ldr R0, =(0x50007000+0x0C)
ldr R1, [R0]
bic R1, #(0x3<<20)
str R1, [R0]
@5.3 配置蜂鸣器
ldr R0, =(0x50003000+0x0C)
ldr R1, [R0]
bic R1, #(0x3<<12)
str R1, [R0]

@死循环让
loop:
	bl bee_off
	bl led1_on
	bl delay	
	bl led1_off
	bl led2_on
	bl delay
	bl led2_off
	bl led3_on
	bl delay
	bl led3_off
	bl bee_on
	bl delay
	b loop

delay:
	mov R10, #0x10000000
d2:
	sub R10, R10, #1
	cmp R10, #0
	bne d2
	mov PC, LR

led1_on:
ldr R0, =(0x50006000+0x14)
ldr R1, [R0]
orr R1, #(0x1<<10)
str R1, [R0]
mov PC, LR

led2_on:
ldr R0, =(0x50007000+0x14)
ldr R1, [R0]
orr R1, #(0x1<<10)
str R1, [R0]
mov PC, LR

led3_on:
ldr R0, =(0x50006000+0x14)
ldr R1, [R0]
orr R1, #(0x1<<8)
str R1, [R0]
mov PC, LR

bee_on:
ldr R0, =(0x50003000+0x14)
ldr R1, [R0]
orr R1, #(0x1<<6)
str R1, [R0]
mov PC, LR

led1_off:
ldr R0, =(0x50006000+0x14)
ldr R1, [R0]
bic R1, #(0x1<<10)
str R1, [R0]
mov PC, LR

led2_off:
ldr R0, =(0x50007000+0x14)
ldr R1, [R0]
bic R1, #(0x1<<10)
str R1, [R0]
mov PC, LR

led3_off:
ldr R0, =(0x50006000+0x14)
ldr R1, [R0]
bic R1, #(0x1<<8)
str R1, [R0]
mov PC, LR

bee_off:
ldr R0, =(0x50003000+0x14)
ldr R1, [R0]
bic R1, #(0x1<<6)
str R1, [R0]
mov PC, LR

.end

4、疑问

4.1 汇编代码优化

从源码中可以看出,其实有大量的重复代码,作为一名"资深"程序员,很想抽成一个一个的函数。但是实际中,这样做一定有大量的push/pop操作,而且如果程序段跨度过大,代码段的交替跳转,有可能还会影响程序执行效率(CPU会将执行代码的前后一段调入到多级缓存中,以提升执行效率)。

因此,在编写汇编的时候,应该遵循执行效率优先,还是可读性和可复用性呢?

4.2 一段反汇编代码

如图所示, =(0x50000000+0xA28)被译成了pc, #444, 不太理解。

相关推荐
水饺编程3 天前
第2章:Linux 基础,解压缩【.tar.bz2】压缩包文件
linux·c语言·汇编
Zevalin爱灰灰3 天前
Linux入门第二部分(ARM裸机篇) 第二章 Cortex-A7 MPCore架构与ARM汇编基础
linux·汇编·arm开发·嵌入式
Zevalin爱灰灰4 天前
Linux入门第二部分(ARM裸机篇) 第三章 汇编LED驱动实验
linux·汇编·arm开发
凉、介4 天前
深入理解 ARMv7-A | Generic Timer
笔记·学习·嵌入式·arm
水饺编程5 天前
第2章:Linux 基础,制作【.tar.xz】压缩包文件
linux·c语言·汇编
益企研究院6 天前
Arm 副总裁 Eddie Ramirez:智能体 AI 重塑数据中心,Arm 如何构建下一代算力底座?
arm
小向是个Der7 天前
嵌入式进阶——编译与链接
汇编·单片机·学习·编译原理·交叉编译
二十七日秋7 天前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法
银河麒麟操作系统7 天前
两案例入选全球计算联盟年度产业应用案例汇编
大数据·汇编·人工智能
abc light7 天前
ARM 裸机开发(2)——ARM 汇编与启动代码
汇编·arm开发