C言語は、移植性を実現するためにUNIXを作成するために使用されました。異なるコンパイラを使用してコンパイルされた同じC言語プログラムは、異なるマシン命令を生成します。なぜWindowsOSはIntelとAMDの両方のプロセッサで実行できるのですか?
AMDプロセッサとIntelプロセッサ(*)には共通の命令セットが多数あるため、コンパイラまたはアセンブラが両方で「同じ」実行を行うバイナリコードを記述できる可能性があります。
ただし、1つのメーカーの異なるプロセッサファミリでも、通常は「拡張機能」などと呼ばれる独自の命令セットがあります。 x87コプロセッサーを無視して、これがマーケティングのポイントであることを初めて覚えたのは、すべてが突然「MMX(TM)テクノロジーを使用して」行ったときでした。任意のプロセッサで実行されることが予想されるバイナリコードは、拡張を回避するか、拡張を使用する前にCPUタイプを検出する必要があります。
IntelのItanium64ビットアーキテクチャはAMDのx86-64アーキテクチャとは完全に異なっていたため、しばらくの間、64ビット製品には互換性がありませんでした(Itaniumはx86に似ていませんでしたが、x86-64は64ビット命令を追加して命令セットを拡張しました)。 Intelが最初に点滅し、x86-64を採用しましたが、まだいくつかの違いがあります: http://en.wikipedia.org/wiki/X86-64#Differences_between_AMD64_and_Intel_64
Windowsは、ほとんどすべてのコードに共通のx86またはx86-64命令セットを使用している可能性があります。さまざまなドライバとコーデックが複数のバージョンで出荷され、CPUが問い合わせられたら正しいものが選択されても、私は驚かないでしょう。
(*)実際、IntelはARM(IntelのARMプロセッサはXScaleと呼ばれていましたが、販売されたと思います。そしてAMDは他のプロセッサも製造していますが、どのIntel/AMDプロセッサを意味するかはわかっています:-)
ご想像のとおり、メインストリームのIntelプロセッサとAMDプロセッサには同じ命令セットがあります。
たとえば、WindowsはARMまたはPowerPCチップでは動作しません。これは、基盤となる命令セットにある程度依存しているためです。
ただし、ほとんどのWindowsは(私が知る限り)C++で記述されているため、他のアーキテクチャに移植できるはずです。 Windows NTはPowerPCやその他のアーキテクチャでも動作しました 。
AMDはIntelと互換性があります。そうでなければ、市場で足場を築くことはできなかったでしょう。
それらは事実上クローン互換です。
ライアン
AMDとIntelは同じ命令セットを使用します。
AMDプロセッサまたはIntelプロセッサにWindowsをインストールすると、マシン上でコードが「コンパイル」されません。
大学時代に多くの人がこの問題について混乱していたことを覚えています。彼らは、「セットアップ」とは、マシン上でコードをコンパイルしていることを意味すると信じています。そうではありません。無料の領域外のすべてではないにしてもほとんどのWindowsアプリケーションは、バイナリによって提供されます。
移植性に関しては、それは必ずしも100%真実ではありません。 Cは移植性が高いですが、多くの場合、特定のOSまたはシステム用に作成すると、コードはそのボックスでのみコンパイル/実行できます。たとえば、特定のUnixマシンはファイルとディレクトリを異なる方法で処理するため、100%移植性がない場合があります。
Intelの80x86CPUとAMDの80x86は「ほぼ同じ種類」ですが、完全に異なるもの(仮想マシンの拡張機能-SVMとVT-xなど)や、サポートされているもの(サポートされていないもの)があります。ただし、同じメーカーの異なるCPUでも異なるものがあります(たとえば、一部のIntelチップはAVX2をサポートし、一部はサポートしていません)。
違いに対処する方法は複数あります。
共通のサブセットのみを使用して、同じコードがすべての80x86 CPUで実行されるようにします(たとえば、8086チップのように扱います)。
ある範囲のCPUに共通の機能のサブセットを使用して、同じコードがその範囲内のすべての80x86CPUで実行されるようにします。これは非常に一般的です(たとえば、「このソフトウェアには、64ビット拡張機能をサポートする80x86 CPU(およびOS)が必要です」)。
インストール時テストを使用します。たとえば、ソフトウェアの4つの異なるコピー(4つの異なるCPU範囲用にコンパイルされたもの)があり、インストーラーが、ソフトウェアがインストールされているコンピューターに適したコピーを決定する場合があります。
ランタイムテストを使用します。たとえば、コードはCPUID
命令を使用してif( AVX2_is_supported() ) { set_function_pointers_so_AVX2_is_used(); } else {set_function_pointers_so_AVX2_is_not_used(); }
を実行できます。 注:一部のコンパイラ(IntelのICC)は、ランタイムテストを実行するコードを自動的に生成できます。
これらは相互に排他的なオプションではありません。たとえば、インストーラーが64ビットバージョン(32ビットバージョンではない)をインストールすることを決定した後、64ビットバージョンが実行時にサポートされる機能を確認し、さまざまな機能を使用するためにさまざまなコードを使用する場合があります。
また、OSのさまざまな部分を個別に扱うことができることにも注意してください。たとえば、OSには、仮想化をサポートするために、6つの異なるブートローダー、4つの異なる「HAL」、4つの異なるカーネル、および3つの異なる「カーネルモジュール」を含めることができます。これらのいくつかは実行時テストを実行する可能性があり、いくつかは実行しない可能性があります。
IntelとAMDプロセッサには同じアセンブラがありますか?
80x86のほぼすべてのアセンブラは、ほぼすべての拡張機能をサポートしています(Intel、AMD、VIA、Cyrix、SiSなどのすべてのCPUメーカーから)。一般に;存在することがわかっているものだけを使用するようにするのは、プログラマー(またはコンパイラー)の責任です。一部のアセンブラは、これを簡単にする機能を提供します(たとえば、NASMはCPU ...
ディレクティブを提供するため、指定されたCPUでサポートされていない命令が見つかった場合、プログラマはアセンブラにエラーを生成するように指示できます)。
IntelとAMDプロセッサには同じアセンブラがありますか?アセンブラはプロセッサ上で実行されるプログラムをアセンブルするため、質問に欠陥があります。プロセッサはアセンブラを使用しません。
IntelとAMDプロセッサが同じアセンブラを実行できるということですか?それなら答えはイエスです!!!
すべてのアセンブラは、構造化テキストファイルから他のプログラムをアセンブルするプログラムです。 VisualBasicはアセンブラの一例です。