嵌入式linux编程arm初步接触之汇编、Makefile

2019-07-13 04:13发布

    近日,买了一块韦东山的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,基本上这个地址数据直接就在代码段里面,不会放到数据段里面间接寻址得到。