x64 アーキテクチャ

64-ビットレジスタ 下位32ビット 下位16ビット 8ビット下位

rax

eax

ax

ウムアルクラ

rbx

ebx

bx

bl

rcx

ecx

cx

付い

rdx

edx

dx

dl

rsi

esi

si

sil

rdi.tpl

修飾子

di

dil

rbp

ebp

bp

bpl

.rsp

esp

プロセッサー

spl

r8

r8d

r8w

r8b

r9

r9d

r9w

r9b

r10

r10d

r10w

r10b

r11

r11d

r11w

r11b

r12

r12d

r12w

r12b

r13

r13d

r13w

r13b

r14

r14d

r14w

r14b

r15

r15d

r15w

r15b

32ビットサブレジスタに出力する操作は、64ビットレジスタ全体に自動的にゼロ拡張されます。 8ビットまたは16ビットのサブレジスタに出力する操作はゼロ拡張され ません (これは互換性のある x86 動作です)。

Axbxcxdxの上位8ビットは依然としてahbhchdhとしてアドレス指定できますが、すべての種類のオペランドで使用することはできません。

命令ポインター、 eip、および flags レジスタは、64ビット (それぞれriprflags) に拡張されています。

X64 プロセッサでは、浮動小数点レジスタのセットもいくつか用意されています。

  • 8 80 ビット x87 レジスタ。

  • 8 64 ビット MMX レジスタ。 (これらは x87 レジスタと重複しています)。

  • 8 128 ビットの SSE レジスタの元のセットは16に増加しています。

呼び出し規約

X86 とは異なり、C/c + + コンパイラは x64 での呼び出し規約を1つだけサポートします。 この呼び出し規約では、x64 で使用可能なレジスタの数が増えています。

  • 最初の4つの整数またはポインターパラメーターは、 rcxrdxr8、および r9 レジスタで渡されます。

  • 最初の4つの浮動小数点パラメーターは、最初の4つの SSE レジスタxmm0xmm3に渡されます。

  • 呼び出し元は、レジスタで渡される引数に対して、スタックの領域を予約します。 呼び出された関数は、この領域を使用してレジスタの内容をスタックに書き込むことができます。

  • その他の引数はスタックで渡されます。

  • Raxレジスタでは整数またはポインターの戻り値が返されますが、 xmm0では浮動小数点戻り値が返されます。

  • raxrcxrdxr8r11は volatile です。

  • rbxrbxrdi.tplrsir12r15は不揮発性です。

C++ の呼び出し規約はよく似ています。 この ポインターは、暗黙的な最初のパラメーターとして渡されます。 残りのレジスタには次の3つのパラメーターが渡され、残りはスタックで渡されます。

アドレス指定モード

64ビットモードのアドレス指定モードは、x86 に似ていますが、同じではありません。

  • 64ビットレジスタを参照する手順は、64ビット精度で自動的に実行されます。 (たとえば 、mov rax の場合、[rbx] は、rbx で始まる8バイトを raxに移動します)。

  • 64 ビットの即時定数または定数アドレスに対して、特別な形式の mov 命令が追加されました。 他のすべての命令では、イミディエイト定数または定数アドレスは 32 ビットです。

  • x64 では、新しい rip-relative addressing モードが提供されます。 1 つの定数アドレスを参照する命令は、rip からのオフセットとしてエンコード されます。 たとえば、mov rax, [addr]命令は、addrrip から始まる 8 バイトrax に移動します

jmpなどの命令は、命令ポインターを暗黙的に参照する 、プッシュ、ポップ を呼び出し、スタック ポインターは x64 上で 64 ビット レジスタとして扱います。

関連項目

X86-64 Wikipedia

AMD 64 開発者リソース

Intel - x64 アセンブリの概要

x64 入門 - 64 ビット アプリケーション システムのプログラミングを開始するために知る必要Windowsすべて - Matt Pietrek

呼び出し規則の歴史、パート 5: amd64 Raymond Chen

x64 アーキテクチャは、x86 の下位互換性のある拡張機能です。 x86 と同じレガシ 32 ビット モードと、新しい 64 ビット モードが提供されます。

"x64" という用語には、AMD 64 と Intel64 の両方が含まれます。 命令セットは同じに近いです。

レジスタ

x64 は、x86 の 8 つの汎用レジスタを 64 ビットに拡張し、8 つの新しい 64 ビット レジスタを追加します。 64 ビット レジスタには"r" で始まる名前が付くので、たとえばeaxの 64 ビット拡張はrax と呼ばれる。 新しいレジスタの名前は r8 ~ r15 です

各レジスタの下位 32 ビット、16 ビット、および 8 ビットは、オペランドで直接アドレス指定できます。 これには、以前はアドレス指定できない下位 8 ビットのレジスタ (esiなど) が含まれます。 次の表では、64 ビット レジスタの下位部分のアセンブリ言語名を指定します。