近日,买了一块韦东山的JZS3C2440开发板用来学习linux开发,经过几天时间的摆弄,今天,终于实现了usb烧写裸机程序。
还是从经典的点灯开始,首先新建一个名为led.S的汇编文件,然后代码如下所示
.text
.global _start
_start:
LDR R0,=0x56000050 ;取地址0x56000050存放到R0寄存器
MOV R1,#0x00000100 ;赋值0x000000100给R1寄存器
STR R1,[R0] ;R1寄存器内容加载到R0寄存器存储的地址处
LDR R0,=0X56000054 ;取地址0x56000054存放到R0寄存器
MOV R1,#0X00000000 ;赋值0x000000000给R1寄存器
STR R1,[R0] ;R1寄存器内容加载到R0寄存器存储的地址处
MAIN_LOOP: ;无限循环
B MAIN_LOOP
Mkaefile如下
led.bin:led.S
arm-linux-gcc -g -c -o led.o led.S
arm-linux-ld -Ttext 0x0000000 -g led.o -o led_elf
arm-linux-objcopy -O binary -S led_elf led.bin
arm-linux-objdump -D -m arm led_elf > led.dis
/*************************************************************************************
led.bin:led.S 表明led.bin文件依赖led.S文件
arm-linux-gcc -g -c -o led.o led.S 表示led.o依赖led.S文件生成
arm-linux-ld -Ttext 0x0000000 -g led.o -o led_elf 表示elf格式的文件通过led.o生成,Ttext指明链接生成的代码加载地址
arm-linux-objcopy -O binary -S led_elf led.bin表示把els格式的文件转化成bin文件
arm-linux-objdump -D -m arm led_elf > led.dis 表示生成反汇编代码
**************************************************************************************/
生成的反汇编代码如下
led_elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: e59f0014 ldr r0, [pc, #20] ; 1c <.text+0x1c>
4: e3a01c01 mov r1, #256 ; 0x100
8: e5801000 str r1, [r0]
c: e59f000c ldr r0, [pc, #12] ; 20 <.text+0x20>
10: e3a01000 mov r1, #0 ; 0x0
14: e5801000 str r1, [r0]
00000018 :
18: eafffffe b 18
1c: 56000050 undefined
20: 56000054 undefined
Disassembly of section .debug_aranges:
分析了一下代码,我编写的汇编代码里指定的地址,编译以后都给我存放到数据区了,在地址的0x1c和0x20处,这样的话,是通过寻址得到的一个地址,跟intel8086系列指令是有点不一样的,如果是8086系列的cpu,基本上这个地址数据直接就在代码段里面,不会放到数据段里面间接寻址得到。