gq arm汇编

常用的交叉编译工具使用实例:

现有文件:源文件led.S及连接器脚本文件led.lds

i、arm-linux-gcc -g -c led.S -o led.o

-g选项告诉编译器添加调试用的信息。

-c告诉编译器只编译生成.o文件为止

ii、arm-linux-ld -Tled.lds -o led.elf led.o

-Tled.lds:链接器脚本文件选项

iii、arm-linux-readelf  -a led.elf

     arm-linux-readelf  -d led.elf

-a:显示出全部信息

-d:dynamically linked libs查看库

 

iv、arm-linux-objdump -D -S led >dump

将反汇编之后的文件保存在一个名为dump的文件中,建议在反汇编之前的编译时生成调试信息,即加入-g选项。

 

v、arm-linux-objcopy -O binary led.elf led.bin

将生成的。elf文件转换成.bin文件,因为只有二进制文件才能在我们的目标机上运行。

 

2、上述一整套流程,可以用以个makefile来写:

eg:

led.bin:led.elf

[TAB] arm-linux-objcopy -O binary led.elf led.bin

led.elf:led.o led.lds

[TAB]arm-linux-ld -Tled.lds -o led.elf led.o

led.o:led.S

[TAB]arm-linux-gcc -g -c led.S -o led.o

clean:

[TAB]rm led.bin led.elf led.o

 

一定要注意格式,命令前面不能用空格,用的是换行TAB键。



相关命令,交叉工具链

arm-linux-gcc -g -c led.S
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
elf转化为二进制文件


Makefile文件
[xpz@bogon led]$ cat Makefile 
all: led.o 
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin

led.o : led.S
arm-linux-gcc -g -o led.o -c led.S

.PHONY: clean
clean:
rm *.o led.elf led.bin




烧写到板子
norflash启动,格式化nandflash   
format NAND FLASH for Linux


./dnw ./led/led.bin 30008000
拨到nandflash,启动




链接器脚本
链接器脚本-段
一个可执行程序通常是由:代码段,数
据段,bss段构成的。同样,在用于
链接这个程序的链接器脚本中,就会

反应出这几个段的信息


链接器脚本文件的组成:

基本构成:段:代码段.text     数据段.data    bss段 .bss

起始链接地址

对齐

变量

代码段首文件

 

2、实例文件:

SECTIONS{

     . = 0x0;  //设置程序起始链接地址,=左右两边要空格

     . = ALIGN(4);//,设置代码段四字节对齐,=左右两边要空格

     .text ://冒号前要空格

      {

      start.o(.text)//设置代码段首文件,CPU一上电就开始执行。

      *(.text)

      }

 

     . = ALIGN(4);//设置数据段四字节对齐,等号左右要空格

     .data ://冒号钱要空格

      {

      *(.data)

      }

 

     . = ALIGN(4);//设置bss段四字节对齐,等号左右要空格

     bss_start = .;//自定义变量bss_start,用于记录bss段起始地址,等号左右要空格

     .bss :

      {

      *(.bss)

      }

     bss_end = .;//自定义变量bss_end,用于记录bss段结束地址,等号左右要空格

}

}




arm-linux-objdump -D -S led.elf >dump.txt


SECTIONS {
. = 0x30008000;

. = ALIGN(4);
.text :
{
led.o (.text)
*(.text)
}


. = ALIGN(4);
.rodata : {*(.rodata)}


. = ALIGN(4);
.data : {*(.data)}

. = ALIGN(4);
bss_start = .;
.bss : {*(.bss) *(COMMON)}
bss_end = .;
}




反汇编
[root@bogon d1]# arm-linux-objdump -D -S start.elf 


start.elf:     file format elf32-littlearm




Disassembly of section .text:


30000000 <_start>:
.text
.global _start
_start:
mov r1,#8
30000000: e3a01008 mov r1, #8
1110 00 1 1101 0000 0000 1000000001000


mov r2,r1
30000004: e1a02001 mov r2, r1
mov r3,#10
30000008: e3a0300a mov r3, #10


