c 语言 位置无关,位置无关码

一.如何写位置无关码:

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

6dd5509cb5ea

1110             101     1                 a

偏移地址 =  a 左移2位 = 0xa * 4  = 0x28

disable_watch_dog  =  30000000 + 8 +偏移地址 = 30000034

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值