2

ac プロジェクトで使用 (リンク) されたアセンブリ コードは、 C データ型と関数の前に宣言されたconstキーワードを無視しますか?? そして、データ型の内容を変更できますか??

4

5 に答える 5

7

ac プロジェクトで使用 (リンク) されたアセンブリ コードは、C データ型と関数の前に宣言された const キーワードを無視しますか??

はい、constキーワードはアセンブリ コードによって完全に無視されます。

そして、データ型の内容を変更できますか??

コンパイラがconst読み取り専用セグメントに場所を配置できた場合、アセンブリ コードがそれを変更しようとすると、セグメンテーション フォールトが発生します。constそうしないと、場所が変更されていないと仮定して、コンパイラがコードの一部を最適化しても、他の部分を最適化しない可能性があるため、予期しない動作が発生します。

于 2013-07-12T21:44:25.667 に答える
3

そして、データ型の内容を変更できますか??

多分そうでないかもしれません。元のオブジェクトが宣言されているconst場合、コンパイラはそれを読み取り専用データ セグメントに出力し、実行時に読み取り専用メモリ ページにロードします。アセンブリからであっても、そのページに書き込むと、実行時例外 (アクセス違反またはセグメンテーション違反) がトリガーされます。

コンパイル時にエラーが発生することはありませんが、実行時にプログラムがクラッシュしたり、異常な動作をしたりする可能性があります。

于 2013-07-12T21:45:04.850 に答える
1

アセンブリは、C で宣言したデータ型を使用して、情報をメモリに格納する方法を最適化します。1 日の終わりにはすべてがバイナリー (int、long、char など) で書き込まれるため、低レベルのコードに到達すると、データ型はありません。

于 2013-07-12T21:45:22.943 に答える
1

質問はあまり正確ではありません。「無視する」とはどういう意味ですか?

constアセンブリ言語には、C 言語と同じ概念はありません。したがって、アセンブリはそれを無視できません。それは単にそれについて何も知りません。

しかし、C コンパイラーによって C プログラム用に生成されたアセンブリー・コードは、C プログラム内のconstキーワードの配置によって容易に影響を受ける可能性があります。

つまり、アセンブリ コードはキーワードの影響を受ける可能性があります。constただし、アセンブリ コードがビルドされると、constキーワードは不要になります。

アセンブラが宣言されたものを変更できると言うのもconst正確ではありません。変数を として宣言するとconst、場合によっては、コンパイラがその変数を完全に削除して、その変数の即値に置き換えるほど賢くなることがあります。これは、そのconst変数が最終的なコードから完全に消え、アセンブリ コードが「変更」するものが何も残らないことを意味します。

于 2013-07-12T21:58:54.833 に答える