@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@ LED_1--GPF4
@ LED_2--GPF5
@ LED_4--GPF6
@******************************************************************************
.equ GPFCON, 0x56000050
.equ GPFDAT, 0x56000054
.text
.global _start
_start:
@ 往WATCHDOG寄存器写0即可
mov r1,#0x53000000
mov r2,#0x0
str r2,[r1]
bl led_init
MAIN_LOOP:
bl DELAY
bl led1_off
bl DELAY
bl led2_off
bl DELAY
bl led3_off
B MAIN_LOOP
led_init:
LDR R0,=GPFCON
MOV R1,#0x00001500
STR R1,[R0]
mov pc,lr @ 返回
led1_off:
LDR R0,=GPFDAT
MOV R1,#0x00000010
STR R1,[R0]
mov pc,lr @ 返回
led2_off:
LDR R0,=GPFDAT
MOV R1,#0x00000020
STR R1,[R0]
mov pc,lr @ 返回
led3_off:
LDR R0,=GPFDAT
MOV R1,#0x00000040
STR R1,[R0]
mov pc,lr @ 返回
DELAY:
MOV R0,#0xff
MOV R2,#0xff
D1: SUB R1,R0,#1 @R2=R1-1
MOV R0,R1
D2: SUB R3,R2,#1 @R3=R2-1
MOV R2,R3
TST R3,#0xff
BNE D2
TST R1,#0xff
BNE D1
mov pc,lr @ 返回
Makefile:
led_on.bin : led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
arm-linux-objdump -D -m arm led_on_elf > led_on.dis
clean:
rm -f led_on.bin led_on_elf *.o
程序分析:
1、ARM汇编指令解释
1)、.equ指令,此指令类似于C语言中的宏定义#define,就是简单的字符串替换。
语句 .equ GPFCON, 0x56000050 的意思就是用GPFCON代替0x56000050,在C语言中相当于 #define GPFCON 0x56000050。
2)、.text指令,此指令是arm-gcc的关键词,告诉编译器后续编译出来的内容放在代码段【可执行】。
3)、.global指令,此指令也是arm-gcc的关键词,告诉编译器后续跟的是一个全局可见的名字【可能是变量或者函数名】。
4)、mov指令,此指令可以完成从一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。
如: mov r1,#0x53000000 将立即数0x53000000加载到r1寄存器。
mov pc,lr 将寄存器lr的内容加载到pc寄存器
5)、str指令,此指令用于从一个源寄存器将一个32位的字数据传送到存储器中。
str r2,[r1] 将寄存器r2的内容加载到r1寄存器指向的地址中去。
6)、LDR指令,此指令用于从存储器中将一个32位的数据传送到目的寄存器中。
7)、bl指令,此指令为跳转指令,跳转到后面标号的地址中。并在跳转前把下一条要执行的指令地址放在lr寄存器中。在子程序中可以用mov pc,lr返回。
如: bl led_init 跳转到标号led_init_处执行
8)、B指令,与bl类似,只不过不保存返回地址。
9)、TST指令,此指令先把两个操作时进行位与运算,再与0比较,常跟bne(不相等跳转)或beq(相等跳转)组合使用。
10)、bne指令,不相等跳转。
11)、sub指令,相减指令。
如: D2:
SUB R3,R2,#1 @R3=R2-1
MOV R2,R3
TST R3,#0xff
BNE D2
程序首先把R2的值减1然后传送到R3,然后再把R3的值传送到R2,然后R3的值与0xff进行位与在与0比较,不相等则跳转到D2处继续执行程序。
就 3指令 2、程序流程分析
程序开始执行时首先关闭看门狗,防止cpu复位,然后进行led初始化,把相应GPIO设置成输出模式,然后控制GPIO输出0或者1使led点亮或者熄灭。
3、Makefile分析
arm-linux-gcc -g -c -o led_on.o led_on.S 编译不连接程序
arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf 把程序连接,连接地址为0x00000000
arm-linux-objcopy -O binary -S led_on_elf led_on.bin 把程序转成bin文件
arm-linux-objdump -D -m arm led_on_elf > led_on.dis 把程序转换为反汇编
阅读(1819) | 评论(0) | 转发(0) |