1

gcc で -S フラグを使用して、メモリの使用方法をよりよく理解するために、C コードからアセンブリ ファイルを作成しました。メイン関数の上部からのアセンブリを次に示します。

main:
    mov r1, r4          ; FP = SP
    add #2, r4          ; FP += 2
    add #llo(-14), r1           ; SP -= 14 ?
    mov #llo(-16), r15          ; ???
    add r4, r15         ; r15 += FP
    add #4, r15

何が起こっているのかを分析しようとしたときに、コメントが寄せられました。私の質問は、#lloマクロの使用と、スタック上のメモリがどのように使用されているか、そして最後に何が r15 に入るのですか?

コンテキストについては、14 バイト (7 つの 16 ビット ワード) を占める main の先頭にあるスタックに配置される構造体を含む変数があります。私が理解していないのは、#lloマクロとは何か、r15 は何に使用されているのかということです。r4 がフレーム ポインターで、r1 がスタック ポインターであることはわかっています。

4

1 に答える 1

1

マクロは、そのllo引数の下位 16 ビットを返します。負の数を使用する場合(またはコンパイラが遅延している場合)、オーバーフローを回避するために必要だと思います。

コードが R15 のオブジェクトの位置を計算しているようです。コードの一部だけではわかりにくいです... また、関数で R4 をもっと使用しない場合、このコードは大幅に最適化される可能性があります。

この行add #llo(-14), r1は、スタックにスペースを割り当てます。

他のコンパイラがこのようなコードをどのように処理するかを見るのは興味深いでしょう (MSP430 の gcc は実際には最先端ではありません)。

于 2013-10-02T08:48:37.093 に答える