Disassembly of section .ARM.attributes:


00000000 <.ARM.attributes>:
   0: 00001941 andeq r1, r0, r1, asr #18
   4: 61656100 cmnvs r5, r0, lsl #2
   8: 01006962 tsteq r0, r2, ror #18
   c: 0000000f andeq r0, r0, pc
  10: 00543405 subseq r3, r4, r5, lsl #8
  14: 01080206 tsteq r8, r6, lsl #4
  18: Address 0x00000018 is out of bounds.




Disassembly of section .debug_aranges:


00000000 <.debug_aranges>:
   0: 0000001c andeq r0, r0, ip, lsl r0
   4: 00000002 andeq r0, r0, r2
   8: 00040000 andeq r0, r4, r0
   c: 00000000 andeq r0, r0, r0
  10: 30000000 andcc r0, r0, r0
  14: 0000000c andeq r0, r0, ip
...


Disassembly of section .debug_info:


00000000 <.debug_info>:
   0: 0000003c andeq r0, r0, ip, lsr r0
   4: 00000002 andeq r0, r0, r2
   8: 01040000 tsteq r4, r0
   c: 00000000 andeq r0, r0, r0
  10: 30000000 andcc r0, r0, r0
  14: 3000000c andcc r0, r0, ip
  18: 72617473 rsbvc r7, r1, #1929379840 ; 0x73000000
  1c: 00532e74 subseq r2, r3, r4, ror lr
  20: 6f6f722f svcvs 0x006f722f
  24: 72612f74 rsbvc r2, r1, #464 ; 0x1d0
  28: 65642f6d strbvs r2, [r4, #-3949]! ; 0xf6d
  2c: 642f6f6d strtvs r6, [pc], #3949 ; 34 <_start-0x2fffffcc>
  30: 4e470031 mcrmi 0, 2, r0, cr7, cr1, {1}
  34: 53412055 movtpl r2, #4181 ; 0x1055
  38: 322e3220 eorcc r3, lr, #2
  3c: 80010030 andhi r0, r1, r0, lsr r0


Disassembly of section .debug_abbrev:


00000000 <.debug_abbrev>:
   0: 10001101 andne r1, r0, r1, lsl #2
   4: 12011106 andne r1, r1, #-2147483647 ; 0x80000001
   8: 1b080301 blne 200c14 <_start-0x2fdff3ec>
   c: 13082508 movwne r2, #34056 ; 0x8508
  10: 00000005 andeq r0, r0, r5


Disassembly of section .debug_line:


00000000 <.debug_line>:
   0: 00000033 andeq r0, r0, r3, lsr r0
   4: 001e0002 andseq r0, lr, r2
   8: 01020000 tsteq r2, r0
   c: 000d0efb strdeq r0, [sp], -fp
  10: 01010101 tsteq r1, r1, lsl #2
  14: 01000000 tsteq r0, r0
  18: 00010000 andeq r0, r1, r0
  1c: 72617473 rsbvc r7, r1, #1929379840 ; 0x73000000
  20: 00532e74 subseq r2, r3, r4, ror lr
  24: 00000000 andeq r0, r0, r0
  28: 00020500 andeq r0, r2, r0, lsl #10
  2c: 15300000 ldrne r0, [r0]!
  30: 02022f2f andeq r2, r2, #188 ; 0xbc
  34: Address 0x00000034 is out of bounds.


[root@bogon d1]# 




mov r1,#0xff    //只能8位,超过8位用ldr
ldr r1,=0x1ff


mov r1,#0xff
30000000: e3a010ff mov r1, #255 ; 0xff
ldr r1,=0x1ff
30000004: e51f1004 ldr r1, [pc, #-4] ; 30000008 <_start+0x8>
30000008: 000001ff strdeq r0, [r0], -pc


协处理器用于执行特定的处理任务,如:
数学协处理器可以控制数字处理,以减轻
处理器的负担。ARM可支持多达16个协处
理器,其中CP15是最重要的一个。
mrc p15,0,r0,c0,c0,0

你可能感兴趣的:(gq arm汇编)