2016-04-06 18 views
-1

int 0x80はシステムコールで、それも128進数です。 カーネルはint 0x80を割り込みとして使用していますが、int xを宣言すると、xという名前の整数になります。逆も同様です。カーネルが "int 0x80"と "int x"の違いを知る方法

+0

あなたは(' 'X 'という名前の整数変数を宣言し、' '構文エラーですをint型のx' int型で)Cとの違いについて混乱しています 'はINTerrupt命令のマシンコードを生成し、' int x; 'は構文エラーです)?それ以外の場合、私はあなたが何を求めようとしているのか分かりません。 – zwol

+0

私はもっときれいにしてみてください。 コンパイラは(c)のコード "int x"のような変数xの定義とsystem_call割り込み "int 0x80"の違いを知っていますか? – Hooch

答えて

6

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つの補完の答えがあります。

  1. 時間のほとんどは、Cプログラムで、あなたは、システムが直接呼び出すことはありません。代わりに、あなたのために行うCライブラリの関数を呼び出します。あなたのプログラムを処理するとき、Cコンパイラが知っている限り、openは他の外部関数と変わりありません。したがって、int命令を生成するには、にはが必要ではありません。それはちょうどcall openです。

  2. しかし、Cライブラリは他の誰かがあなたのために書いたCです。それでも、openの実装を逆アセンブルすると、実際にint命令が表示されます(代わりにsyscallまたはsysenter)。 Cライブラリを書いた人はどうしたのですか? ...

  3. どのようにその仕事を彼らはアセンブリ言語では、ない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と言われていますが、文字列リテラルの中にと書かれています。コンパイラは、その文字列リテラルの内容を、生成されたアセンブリ言語ファイルにそのままコピーし、アセンブラに送ります。それが何を意味するのかを知る必要はありません。それがアセンブラの仕事です。

  4. もっと一般的に言えば、Cでは1つのことを意味し、アセンブリ言語では全く異なるものを意味します。 Cコンパイラアセンブリ言語を生成するので、それらの単語の意味を両方とも「知っている」必要があります。それはありますが、それらは常に別の状況で使用されるため、それらを混乱させません。 Cコンパイラがどのように使用するかを知っているアセンブリニーモニックである "add"は、 "add"命令がそのプログラムで使用されたとしても、Cプログラムで変数 "add"の命名に問題があることを意味しません。およびx86アセンブリ言語(中 `int型;

関連する問題