マシンの命令とプログラムに関する本を読んでいるうちに、アセンブラがソースプログラム全体を2回スキャンするという特定の点が出てきました。 1回目のパス/スキャン中にシンボルテーブルを作成し、2回目のスキャン中にシンボルテーブルをプログラムに関連付けます。アセンブラは、関数に対して同様の方法でアドレスを提供する必要があります。
アセンブラはプログラムを2回通過するので、関数を宣言する必要があるのはなぜですか?アセンブラは1回目のパスから関数のアドレスを指定し、2回目のパスでプログラムと相関させませんか? この場合、Cプログラミングを検討しています。プログラムのアセンブルと実行 - 2パスアセンブラ
0
A
答えて
1
簡単な答えは、C言語ではコンパイラが一回の処理で処理するように設計されているため、Cプログラムでは関数を宣言する必要があるということです。アセンブラや関数のアドレスには何もありません。コンパイラは、シンボルを使用する前に、その関数、変数などのシンボルの種類を知る必要があります。コンパイラはbar
は、関数が、関数へのポインタではないことを知る必要があり、正しいコードを生成するために
int foo() { return bar(); }
int (*bar)();
:
は、この単純な例を考えてみましょう。このコードは、foo
の定義の前にextern int (*bar)();
を置くとコンパイラがどのような型を知っているかを知っている場合にのみ機能します。bar
です。
コンパイラが2つのパスを使用するように設計されている可能性がありますが、これは言語の設計に大きな変更を必要としました。 2回のパスを必要とすると、コンパイラの複雑さが増し、Cコンパイラをホストできるプラットフォームの数が減ります。これは、64K(65,536)バイトのRAMが大量のメモリだったときに、Cが最初に開発された日の非常に重要な考慮事項でした。今日でも、大規模なプログラムのコンパイル時間に顕著な影響を与えます。
C言語では、暗黙的な関数宣言をサポートすることで、あなたが望むものを並べ替えることができます。 (上記の私の例では、bar
が以前に宣言されていない場合、foo
で何が起こるのですか?)しかし、この機能は時代遅れであり、制限されており危険です。
関連する問題
- 1. プログラムで逆アセンブルするCIL
- 2. winでCOM実行ファイルをアセンブルする
- 3. x-oプログラムをアセンブルしますか?
- 4. (GDB)ブレークポイントと逆アセンブル
- 5. このプログラムをどのようにアセンブルできますか
- 6. Javaプログラムの実行
- 7. pthreadとのCプログラムの同時実行
- 8. java - プログラムの実行
- 9. 実行プログラムが
- 10. Java実行プログラムのデフォルト実行ポリシー
- 11. プログラムの実行中にsigsegv
- 12. プログラム実行時のSyntaxError
- 13. プログラムの実行と割り込み
- 14. セグメンテーションフォールトのプログラムを実行すると、
- 15. JAVA:HKと実行プログラムの焦点
- 16. jGraspのwindowsエラー実行プログラム
- 17. Clojureプログラムの実行時間
- 18. サイレントプロセス/プログラムを実行
- 19. mpirunのあるプログラムとないプログラムの実行の違い
- 20. 2つの別々のプログラムを実行するcygwin bash.rc
- 21. Perl - パラレルプログラミング - 2つの外部プログラムの実行
- 22. プログラムの実行ごとに静的カウンタを実装する
- 23. gdbは1行を逆アセンブルします
- 24. プログラムの実行時のバージョンチェック
- 25. のNSWindowController +プログラムの実行
- 26. SIGPIPE実行中のプログラム
- 27. Pythonプログラムを実行する2つの方法
- 28. ウィンドウ内のサブライムテキスト2からCプログラムを実行する
- 29. 2つの異なる言語(C#、Java)でプログラムを実行
- 30. Cプログラムの印刷を2回実行する
どのようなアセンブラで関数を宣言してから使用する必要がありますか? –
Cコンパイラはアセンブラではありません。アセンブラの仕組みとは何の関係もないC言語の規則。 –
私が意味することは、 "アセンブル"されるコンパイルされたプログラムは、プログラムに含まれるすべての関数、変数などの適切な定義が必要であるということです。アセンブラがプログラムを2回実行しなければならない場合、宣言する関数は不要ですか? –