相違点: 1. 異なるレジスタ割り当て、x64 には 16 個のレジスタ、x86 には 8 個のレジスタのみ; 2. 異なるアセンブリ命令; 3. 異なる関数呼び出し; 4. 異なるパラメータ渡し; 5. 異なるスタック フレーム、x64 x86 はスタック フレーム ポインターを持たないが、x86 はスタック フレーム ポインターとして ebp を使用します; 6. x64 の計算速度は x86 の計算速度よりも高速です。
#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。
##0x01: レジスタ割り当ての違い
(1) 64 ビットには 16 個のレジスタがありますが、32 ビットには 8 個しかありません。ただし、最初の 8 つの 32 ビット ビットは異なる名前、つまり e _ を持ちますが、最初の 8 つの 64 ビット ビットは e の代わりに r を使用します (r _)。 e で始まるレジスタ名は対応するレジスタの下位 32 ビットに直接適用できますが、残りのレジスタ名は r8 ~ r15 であり、下位ビットはそれぞれ d、w、b で指定されます。 ( 2) 32 ビット 渡されたパラメーターの保存場所としてスタック フレームを使用し、64 ビット レジスタを使用します。rdi、rsi、rdx、rcx、r8、r9 をそれぞれ 1 ~ 6 パラメーターとして使用し、rax を戻り値として使用します。 ;
(3) 64 ビットではスタック フレーム ポインタがありません、32 ビットではスタック フレーム ポインタとして ebp が使用され、64 ビットではこの設定が解除され、rbp が汎用レジスタとして使用されます。 ) 64 ビットは、PC 関連のアドレス指定の一部の形式をサポートします。32 ビットのアドレス指定方法は、jmp を使用する場合にのみ使用されます。
0x02: (新規) アセンブリ命令の違い
mov、push、pop は、クワッド ワードを操作するために mov、pushq、popq の movq シリーズを拡張します。
補足:(1) movabsq は 32 ビット拡張ではなく、純粋に新しい命令です。 64 ビット リテラル値を 64 ビット レジスタに直接格納するために使用されます。 movq は 32 ビット値しか格納できないため、新しい命令
(2) 64 ビット アセンブリ コードでは ret の前に rep が追加される場合がありますが、ここでの Rep には実際的な意味はありません。 AMD プロセッサは、jmp が到達する場所が直接 ret になることを回避し、プロセッサの動作を高速化するためです。
0x03: 関数呼び出しの違い
(1) x_64 パラメーターはレジスターを介して渡されます (上記を参照);callq は 8 ビットの戻りアドレスをスタックに保管します;
(2) 多くの関数にはスタック フレームがありません. すべてのローカル変数をレジスタに配置できない関数のみがスタック上にスペースを割り当てます;
(3) 関数は最大 128 バイトのスタック スペースを取得できます。これにより、関数はスタックポインタを変更せずにスタック上に情報を格納することができます(つまり、rsp以下の128バイトの空間をあらかじめ使用できます。この空間はレッドゾーンと呼ばれます。x86-64では利用可能です) );
(4) スタック フレーム ポインターはなくなり、スタック位置はスタック ポインターに関連付けられるようになりました。ほとんどの関数は、呼び出しの開始時に必要なすべてのスタック スペースを割り当て、スタック ポインタを変更しないようにします。
(5) 一部のレジスタは呼び出し先ストレージ レジスタとして設計されており、値が必要な場合は変更する必要があります。今すぐ保存して、後で復元してください。
0x04: 異なるパラメータが渡されました
(1) パラメータを渡すために 6 つのレジスタが使用されます (上記を参照); (2) 残りのレジスタは以前と同様に渡されます (ただし、これらは RSP に関連しており、ebp はスタック フレーム ポインタとして使用されなくなり、7 番目のパラメータは RSP から始まり、8 番目のパラメータは RSP 8 から始まります)。 (3) 呼び出されると、rsp は 8 ビット下に移動します (リターン アドレスに格納されます)。レジスタ パラメータは影響しません。7 番目以降のパラメータは、rsp 8、rsp 16 から始まる 7 番目になります。 8 番目など;0x05: スタック フレームの違い
多くの場合、スタック フレームは不要になります。他の関数は呼び出されず、レジスタはパラメータを格納するのに十分なため、戻りアドレスのみを格納する必要があります。 スタック フレームが必要な状況:
(2) 一部のローカル変数が配列または構造体である;
(3) 使用される関数アドレス演算子はローカル変数のアドレスを計算するために使用されます;
(4) 関数はスタックを使用して一部のパラメーターを別の関数に転送する必要があります;
(5) 関数は格納されているいくつかのレジスタの状態を保存する必要があります呼び出し先による (回復を容易にするため);
0x06: 異なる動作速度
64 ビット CPU のデータ幅は 64 ビットであり、64 ビット命令セットは 64 ビットで実行できます。データ命令、つまりプロセッサは一度に 64 ビットのデータを抽出でき、これは 32 ビットの 2 倍であり、理論上はそれに応じてパフォーマンスも 2 倍になります。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinuxのx64とx86の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。