ところで、上記のコメントに関して、ARM 呼び出し標準は Thumb と同じです。( AAPCS Arm 呼び出し標準) を参照してください。命令セットは異なりますが、CPU レジスタ セットは異なります。
コメントで質問したいのですが、まだ十分なポイントがありません。それを念頭に置いて....
バイナリのビルドと実行は成功していますが、何らかのコール トレースをダンプしようとしていますか? 私の混乱は、「フレーム ポインター レジスターなし」ステートメントです。r13 はスタック フレーム ポインターです。ただし、フレームポインタの保存について言及していると思います。
しばらく経ちましたが、これらは私が使用したオプションだと思います
arm-none-eabi-gcc - -nostdlib -ggdb -mthumb -mcpu=cortex-m3 -mtpcs-frame -mtpcs-leaf-frame myfile.c
これは、linaro からダウンロードした gcc-arm-none にありました。
gdb は、Atmel SAM3X でこれらのオプションを使用してバックトレースを実行できました。Thumb ABI は ARM EABI と同じか、少なくとも objdump -D を介してアセンブラを見ているようです。
-fno-omit-frame-pointer が指定されている (または暗示されている) 場合、前のフレーム ポインターは r7 に格納されます。
void test2(int i) {}
void main() { test(0);
-fomit-frame-pointer でコンパイル
00008000 <test2>:
8000: b082 sub sp, #8
8002: 9001 str r0, [sp, #4]
8004: b002 add sp, #8
8006: 4770 bx lr
00008008 <main>:
8008: b508 push {r3, lr}
800a: f04f 0000 mov.w r0, #0
800e: f7ff fff7 bl 8000 <test2>
8012: bd08 pop {r3, pc}
-fno-omit-frame-pointer でコンパイル
00008000 <test2>:
8000: b480 push {r7}
8002: b083 sub sp, #12
8004: af00 add r7, sp, #0
8006: 6078 str r0, [r7, #4]
8008: f107 070c add.w r7, r7, #12
800c: 46bd mov sp, r7
800e: bc80 pop {r7}
8010: 4770 bx lr
8012: bf00 nop
00008014 <main>:
8014: b580 push {r7, lr}
8016: af00 add r7, sp, #0
8018: f04f 0000 mov.w r0, #0
801c: f7ff fff0 bl 8000 <test2>
8020: bd80 pop {r7, pc}
8022: bf00 nop
したがって、r7 を使用して前のスタック フレームに移動し、その場所から次の r7 を取得します。