良い質問。すべての新しいCまたはC ++開発者はこれを念頭に置いています。この記事の残りの部分では、標準のx86マシンを想定しています。Microsoft C ++コンパイラを使用している場合は、メモ帳を開いて次のように入力します(ファイル名はTest.c)。
int main(int argc, char **argv)
{
return 0
}
そして、このファイルを(開発者のコマンドプロンプトを使用して)コンパイルします。cl Test.c /FaTest.asm
次に、メモ帳でTest.asmを開きます。表示されているのは翻訳されたコードです-C / C ++はアセンブラーに翻訳されています。ヒントはわかりますか?
_main PROC
push ebp
mov ebp, esp
xor eax, eax
pop ebp
ret 0
_main ENDP
C / C ++プログラムは、メタル上で実行するように設計されています。つまり、下位レベルのハードウェアにアクセスできるため、ハードウェアの機能を簡単に活用できます。たとえば、x86マシンでCライブラリgetch()を作成するとします。
アセンブラーに応じて、次のように入力します。
_getch proc
xor AH, AH
int 16h
;AL contains the keycode (AX is already there - so just return)
ret
私はそれをアセンブラーで実行し、.OBJを生成します-getch.objという名前を付けます。
次に、Cプログラムを記述します(#includeは一切行いません)
extern char getch();
void main(int, char **)
{
getch();
}
次に、このファイルにGetChTest.cという名前を付けます。getch.objを渡してこのファイルをコンパイルします。(または、個別に.objにコンパイルし、GetChTest.Objとgetch.Objをリンクして、GetChTest.exeを生成します)。
GetChTest.exeを実行すると、キーボード入力を待機していることがわかります。
C / C ++プログラミングは言語だけではありません。優れたC / C ++プログラマーになるには、実行するマシンのタイプをよく理解している必要があります。メモリ管理がどのように処理されるか、レジスタがどのように構造化されるかなどを知る必要があります。通常のプログラミングではこれらすべての情報は必要ないかもしれませんが、それらは非常に役立ちます。基本的なハードウェアの知識は別として、コンパイラーがどのように動作するか(つまり、どのように変換されるか)を理解していれば、確かに役立ちます。これにより、必要に応じてコードを微調整できます。おもしろいパッケージです!
どちらの言語も__asmキーワードをサポートしています。つまり、アセンブリ言語コードを混在させることができます。CとC ++を学ぶことで、全体的に丸みのあるプログラマーになるでしょう。
常にアセンブラとリンクする必要はありません。私はそれがあなたがよりよく理解するのに役立つだろうと思ったのでそれを述べました。ほとんどの場合、そのようなライブラリ呼び出しのほとんどは、オペレーティングシステムによって提供されるシステムコール/ APIを利用します(OSはハードウェアの相互作用を行います)。