ヨアヒムあなたは、スタックポインタをベクタテーブルの最初のエントリが欠落している指摘したように、私は多くの親指とのCortex-Mベースの例http://github.com/dwelch67
を持っています。 cortex-mにはアームと同じベクタテーブルがありません。つまり、アーム命令でアームモードで起動します。あなたがその最初の単語の場所あなたは確かに一度設定スタックポインタを実行することができます
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start /* 1 Reset */
.word hang /* 2 NMI */
.word hang /* 3 HardFault */
.word hang /* 4 MemManage */
にスタックポインタの開始値を置くことによって、セットアップスタックをすることができ皮質-mに対して、しかし答えを完了するために、
アームモードまたは他のほとんどのプロセッサーでアームを使用する場合と同じように手動で行います。
コードを無限ループに入れて、書かれているように、定義されていない命令などに陥らないようにする(0xFFsでなければならない、cortex-m0では-m3またはarmv7 thumb2をサポートする-m4は実際の命令かもしれません)。
私はベクターで+1を使用しなかったことに注目してください。あなたはあなたのツールを知る必要があります。あなたは、ブランチ上にサムアドレス/サムモードを示すためにlsbitを設定する必要があります。私はその上の教訓を学んだが、あなたはディレクティブを置けば、GNUアセンブラで
Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function
(その質問を見つける必要があります)。ラベルの前にthumb_funcを付けると、そのラベルはサムラベルとしてマークされ、gnuツールはアドレス| 1を使用します。
.thumb_func
.globl _start
_start:
あなたは適切なアドレスを使用していることを確認してテーブルが構築されている正しく枝と、そのような作るために今、もう一度、すべてを構築し、分解する必要があります。
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000050 andeq r0, r0, r0, asr r0
c: 00000050 andeq r0, r0, r0, asr r0
10: 00000050 andeq r0, r0, r0, asr r0
は、それが(例で使用していない割り込み、それは私が知らないと離れて得た方法であるので)リセットが、何もしないことはありません...どうやら私は私の例のいずれかのバグを持って、参照してください。忘れてしまった.thumb_func
hang: b .
は
にコードを変更し、
.thumb_func
hang: b .
とベクタテーブルへ
00000050 <hang>:
50: e7fe b.n 50 <hang>
変更が
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
14: 00000051 andeq r0, r0, r1, asr r0
になり、これは興味深いです生産しました
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start+1 /* 1 Reset */
.word hang+1 /* 2 NMI */
.word hang+1 /* 3 HardFault */
.word hang /* 4 MemManage */
.word hang /* 5 BusFault */
それは本当にプラス1を実行するのではなく、代わりに1つを実行します。
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
これは少し混乱しています。 2つ目は、ベクタテーブルにスタックポインタを設定し、2番目に新しいプロジェクトを開始するときに逆アセンブルし、ベクタテーブルを調べて、期待していることを確認します。あなたが思っていることをやっていないなら、Esp。
http://github.com/dwelch67には一般的な例で多くのcortex-mとthumbがあります。このような単純なプログラムでは、追加ハングアップ後に無限ループを入れます:b hang、それのようなものです。 –