初级会员

- 积分
- 93
- 金钱
- 93
- 注册时间
- 2019-5-24
- 在线时间
- 21 小时
|
5金钱
在https://blog.csdn.net/wheat_in_winner/article/details/53583462这篇博文中出现的__scatterload_rt2函数,__scatterload_cpy函数,__scatterload_zeroinit函数,在我mdk5的中的反汇编中只有__scatterload和__rt_entry。是编译器或者编译器版本不一样?懂的大牛麻烦指点下,谢谢!以下是我项目中的启动汇编进Main之前的代码段。
- 0x08000130 F000F802 BL.W __scatterload (0x08000138)
- 0x08000134 F000F84A BL.W __rt_entry (0x080001CC)
- 0x08000138 A00A ADR r0,{pc}+0x2C ; @0x08000164
- 0x0800013A E8900C00 LDM r0,{r10-r11}
- 0x0800013E 4482 ADD r10,r10,r0
- 0x08000140 4483 ADD r11,r11,r0
- 0x08000142 F1AA0701 SUB r7,r10,#0x01
- 0x08000146 45DA CMP r10,r11
- 0x08000148 D101 BNE 0x0800014E
- 0x0800014A F000F83F BL.W __rt_entry (0x080001CC)
- 0x0800014E F2AF0E09 ADR.W lr,{pc}-0x07 ; @0x08000147
- 0x08000152 E8BA000F LDM r10!,{r0-r3}
- 0x08000156 F0130F01 TST r3,#0x01
- 0x0800015A BF18 IT NE
- 0x0800015C 1AFB SUBNE r3,r7,r3
- 0x0800015E F0430301 ORR r3,r3,#0x01
- 0x08000162 4718 BX r3
- 0x08000164 02D4 DCW 0x02D4
- 0x08000166 0000 DCW 0x0000
- 0x08000168 02F4 DCW 0x02F4
- 0x0800016A 0000 DCW 0x0000
- 0x0800016C 440A ADD r2,r2,r1
- 0x0800016E F8104B01 LDRB r4,[r0],#0x01
- 0x08000172 F014050F ANDS r5,r4,#0x0F
- 0x08000176 BF08 IT EQ
- 0x08000178 F8105B01 LDRBEQ r5,[r0],#0x01
- 0x0800017C 0924 LSRS r4,r4,#4
- 0x0800017E BF08 IT EQ
- 0x08000180 F8104B01 LDRBEQ r4,[r0],#0x01
- 0x08000184 1E6D SUBS r5,r5,#1
- 0x08000186 D005 BEQ 0x08000194
- 0x08000188 F8103B01 LDRB r3,[r0],#0x01
- 0x0800018C 1E6D SUBS r5,r5,#1
- 0x0800018E F8013B01 STRB r3,[r1],#0x01
- 0x08000192 D1F9 BNE 0x08000188
- 0x08000194 1E64 SUBS r4,r4,#1
- 0x08000196 D003 BEQ 0x080001A0
- 0x08000198 1E64 SUBS r4,r4,#1
- 0x0800019A F8015B01 STRB r5,[r1],#0x01
- 0x0800019E D1FB BNE 0x08000198
- 0x080001A0 4291 CMP r1,r2
- 0x080001A2 D3E4 BCC 0x0800016E
- 0x080001A4 4770 BX lr
- 0x080001A6 0000 MOVS r0,r0
- 0x080001A8 2300 MOVS r3,#0x00
- 0x080001AA 2400 MOVS r4,#0x00
- 0x080001AC 2500 MOVS r5,#0x00
- 0x080001AE 2600 MOVS r6,#0x00
- 0x080001B0 3A10 SUBS r2,r2,#0x10
- 0x080001B2 BF28 IT CS
- 0x080001B4 C178 STMCS r1!,{r3-r6}
- 0x080001B6 D8FB BHI 0x080001B0
- 0x080001B8 0752 LSLS r2,r2,#29
- 0x080001BA BF28 IT CS
- 0x080001BC C130 STMCS r1!,{r4-r5}
- 0x080001BE BF48 IT MI
- 0x080001C0 600B STRMI r3,[r1,#0x00]
- 0x080001C2 4770 BX lr
- __rt_lib_init:
- 0x080001C4 B51F PUSH {r0-r4,lr}
- __rt_lib_init_alloca_1:
- 0x080001C6 BD1F POP {r0-r4,pc}
- __rt_lib_shutdown:
- 0x080001C8 B510 PUSH {r4,lr}
- __rt_lib_shutdown_cpp_1:
- 0x080001CA BD10 POP {r4,pc}
- __rt_entry:
- 0x080001CC F000F831 BL.W __user_setup_stackheap (0x08000232)
- 0x080001D0 4611 MOV r1,r2
- __rt_entry_li:
- 0x080001D2 F7FFFFF7 BL.W __rt_lib_init (0x080001C4)
- __rt_entry_main:
- 0x080001D6 F000F90B BL.W main (0x080003F0)
- 0x080001DA F000F84F BL.W exit (0x0800027C)
- __rt_exit:
- 0x080001DE B403 PUSH {r0-r1}
- __rt_exit_ls:
- 0x080001E0 F7FFFFF2 BL.W __rt_lib_shutdown (0x080001C8)
- __rt_exit_exit:
- 0x080001E4 BC03 POP {r0-r1}
- 0x080001E6 F000F857 BL.W _sys_exit (0x08000298)
- 0x080001EA 0000 MOVS r0,r0
- 151: LDR R0, =SystemInit
- 0x080001EC 4809 LDR r0,[pc,#36] ; @0x08000214
- 152: BLX R0
- 0x080001EE 4780 BLX r0
- 153: LDR R0, =__main
- 0x080001F0 4809 LDR r0,[pc,#36] ; @0x08000218
复制代码
|
最佳答案
查看完整内容[请看2#楼]
这个东西属于arm编译器的私货,如果你有兴趣,可以了解一个叫做CRT的概念,以GNU的glibc为例子,glibc负责main函数之前的初始化工作。main之前会调用一个叫 _start 的函数,对程序段进行初始化,比如用0填充.bss段什么的(arm对应的是ZI段)。具体的代码可以看看crt0.o/crt1.o中的代码,希望对你有帮助
|