int 0x80はシステムコールで、それも128進数です。 カーネルはint 0x80を割り込みとして使用していますが、int xを宣言すると、xという名前の整数になります。逆も同様です。カーネルが "int 0x80"と "int x"の違いを知る方法
答えて
Cとアセンブリ言語の違いについては混乱しているようです。どちらもプログラミング言語です(現在のところ)(両方とも16進数で数値を書くための0xNNNN
の表記を受け入れています)、アセンブリ言語の小さなスニペットをCプログラムに埋め込む方法はありますが、異なる言語です。キーワードint
は、C言語で(x86)アセンブリ言語とはまったく異なるものを意味します。 Cコンパイラに
、int
常にとは唯一は、整数を含む何かを宣言することを意味し、そしてあなたはすぐに数値リテラルでint
に従うことができます何も状況はありません。 int 0x80
(またはint 128
、またはint 23
、または並べ替えの何か他のもの)は、常にのx86アセンブラにC.
の構文エラーされ、割り込み命令のマシンコードを生成するint
常にとのみ手段、単一の数値リテラルはすぐにに従わなければなりません。 int x;
は、x86アセンブリ言語では常に構文エラーです。
明白なフォローアップの質問:Cコンパイラがint
をINTerrupt命令として認識しない場合、Cプログラム(x86用にコンパイルされたもの)はシステムコールをどのようにしますか?この質問への4つの補完の答えがあります。
時間のほとんどは、Cプログラムで、あなたは、システムが直接呼び出すことはありません。代わりに、あなたのために行うCライブラリの関数を呼び出します。あなたのプログラムを処理するとき、Cコンパイラが知っている限り、
open
は他の外部関数と変わりありません。したがって、int
命令を生成するには、にはが必要ではありません。それはちょうどcall open
です。しかし、Cライブラリは他の誰かがあなたのために書いたCです。それでも、
open
の実装を逆アセンブルすると、実際にint
命令が表示されます(代わりにsyscall
またはsysenter
)。 Cライブラリを書いた人はどうしたのですか? ...どのようにその仕事を彼らはアセンブリ言語では、ないC.でその関数を書いたか、彼らはに私たちをもたらしCプログラムでアセンブリ言語のスニペットを埋め込むため、その技術を使用しましたか?それはCコンパイラを意味しませんは理解する必要があります組み立てニーモニックとして
int
を時々理解できますか?必ずしも。のは、挿入するためのGCCの構文を見てみましょうアセンブリを-これは、x86/32/Linux用open
の実装が考えられます。int open(const char *path, int flags, mode_t mode) { int ret; asm ("int 0x80" : "=a" (ret) : "0" (SYS_open), "d" (path), "c" (flags), "D" (mode)); if (ret >= 0) return ret; return __set_errno(ret); }
あなたはそれの大部分を理解する必要はありません。この目的のために重要なこと質問は、はい、それは
int 0x80
と言われていますが、文字列リテラルの中にと書かれています。コンパイラは、その文字列リテラルの内容を、生成されたアセンブリ言語ファイルにそのままコピーし、アセンブラに送ります。それが何を意味するのかを知る必要はありません。それがアセンブラの仕事です。もっと一般的に言えば、Cでは1つのことを意味し、アセンブリ言語では全く異なるものを意味します。 Cコンパイラはアセンブリ言語を生成するので、それらの単語の意味を両方とも「知っている」必要があります。それはありますが、それらは常に別の状況で使用されるため、それらを混乱させません。 Cコンパイラがどのように使用するかを知っているアセンブリニーモニックである "add"は、 "add"命令がそのプログラムで使用されたとしても、Cプログラムで変数 "add"の命名に問題があることを意味しません。およびx86アセンブリ言語(中 `int型;
- 1. int $ 0x80プログラミングからグラウンドアップ
- 2. パンダシリーズ(アナコンダ2.7)のフォーマットワード((int)X(int)X(int))の検索方法
- 3. int [] xの違いは何ですか? int x [];?
- 4. C++のint x = 1とint x(1)の違いは何ですか?
- 5. SMLのint - > int - > intと(int * int) - > intの違いは何ですか?
- 6. int 0x80(アクセスビット?)のファイルの追加
- 7. "int f(int(fn)())"と "int f(int(* fn)())"の違いは?
- 8. intとsigned int宣言の違い
- 9. int * array [60]とint * array = new int(60)の違いです。
- 10. "int * a = new int"と "int * a = new int()"の違いは何ですか?
- 11. Bitmap.createBitmap(ビットマップソース、int型のx、int型のy、int型の幅、int型の高さ)間違ったビットマップを返し
- 12. const intとx = 4とconst int x = 4の差異
- 13. IntとUint8 swiftの違い
- 14. フロアとintキャストの違い
- 15. BufferedImage.getSubimage(int x、int y、int w、int h)メソッドのガイダンス?
- 16. SQL [int]とint
- 17. Cのint * ptrとint * ptrの違いは何ですか?
- 18. C言語のint * pn =&nとint pn =&nの違い
- 19. Javaのpublic intとintの違いは何ですか?
- 20. Cのintとextern intの違いは何ですか?
- 21. int 0x80ルーチンを変更できますか?
- 22. int(x)を使わずに文字列をintに変換する方法
- 23. int ++と++ intの違いは何ですか?
- 24. C++で "const int"と "int"の違いはありますか?
- 25. 「long int a = 2」と「int a = 2L」の違いは何ですか?
- 26. foo(int * arr)とfoo(int arr [])の違いはありますか?
- 27. void(int)とvoid(*)(int)の違いは何ですか?
- 28. int(* p)[3]とint * p [3]の違いは何ですか?
- 29. int(floatvar)と(int)floatvarの違いはありますか?
- 30. intとintの違いは何ですか:
あなたは(' 'X 'という名前の整数変数を宣言し、' '構文エラーですをint型のx' int型で)Cとの違いについて混乱しています 'はINTerrupt命令のマシンコードを生成し、' int x; 'は構文エラーです)?それ以外の場合、私はあなたが何を求めようとしているのか分かりません。 –
zwol
私はもっときれいにしてみてください。 コンパイラは(c)のコード "int x"のような変数xの定義とsystem_call割り込み "int 0x80"の違いを知っていますか? – Hooch