/*
*文件名:led.s
*作者:宗虎冬
*描述:这是arm裸机led灯亮灭三次效果
*
*/
.global _start //把_start链接属性改为外部,这样其他文件就可以看见_start了
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
_start:
//第一步:把所有引脚都设置为输出模式,代码不变
ldr r0, =0x11111111 //从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数
ldr r1, =GPJ0CON //是合法立即数还是非法立即数。一般写代码都用ldr伪指令
str r0, [r1] //寄存器间接寻址,功能是把r0的数写入到r1中的数为地址的内存中去
//第二部:全部点亮
ldr r0, =((0<<3) | (0<<4) | (0<<5))
ldr r1, =GPJ0CON
ldr r0, =[r1]
bl delay
//第三部:全部灭
ldr r0, =((1<<3) | (1<<4) | (1<<5))
ldr r1, =GPJ0CON
ldr r0, =[r1]
bl delay
//第四部:全部点亮
ldr r0, =((0<<3) | (0<<4) | (0<<5))
ldr r1, =GPJ0CON
ldr r0, =[r1]
bl delay
//第五部:全部灭
ldr r0, =((1<<3) | (1<<4) | (1<<5))
ldr r1, =GPJ0CON
ldr r0, =[r1]
//第六部:全部点亮
ldr r0, =((0<<3) | (0<<4) | (0<<5))
ldr r1, =GPJ0CON
ldr r0, =[r1]
bl delay
//第七部:全部灭
ldr r0, =((1<<3) | (1<<4) | (1<<5))
ldr r1, =GPJ0CON
ldr r0, =[r1]
b . //.代表当前这一句指令的地址,这个就是高大上的死循环
delay:
ldr r2, =100000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1 //r2 = r2 - 1
cmp r2, r3 //cmp会影响z标志位,如果r2等于r3则z=1,下一句中eq就会成立
bne delay_loop //不相等就跳回delay_loop
mov pc, lr //函数调用返回