我正在尝试调试一个汇编语言编写的函数Reset_Handler()
(我不理解,但是这是标准库的一部分)。使用GDB,我使用ni
逐个执行每个指令。以下是结果:
(gdb) ni
0x08005dc4 in Reset_Handler ()
(gdb) ni
0x08005dc6 in Reset_Handler ()
(gdb) ni
0x08005dc6 in Reset_Handler ()
(gdb) ni
0x08005dc6 in Reset_Handler ()
(gdb) ni
0x08005dc6 in Reset_Handler ()
实际上,程序指针停留在
0x08005dc6
。这是正常的行为吗?每次执行ni
时,程序指针是否应该前进?下面是Reset_Handler()
的开头: .section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
CopyDataInit:
ldr r3, =_sidata
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4
LoopCopyDataInit:
ldr r0, =_sdata
ldr r3, =_edata
adds r2, r0, r1
cmp r2, r3
bcc CopyDataInit
ldr r2, =_sbss
b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
movs r3, #0
str r3, [r2], #4
编辑: 这里是反汇编指令:
disas
Dump of assembler code for function Reset_Handler:
0x08005dc0 <+0>: movs r1, #0
0x08005dc2 <+2>: b.n 0x8005dcc <LoopCopyDataInit>
0x08005dc4 <+4>: ldr r3, [pc, #40] ; (0x8005df0 <LoopFillZerobss+16>)
=> 0x08005dc6 <+6>: ldr r3, [r3, r1]
0x08005dc8 <+8>: str r3, [r0, r1]
0x08005dca <+10>: adds r1, #4
0x08005dcc <+0>: ldr r0, [pc, #36] ; (0x8005df4 <LoopFillZerobss+20>)
0x08005dce <+2>: ldr r3, [pc, #40] ; (0x8005df8 <LoopFillZerobss+24>)
0x08005dd0 <+4>: adds r2, r0, r1
0x08005dd2 <+6>: cmp r2, r3
0x08005dd4 <+8>: bcc.n 0x8005dc4 <Reset_Handler+4>
0x08005dd6 <+10>: ldr r2, [pc, #36] ; (0x8005dfc <LoopFillZerobss+28>)
0x08005dd8 <+12>: b.n 0x8005de0 <LoopFillZerobss>
0x08005dda <+0>: movs r3, #0
0x08005ddc <+2>: str.w r3, [r2], #4
0x08005de0 <+0>: ldr r3, [pc, #28] ; (0x8005e00 <LoopFillZerobss+32>)
0x08005de2 <+2>: cmp r2, r3
0x08005de4 <+4>: bcc.n 0x8005dda <FillZerobss>
0x08005de6 <+6>: bl 0x8005c64 <SystemInit>
0x08005dea <+10>: bl 0x8000184 <main>
0x08005dee <+14>: bx lr
End of assembler dump.