私はこれらのアーキテクチャのスタックをいじる必要があり、ここでは本当に無関心です。私ができるトピック/グーグル検索を読むためのポインタ。これらのアーキテクチャが互いに根本的にどのように異なるかを探しています。このトピックに関するウィキペディアの記事以上のものhttp://en.wikipedia.org/wiki/X64
9 に答える
x86には8つの32ビットレジスタがあり、x64にはそれぞれ64ビットのレジスタがあり、さらに8つあります。128ビットのSSEレジスタは両方とも128ビットですが、x86では8個あり、x64では16個あります。また、いくつかの命令はx64でカットされました。
x64モードでも、64ビット名(「r」で始まる)の代わりに32ビット名(「e」で始まる)を使用することで、レジスタを32ビットとして使用できます。アセンブリはほとんど同じです。
http://en.wikipedia.org/wiki/X86#x86_registers
または、本当に重い読書が必要な場合(数千ページのように...)
http://www.intel.com/products/processor/manuals/index.htm 私はそれらのマニュアルの数百ページを読み、多くの、本当に良いことを学びました。
ここでのすべての回答は、完全を期すためにここにリストするレジスタセットの変更について言及しています。
- 既存の 32 ビット汎用レジスタはすべて 64 ビットに拡張されます ( など
EAX
に拡張されますRAX
)。 - 8 つの新しい 64 ビット汎用レジスタ (
R8
~R15
) - 8 つの新しい 128 ビット SSE レジスタ (
XMM8
~XMM15
)
アドレッシング モードにも変更があります。
- CS、DS、ES、SSはフラットです。つまり、それらのベースは
0x0
であり、それらの制限は0xffffffffffffffff
です。FS と GS は、32 ビットを超えるベースを持つことができます。 - GDT、LDT、および IDT の記述子が変更されました。64ビットモードで8バイトあります
- 連続していないアドレス空間。32 ビット モードでは、線形アドレス空間は から
0x0
まで0xfffffff
です。64 ビット モードでは、リニア アドレス空間は から と から に分割0x0
さ0x00007ffffffff
れ0xffff800000000000
ます0xffffffffffffffff
。基本的にアドレスは 48 ビットのみで、アドレスは 64 ビットに符号拡張されます。 - 新しいページング モード。
さまざまな指示が削除されました。
- エンコーディングと.
INC
_ バイトがプレフィックスになりました。40+rw
40+rd
4x
REX
- フラットになったセグメント レジスタをロードするための命令:
LDS
、LDS
、LSS
。
頭のてっぺんから思い出すことができる違いは他にもあります。他にも思いついたら追加します。
リンク先のウィキペディアの記事は、妥当な量の紹介情報を提供していると思います。ロング・モードの違いの具体的な詳細に興味がある場合は、公式リファレンスの 1 つを参照してください: Intel® 64 and IA-32 Architectures Software Developer's Manuals .
スタック?物理(E/RSP スタック)のことですか?もしそうなら、私の答えは関連しています:
x86 では、ほぼすべての C コンパイラがcdecl
呼び出し標準を使用します。詳細は覚えていませんが、コンパイラやオペレーティング システム間で一貫していました。基本的に、引数は (右から左に) スタックにプッシュされ、次に戻り値が eax に置かれ、呼び出し元がクリーンアップを担当します。
ただし、x86-64では、すべてがかなりめちゃくちゃです。Windows の呼び出し規則は Linux とは異なります (Linux 以外の UNIX ライクな OS のほとんどは、元の C 呼び出し標準を維持していますが、これはより厄介な問題につながります)。それらがどのように違うのか思い出せませんが、そうです。Googleで「異なる呼び出し規約x86-64」を検索すると、その詳細が見つかります。
参照: http://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_conventions
まず、ポインターのサイズは 4 バイトではなく 8 バイトです。
レジスタは 64 ビット値も保持できます。
また、多くの場合、OS レベルで多くの違いがあります。たとえば、Windows では、64 ビット Windows OS で 32 ビット アプリを実行すると、ファイル システム リダイレクトやレジストリ リダイレクト (WOW64) などがあります。
汎用レジスタが32ビットではなく64ビットになったことに加えて、r8、r9、r10、r11、r12、r13、r14、およびr15の新しいレジスタもあります。より多くのレジスタがあるという事実は、ほとんどのコンパイラが関数呼び出しにレジスタごとの呼び出し規約を使用するという事実にもつながります(varargsを使用するものを除く)が、x86ではほとんどのコンパイラがすべての引数をスタックにプッシュします。
x87 FPUも非推奨になり、SSEが優先されます。
x86のCPUのすべてのレジスタは32ビットですが、64ビットは64ビットです:)
ポインター算術を使用している場合、 sizeof() は異なる結果をもたらし、インクリメント操作も同様です。
Intel サイトで 2 つのアーキテクチャに関する詳細情報を入手できると思います。また、64 ビット プロセッサに追加された新しい命令を強調する命令セットも入手できます。
これは特にx86対x64の回答ではないと思いますが、関連している可能性があります。
Linux では、x86 ではスタックは 4k または 8k ですが、x64 では 16k です。