ARM汇编基础——学习笔记

汇编尾缀.s
@是注释。
LDR 有等号就是伪指令

	LDR R1,=0xC001E020 @把寄存器GPIOEALTFN0的地址放入R1

LDR 加载指令

	LDR R0,[R1] @将R1加载到R0中

BIC 清零指令。

	BIC R0,R0,#(3<<26) @相当于 R0 &= ~(3<<26),清零

ORR

	ORR R0,R0,#(1<<13) @相当于RO|=(1<<!3),将R013位置1

STR 保存指令

	STR R0,[R1] @把R0的值存入R1中

(B 跳转名) 跳转指令

LOOP:
...
...
	B LOOP@ 跳转到跳转名处,类似c语言go to、while循环。

BL 函数名 带返还的跳转指令。

BX 带状态切换的跳转指令。

BLX 带返还和状态切换的跳转指令。

lr R14寄存器 连接下一个寄存器。

MOV move移动指令

MOV R2,XXX @将xxx写入R2中。

SUB 减法指令

SUB R2,R2,#1 @相当于R2=R2-1,SUBS表示减法操作会影响标志位。

CMP 比较指令。

CMP R2,#0x0@R2和0做比较

BNE 跳转判断,判断上面R2是否等于0。
在这里插入图片描述

.global _start
_start:	@程序入口
	@以下四条指令是把GPIOE13设置为复用功能0(GPIO)
	LDR R1,=0xC001E020 @把寄存器GIPOEALTFN0的地址放入R1
	LDR R0,[R1] @把寄存器GIPOEALTFN0的值加载到R0
	BIC R0,R0,#(3<<26) @ R0 = R0 & ~(3<<26)
	STR R0,[R1] @把修改好的R0的值存入GIPOEALTFN0
	
	@以下四条指令是把GPIOE13设置为输出模式
	LDR R1,=0xC001E004 @把寄存器GIPOEOUTENB的地址放入R1
	LDR R0,[R1] @把寄存器GIPOEOUTENB的值加载到R0
	ORR R0,R0,#(1<<13)@ R0 = R0 | (1<<13)
	STR R0,[R1]@把修改好的R0的值存入GIPOEOUTENB
	
loop: @相当于while(1)
	
	@以下四条指令是把GPIOE13输出高电平
	LDR R1,=0xC001E000 @把寄存器GIPOEOUT的地址放入R1
	LDR R0,[R1] @把寄存器GIPOEOUT的值加载到R0
	ORR R0,R0,#(1<<13)@ R0 = R0 | (1<<13)
	STR R0,[R1]@把修改好的R0的值存入GIPOEOUT
	
	BL  delay
	
	@以下四条指令是把GPIOE13输出低电平
	LDR R1,=0xC001E000 @把寄存器GIPOEOUT的地址放入R1
	LDR R0,[R1] @把寄存器GIPOEOUT的值加载到R0
	BIC R0,R0,#(1<<13) @ R0 = R0 & ~(1<<13)
	STR R0,[R1] @把修改好的R0的值存入GIPOEOUT
	
	BL  delay

	B loop
	
	
delay:

	MOV R2,#0xfffffff
temp:	
	SUBS R2,R2,#1 @R2 = R2 -1  S 表示减法操会影响标志位
	
	CMP R2,#0X0 @cpsr 标志位 N C Z V
	
	BNE temp @NE 不等于 如果R2 不等于0 跳到temp

	MOV PC,LR @子程序delay 返回到调用处的下一条指令
	@BX,LR
	

猜你喜欢

转载自blog.csdn.net/qq_42712816/article/details/82998734