ARM Day4

汇编实现三个灯的闪烁

.text

.global _start

_start:

@使能GPIOE的外设时钟

LDR R0,=0x50000A28 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

ORR R1,R1, #(0x3<<4) @[4]设置为1

STR R1,[R0] @将修改之后的值写回去

@设置PE10为输出

LDR R0,=0x50006000 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<20) @[21:20]设置为00

ORR R1,R1,#(0x1<<20) @[21:20]设置为01

STR R1,[R0] @将修改之后的值写回去

@设置PF10为输出

LDR R0,=0x50007000 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<20) @[21:20]设置为00

ORR R1,R1,#(0x1<<20) @[21:20]设置为01

STR R1,[R0] @将修改之后的值写回去

@设置PE8为输出

LDR R0,=0x50006000 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<16) @[17:16]设置为00

ORR R1,R1,#(0x1<<16) @[17:16]设置为01

STR R1,[R0] @将修改之后的值写回去

@设置PE10为推挽输出

LDR R0,=0x50006004 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x1<<10) @[10]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PF10为推挽输出

LDR R0,=0x50007004 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x1<<10) @[10]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PE8为推挽输出

LDR R0,=0x50006004 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x1<<8) @[8]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PE10低速输出

LDR R0,=0x50006008 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<20) @[21:20]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PF10低速输出

LDR R0,=0x50007008 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<20) @[21:20]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PE8低速输出

LDR R0,=0x50006008 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<16) @[17:16]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PE10无上拉下拉电阻

LDR R0,=0x5000600C @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<20) @[21:20]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PF10无上拉下拉电阻

LDR R0,=0x5000700C @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<20) @[21:20]设置为0

STR R1,[R0] @将修改之后的值写回去

@设置PE8无上拉下拉电阻

LDR R0,=0x5000600C @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x3<<16) @[17:16]设置为0

STR R1,[R0] @将修改之后的值写回去

LOOP: @B不让程序结束

bl LED1_ON

bl LED2_ON

bl LED3_ON

bl DELAY

bl LED1_OFF

bl LED2_OFF

bl LED3_OFF

bl DELAY

B LOOP

@亮灯

LED1_ON:

@点灯 GPIO_ODR[10]->1

LDR R0,=0x50006014 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

ORR R1,R1,#(0x1<<10) @[10]设置为0

STR R1,[R0] @将修改之后的值写回去

mov PC,LR @程序返回

LED2_ON:

@点灯 GPIO_ODR[10]->1

LDR R0,=0x50007014 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

ORR R1,R1,#(0x1<<10) @[10]设置为0

STR R1,[R0] @将修改之后的值写回去

mov PC,LR @程序返回

LED3_ON:

@点灯 GPIO_ODR[10]->1

LDR R0,=0x50006014 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

ORR R1,R1,#(0x1<<8) @[8]设置为0

STR R1,[R0] @将修改之后的值写回去

mov PC,LR @程序返回

@灭灯

LED1_OFF:

@灭灯 GPIO_ODR[10]->0

LDR R0,=0x50006014 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x1<<10) @[10]设置为0

STR R1,[R0] @将修改之后的值写回去

mov PC,LR @程序返回

LED2_OFF:

@灭灯 GPIO_ODR[10]->0

LDR R0,=0x50007014 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x1<<10) @[10]设置为0

STR R1,[R0] @将修改之后的值写回去

mov PC,LR @程序返回

LED3_OFF:

@灭灯 GPIO_ODR[10]->0

LDR R0,=0x50006014 @指定基地址

LDR R1,[R0] @将寄存器数据读取出来保存到R1中

BIC R1,R1,#(0x1<<8) @[8]设置为0

STR R1,[R0] @将修改之后的值写回去

mov PC,LR @程序返回

@延时函数

DELAY:

LDR R3,=0x10000000

MM:

CMP R3,#0

SUBNE R3,R3,#1

BNE MM

MOV PC,LR @程序返回

.end

相关推荐
AI迅剑9 小时前
模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》
汇编·c++
代码改变世界ctw1 天前
ARM汇编编程(AArch64架构)第13课:多核启动与调度
汇编·arm开发·架构
代码改变世界ctw2 天前
ARM汇编编程(AArch64架构)课程 - 第9章:原子操作与同步
汇编·arm开发·架构
代码改变世界ctw3 天前
2.2 TF-A在ARM生态系统中的角色
汇编·arm开发·安全·trustzone·atf·optee
baynk3 天前
逆向入门(9)汇编篇-bound指令的学习
汇编·学习
无小道4 天前
c++--typedef和#define的用法及区别
c语言·开发语言·汇编·c++
代码改变世界ctw5 天前
ARM汇编编程(AArch64架构)课程 - 第5章函数调用规范
汇编·arm开发·架构
liulilittle6 天前
C/C++ inline-hook(x86)高级函数内联钩子
c语言·开发语言·汇编·c++·hook·底层·钩子
代码改变世界ctw6 天前
ARM汇编编程(AArch64架构)课程 - 第8章:控制流与循环
汇编·arm开发
Jacen.L6 天前
【汇编逆向系列】九、函数传参之结构体 - SHL、SHR指令,小型结构体参数和返回值
汇编