您在这里有两个主要问题:
1) 固件的开始是数据(中断向量表),而不是代码
2) Cortex-M 使用 Thumb 模式指令而不是经典的 ARM。
通常,当您将 ARM 二进制文件加载到 IDA 中时,您会收到以下消息:
---------------------------
Information
---------------------------
ARM AND THUMB MODE SWITCH INSTRUCTIONS
This processor has two instruction encodings: ARM and THUMB.
IDA allows to specify the encoding mode for every single instruction.
For this IDA uses a virtual register T. If its value is zero, then
the ARM mode is used, otherwise the THUMB mode is used.
You can change the value of the register T using
the 'change segment register value' command
(the canonical hotkey is Alt-G)
---------------------------
OK
---------------------------
在您的情况下,整个文件都是 Thumb,因此您可以在顶部将 T 设置为 1。然后您需要按照第二个双字(重置向量)找到初始入口点。理想情况下,你应该得到类似的东西:
ROM:00000000 DCD 0x200002F8
ROM:00000004 DCD _reset+1
ROM:00001480 _reset
ROM:00001480 BIC.W R1, SP, #7
ROM:00001484 MOV R0, SP
ROM:00001486 MOV SP, R1
ROM:00001488 PUSH {R0,LR}
ROM:0000148A MOVS R2, #0
ROM:0000148C LDR R1, =0x20000000
ROM:0000148E LDR.W R12, =0x20000000
ROM:00001492 LDR R0, =0x2440
ROM:00001494 B loc_149C
ROM:00001496 ----------------------------
ROM:00001496 LDR R3, [R0,R2]
ROM:00001498 STR R3, [R1,R2]
ROM:0000149A ADDS R2, #4
ROM:0000149C
ROM:0000149C ADD.W R3, R1, R2
ROM:000014A0 CMP R3, R12
ROM:000014A2 BCC loc_1496
ROM:000014A4 LDR R3, =0x20000000
ROM:000014A6 LDR R1, =0x200001F8
ROM:000014A8 MOVS R2, #0
ROM:000014AA B loc_14B0
ROM:000014AC ----------------------------
ROM:000014AC
ROM:000014AC STR.W R2, [R3],#4
ROM:000014B0
ROM:000014B0 CMP R3, R1
ROM:000014B2 BCC loc_14AC
ROM:000014B4 BL sub_244
ROM:000014B4 ; End of function _reset