アセンブラで書かれた関数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
EDIT:ここでは逆アセンブルされた命令である:
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.
スタックポインタまたはプログラムカウンタ? 0x08005dc6には何がありますか? RAMのような匂い。自動表示がスタックポインタの場合は、プログラムカウンタとディスアセンブル命令に変更してください。コントロールが典型的なデフォルトのアボートハンドラに転送された場合、そのハンドラは通常は単純な「自分自身へのジャンプ」ループであるため、SPは変更されません。 –
@MartinJames:申し訳ありませんが、それはプログラムカウンタです。 – Randomblue
Hmmm。r3を読み込んでもエキサイティングなことはありません:(実際にあなたが見ているのは、実際にあなたが思うものですか?私は間違ったバージョンのソースファイル、マップファイル –