基本的に、私が疑問に思うのは、なぜx86-64OSがx86マシン用にコンパイルされたコードを実行できるのかということです。最初のx64システムが導入されたとき、これはそれらのいずれの機能でもなかったことを私は知っています。その後、彼らはどういうわけかこれを行うことができました。
x86アセンブリ言語はx86-64アセンブリ言語のサブセットであり、ISAは下位互換性をサポートできるように設計されていることに注意してください。しかし、ここで私を混乱させるのは、スタック呼び出し規約です。これらの規則は、アーキテクチャによって大きく異なります。たとえば、x86では、フレームポインタをバックアップするために、スタック(RAM)を指す場所でプッシュを実行し、完了後にポップします。一方、x86-64では、すべての参照がスタックポインターを介して提供されるため、プロセスはフレームポインターをまったく更新する必要がありません。次に、x86アーキテクチャでは、関数への引数はx86-64ではスタックによって渡されますが、レジスタはその目的で使用されます。
おそらく、x86-64アーキテクチャとx64アーキテクチャのスタック呼び出し規約の違いは、異なる規約が同時に使用されない限り、プログラムスタックの成長に影響を与えない可能性があります。これは、x32関数が他のx32と同じものによって呼び出されるためです。 x64の場合。しかし、ある時点で、関数(おそらくシステム関数)は、いくつかの引数を使用してx86-64マシン用にコードがコンパイルされた関数を呼び出します。この時点で、OS(または他の制御装置)がどのように処理するかについて興味があります。この関数を機能させるため。
前もって感謝します。