s3c2440的LED点灯裸机汇编程序

1.s3c2440裸机LED点灯代码(汇编代码)
.text
.global _start
_start:    
            LDR     R0,=0x56000010      @ R0设为GPBCON寄存器。此寄存器
                                        @ 用于选择端口B各引脚的功能:
                                        @ 是输出、是输入、还是其他
            MOV     R1,#0x00000400       
            STR     R1,[R0]             @ 设置GPB5为输出口, 位[10:9]=0b01
            LDR     R0,=0x56000014      @ R0设为GPBDAT寄存器。此寄存器
                                        @ 用于读/写端口B各引脚的数据
            MOV     R1,#0x00000000      @ 此值改为0x00000020,
                                        @ 可让LED1熄灭
            STR     R1,[R0]             @ GPB5输出0,LED1点亮
MAIN_LOOP:
            B       MAIN_LOOP
注释:
.text 指定了后续编译出来的内容放在代码段【可执行】;
.global 告诉编译器后续跟的是一个全局可见的名字【可能是变量,也可以是函数名】;
在本例中,_start是一个函数的起始地址,也是编译、链接后程序的起始地址。由于程序是通过加载器来加载的,必须要找到 _start名字的函数,因此_start必须定义成全局的,以便存在于编译后的全局符合表中,供其它程序【如加载器】寻找到。
2.上面汇编代码对应的makefile
led_on.bin : led_on.S
 arm-linux-gcc -g -c -o led_on.o led_on.S
 arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
 arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
 rm -f   led_on.bin led_on_elf *.o
注释:
arm-linux-ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。
arm-linux-ld 直接指定代码段,数据段,BSS段的起始地址
 -Tbss ADDRESS               Set address of .bss section
 -Tdata ADDRESS              Set address of .data section
 -Ttext ADDRESS              Set address of .text section
示例:
 ${CROSS}ld -Ttext=0x33000000 led.o -o led.elf
使用连接脚本设置地址:
arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf
其中beep.lds 为连接脚本。

arm-linux-objcopy 把一种目标文件中的内容复制到另一种类型的目标文件中。
arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换
示例:
arm-linux-objcopy –o binary –S elf_file bin_file
常用的选项:
input-file , outflie
输入和输出文件,如果没有outfile,则输出文件名为输入文件名
2.-l bfdname或—input-target=bfdname
用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析
3.-O bfdname 输出的格式
4.-F bfdname 同时指明源文件,目的文件的格式
5.-R sectionname 从输出文件中删除掉所有名为sectionname的段
6.-S 不从源文件中复制重定位信息和符号信息到目标文件中
7.-g 不从源文件中复制调试符号到目标文件中

你可能感兴趣的:(驱动)