このことについての説明はありません。このようなコードを書いてbar
と呼ぶとどうなりますか?否定的な結果はありますか?ARMアセンブリのプロシージャ(PROC/ENDP)の外部に分岐することはできますか?
foo PROC
...
BX lr
ENDP
bar PROC
B foo
ENDP
UPDATE
Techicallyそのようなことを行うために、完全に合法です。コードはコンパイルされ、正しく動作します。いくつかの人々が気づいたように、PROC
ディレクティブは、オブジェクトファイル内のいくつかのメタ情報に必要です。私はそのような方法で(上記の例のように)それを使用することによって、私は潜在的に未知の結果でこの情報に「ダメージを与える」ことができるのではないかと恐れています。
このディレクティブの説明は
アセンブラはELFのためのDWARFコールフレーム情報を生成するときに、関数の開始を識別するために、PROCを使用していることを言います。 PROCは、カノニカルフレームアドレスをR13(SP)に設定し、フレームステートスタックを空に設定します。
私はデバッガの仕組みが良くありませんが、私が間違っていないのであれば、コールフレームはスタックに関連するものを意味します。私の機能でスタックを使用しないので、私はこの情報が私にとって重要ではないという結論を下すことができます。私は正しい?
使用しているチップアーキテクチャとアセンブラは何ですか? –
否定的な結果はありますか?あなたがこのようにプログラムするなら、あなたは混乱した混乱に終わるでしょう。 –
'bar'のCバージョンが' void bar(){foo();}だったらこれはいいでしょう。 ''(つまり、 'bar'は' foo'の呼び出しで終わります。したがって 'foo'は' bar'に戻り、 'bar'を呼び出し元に返すのではなく' bar'を呼び出した人に戻ります。さもなければ、これをしないでください。 – Michael