一.如何写位置无关码:
1.汇编指令中跳转用 b 、bl
2.C语言:不能有全局变量
1.bl指令
pc_new = pc + 偏移
.extern main
.text
.global _start
_start:
Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
//bl 是位置无关码,相当于 PCnew = PC +偏移
// PCnew = (4 + 8) + 0x28 = 0x34
bl clock_init @ 设置MPLL,改变FCLK、HCLK、PCLK
bl memsetup @ 设置存储控制器以使用SDRAM
bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中
ldr pc, =on_sdram @ 跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 @ 设置栈指针
ldr lr, =halt_loop @ 设置返回地址
ldr pc, =main @ 调用main函数
halt_loop:
b halt_loop
上面代码的反汇编如下
30000000 <_start>:
30000000:e3a0da01 movsp, #4096; 0x1000
30000004:eb00000a bl30000034
30000008:eb00000d bl30000044
3000000c:eb000026 bl300000ac
30000010:eb000040 bl30000118
30000014:e59ff00c ldrpc, [pc, #12]; 30000028 <.text>
30000018 :
30000018:e3a0d30d movsp, #872415232; 0x34000000
3000001c:e59fe008 ldrlr, [pc, #8]; 3000002c <.text>
30000020:e59ff008 ldrpc, [pc, #8]; 30000030 <.text>
30000024 :
30000024:eafffffe b30000024
30000028:30000018 andccr0, r0, r8, lsl r0
3000002c:30000024 andccr0, r0, r4, lsr #32
30000030:30000200 andccr0, r0, r0, lsl #4
30000034 :
30000034:e3a02000 movr2, #0; 0x0
30000038:e3a03453 movr3, #1392508928; 0x53000000
3000003c:e5832000 strr2, [r3]
30000040:e1a0f00e movpc, lr
30000044 :
30000044:e3a0c313 movip, #1275068416; 0x4c000000
30000048:e3a03003 movr3, #3; 0x3
3000004c:e52de004 strlr, [sp, #-4]!
30000050:e58c3014 strr3, [ip, #20]
30000054:ee111f10 mrc15, 0, r1, cr1, cr0, {0}
30000058:e3811103 orrr1, r1, #-1073741824; 0xc0000000
3000005c:ee011f10 mcr15, 0, r1, cr1, cr0, {0}
30000060:e3a0e456 movlr, #1442840576; 0x56000000
30000064:e59e20b0 ldrr2, [lr, #176]
30000068:e3a035c9 movr3, #843055104; 0x32400000
3000006c:e3a015c9 movr1, #843055104; 0x32400000
30000070:e2833801 addr3, r3, #65536; 0x10000
30000074:e2811801 addr1, r1, #65536; 0x10000
30000078:e3a00917 movr0, #376832; 0x5c000
3000007c:e1520003 cmpr2, r3
30000080:e2800040 addr0, r0, #64; 0x40
30000084:e2811002 addr1, r1, #2; 0x2
30000088:0a000005 beq300000a4
3000008c:e59e30b0 ldrr3, [lr, #176]
30000090:e3a02917 movr2, #376832; 0x5c000
30000094:e2822012 addr2, r2, #18; 0x12
30000098:e1530001 cmpr3, r1
3000009c:158c2004 strner2, [ip, #4]
300000a0:149df004 ldrnepc, [sp], #4
300000a4:e58c0004 strr0, [ip, #4]
300000a8:e49df004 ldrpc, [sp], #4
300000ac :
300000ac:e52de004 strlr, [sp, #-4]!
300000b0:e3a01422 movr1, #570425344; 0x22000000
300000b4:e3a0c723 movip, #9175040; 0x8c0000
300000b8:e2811a11 addr1, r1, #69632; 0x11000
300000bc:e3a03312 movr3, #1207959552; 0x48000000
300000c0:e3a02c07 movr2, #1792; 0x700
300000c4:e28cce4f addip, ip, #1264; 0x4f0
300000c8:e3a00906 movr0, #98304; 0x18000
300000cc:e2811e11 addr1, r1, #272; 0x110
300000d0:e2800005 addr0, r0, #5; 0x5
300000d4:e3a0e030 movlr, #48; 0x30
300000d8:e5831000 strr1, [r3]
300000dc:e28cc004 addip, ip, #4; 0x4
300000e0:e5832004 strr2, [r3, #4]
300000e4:e5832008 strr2, [r3, #8]
300000e8:e583200c strr2, [r3, #12]
300000ec:e5832010 strr2, [r3, #16]
300000f0:e5832014 strr2, [r3, #20]
300000f4:e5832018 strr2, [r3, #24]
300000f8:e3a020b1 movr2, #177; 0xb1
300000fc:e583001c strr0, [r3, #28]
30000100:e5830020 strr0, [r3, #32]
30000104:e583c024 strip, [r3, #36]
30000108:e5832028 strr2, [r3, #40]
3000010c:e583e02c strlr, [r3, #44]
30000110:e583e030 strlr, [r3, #48]
30000114:e49df004 ldrpc, [sp], #4
30000118 :
30000118:e3a00eff movr0, #4080; 0xff0
3000011c:e280000f addr0, r0, #15; 0xf
30000120:e3a02000 movr2, #0; 0x0
30000124:e3a01203 movr1, #805306368; 0x30000000
30000128:e4923004 ldrr3, [r2], #4
3000012c:e1520000 cmpr2, r0
30000130:e4813004 strr3, [r1], #4
30000134:9afffffb bls30000128
30000138:e1a0f00e movpc, lr
3000013c :
3000013c:e3a01456 movr1, #1442840576; 0x56000000
30000140:e5913070 ldrr3, [r1, #112]
30000144:e38330a0 orrr3, r3, #160; 0xa0
30000148:e5813070 strr3, [r1, #112]
3000014c:e3a0c205 movip, #1342177280; 0x50000000
30000150:e3a0200c movr2, #12; 0xc
30000154:e3a03003 movr3, #3; 0x3
30000158:e3a00000 movr0, #0; 0x0
3000015c:e5812078 strr2, [r1, #120]
30000160:e242224b subr2, r2, #-1342177276; 0xb0000004
30000164:e3a01005 movr1, #5; 0x5
30000168:e58c3000 strr3, [ip]
3000016c:e2833215 addr3, r3, #1342177281; 0x50000001
30000170:e4831008 strr1, [r3], #8
30000174:e5820000 strr0, [r2]
30000178:e3a0201a movr2, #26; 0x1a
3000017c:e5830000 strr0, [r3]
30000180:e58c2028 strr2, [ip, #40]
30000184:e1a0f00e movpc, lr
30000188 :
30000188:e20000ff andr0, r0, #255; 0xff
3000018c:e3a02205 movr2, #1342177280; 0x50000000
30000190:e5923010 ldrr3, [r2, #16]
30000194:e3130004 tstr3, #4; 0x4
30000198:0afffffc beq30000190
3000019c:e5c20020 strbr0, [r2, #32]
300001a0:e1a0f00e movpc, lr
300001a4 :
300001a4:e3a02205 movr2, #1342177280; 0x50000000
300001a8:e5923010 ldrr3, [r2, #16]
300001ac:e3130001 tstr3, #1; 0x1
300001b0:0afffffc beq300001a8
300001b4:e5d20024 ldrbr0, [r2, #36]
300001b8:e1a0f00e movpc, lr
300001bc :
300001bc:e2400030 subr0, r0, #48; 0x30
300001c0:e20000ff andr0, r0, #255; 0xff
300001c4:e3500009 cmpr0, #9; 0x9
300001c8:83a00000 movhir0, #0; 0x0
300001cc:93a00001 movlsr0, #1; 0x1
300001d0:e1a0f00e movpc, lr
300001d4 :
300001d4:e20000ff andr0, r0, #255; 0xff
300001d8:e2403061 subr3, r0, #97; 0x61
300001dc:e3530019 cmpr3, #25; 0x19
300001e0:e2400041 subr0, r0, #65; 0x41
300001e4:e3a03001 movr3, #1; 0x1
300001e8:9a000002 bls300001f8
300001ec:e3500019 cmpr0, #25; 0x19
300001f0:83a03000 movhir3, #0; 0x0
300001f4:93a03001 movlsr3, #1; 0x1
300001f8:e1a00003 movr0, r3
300001fc:e1a0f00e movpc, lr
30000200 :
30000200:e92d4010 stmdbsp!, {r4, lr}
30000204:ebffffcc bl3000013c
30000208:ea000002 b30000218
3000020c:e2840001 addr0, r4, #1; 0x1
30000210:e20000ff andr0, r0, #255; 0xff
30000214:ebffffdb bl30000188
30000218:ebffffe1 bl300001a4
3000021c:e20040ff andr4, r0, #255; 0xff
30000220:e1a00004 movr0, r4
30000224:ebffffe4 bl300001bc
30000228:e3500000 cmpr0, #0; 0x0
3000022c:e1a00004 movr0, r4
30000230:1afffff5 bne3000020c
30000234:ebffffe6 bl300001d4
30000238:e3500000 cmpr0, #0; 0x0
3000023c:0afffff5 beq30000218
30000240:eafffff1 b3000020c
Disassembly of section .comment:
00000000 <.comment>:
0:43434700 cmpmir3, #0; 0x0
4:4728203a undefined
8:2029554e eorcsr5, r9, lr, asr #10
c:2e342e33 mrccs14, 1, r2, cr4, cr3, {1}
10:47000035 smladxmir0, r5, r0, r0
14:203a4343 eorcssr4, sl, r3, asr #6
18:554e4728 strplbr4, [lr, #-1832]
1c:2e332029 cdpcs0, 3, cr2, cr3, cr9, {1}
20:00352e34 eoreqsr2, r5, r4, lsr lr
24:43434700 cmpmir3, #0; 0x0
28:4728203a undefined
2c:2029554e eorcsr5, r9, lr, asr #10
30:2e342e33 mrccs14, 1, r2, cr4, cr3, {1}
34:Address 0x34 is out of bounds.eb00000a
1110 101 1 a
偏移地址 = a 左移2位 = 0xa * 4 = 0x28
disable_watch_dog = 30000000 + 8 +偏移地址 = 30000034