《朱老师物联网大讲堂》学习笔记
学习网站:www.zhulaoshi.org
objdump是我们进行反汇编的工具
还记得Makefile文件吗?
led.bin: start.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
下载烧录执行的bin文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是连接的时候ld给指定的(ld根据我们写的链接脚本来指定)
arm-linux-objcopy -O binary led.elf led.bin
从可执行文件到可烧录的镜像文件
arm-linux-objdump -D led.elf > led_elf.dis
做反汇编的
gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkx210 -f
这里我们关注的是这一句
arm-linux-objdump -D led.elf > led_elf.dis
这里使用的是gcc工具中的反汇编
由编译链接好的elf格式的可执行程序来反过来得到汇编源代码
-D表示反汇编,由此可见这个工具还有其它功能
> 左边的是elf格式的可执行程序,也就是反汇编时候的原材料,右边的是反汇编生成的反汇编程序
led.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: e59f006c ldr r0, [pc, #108] ; 74
4: e59f106c ldr r1, [pc, #108] ; 78
8: e5810000 str r0, [r1]
0000000c :
c: e3a00030 mov r0, #48 ; 0x30
10: e59f1064 ldr r1, [pc, #100] ; 7c
14: e5810000 str r0, [r1]
18: eb00000f bl 5c
1c: e3a00028 mov r0, #40 ; 0x28
20: e59f1054 ldr r1, [pc, #84] ; 7c
24: e5810000 str r0, [r1]
28: eb00000b bl 5c
2c: e3a00018 mov r0, #24
30: e59f1044 ldr r1, [pc, #68] ; 7c
34: e5810000 str r0, [r1]
38: eb000007 bl 5c
3c: e3a00028 mov r0, #40 ; 0x28
40: e59f1034 ldr r1, [pc, #52] ; 7c
44: e5810000 str r0, [r1]
48: eb000003 bl 5c
4c: e3a00030 mov r0, #48 ; 0x30
50: e59f1024 ldr r1, [pc, #36] ; 7c
54: e5810000 str r0, [r1]
58: ebffffeb bl c
0000005c :
5c: e59f201c ldr r2, [pc, #28] ; 80
60: e3a03000 mov r3, #0
00000064 :
64: e2422001 sub r2, r2, #1
68: e1520003 cmp r2, r3
6c: 1afffffc bne 64
70: e1a0f00e mov pc, lr
74: 11111111 tstne r1, r1, lsl r1
78: e0200240 eor r0, r0, r0, asr #4
7c: e0200244 eor r0, r0, r4, asr #4
80: 00989680 addseq r9, r8, r0, lsl #13
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0: 00001a41 andeq r1, r0, r1, asr #20
4: 61656100 cmnvs r5, r0, lsl #2
8: 01006962 tsteq r0, r2, ror #18
c: 00000010 andeq r0, r0, r0, lsl r0
10: 45543505 ldrbmi r3, [r4, #-1285] ; 0x505
14: 08040600 stmdaeq r4, {r9, sl}
18: Address 0x00000018 is out of bounds.
反汇编的原因有以下
1.逆向破解
2.我们在调试程序时侯,反汇编代码可以帮助我们理解程序
3.把c源代码编译链接生成的可执行程序,反汇编后得到对应汇编代码,可以帮助
我们理解c语言和汇编语言之间的对应关系,非常有助于深入理解c语言
尤其是在理解链接脚本,链接地址,时候帮助非常大
扩展:ARM汇编中用地址池方式来实现非法立即数
下面是上面反汇编代码的汇编代码
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
.global _start
_start:
ldr r0, =0x11111111
ldr r1, =GPJ0CON
str r0, [r1]
flash:
ldr r0, =( (0<<3) | (1<<4) | (1<<5) )
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
ldr r0, =( (1<<3) | (0<<4) | (1<<5) )
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
ldr r0, =( (1<<3) | (1<<4) | (0<<5) )
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
ldr r0, =( (1<<3) | (0<<4) | (1<<5) )
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
ldr r0, =( (0<<3) | (1<<4) | (1<<5) )
ldr r1, =GPJ0DAT
str r0, [r1]
bl flash
delay:
ldr r2, =10000000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1
cmp r2, r3
bne delay_loop
mov pc, lr
展望:反汇编工具帮助我们分析链接脚本
反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址。
但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。