Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26714
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 43
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-27 19:19
文章分类

全部博文(5)

文章存档

2015年(5)

我的朋友

分类: 嵌入式

2015-10-16 23:57:41

@******************************************************************************
@ 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处继续执行程序。

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) |
给主人留下些什么吧!~~