64

このアーキテクチャでのアセンブリ用の新しいレジスタの名前はどこにありますか?

EAX、ESP、EBX などの X86 のレジスタについて言及していますが、64 ビットで使用したいと考えています。

Cコードを逆アセンブルしたときと同じではないと思います.eの代わりにrを取得します.

4

4 に答える 4

104

MSDN ドキュメントには、x64 レジスタに関する情報が含まれています。

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

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

64-bit register | Lower 32 bits | Lower 16 bits | Lower 8 bits
==============================================================
rax             | eax           | ax            | al
rbx             | ebx           | bx            | bl
rcx             | ecx           | cx            | cl
rdx             | edx           | dx            | dl
rsi             | esi           | si            | sil
rdi             | edi           | di            | dil
rbp             | ebp           | bp            | bpl
rsp             | esp           | sp            | 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
于 2009-11-18T04:24:40.223 に答える
88

古い 32 ビット レジスタは 64 ビットに拡張され、rレジスタ ( raxrbxなどrsp) が続きます。

さらに、いくつかの追加の汎用レジスタr8があり、r15(たとえば)および(それぞれ下位 32 ビット ダブルワード、16 ビット ワード、および 8 ビット バイト) としてアクセスすることもできます。接尾辞はオリジナルのAMD 命名法ですが、「下位バイト」を表す(小文字の) と書かれている場合があります。r8dr8wr8bblL

名前と一致し、. b_ または、さらに悪いことに、数字、一体レジスタ番号が何であるかを疑問視するようになります:-)albld/w = double/wordllong181

古い 16 ビット レジスタの上位バイトにはahbh、 などのように、多くの状況で引き続きアクセスできます (ただし、これは新しいr8スルーr15レジスタには当てはまらないようです)。いくつかの新しい命令エンコーディング、特にREXプレフィックスを使用するものがありますが、それらは元の上位バイトにアクセスできませんが、他のものはまだそれらを自由に使用できます。

さらに、新しい SSE レジスタもいくつかxmm8ありますxmm15

eipandeflagsレジスタも and に拡張されましたrip(ただしrflags、 の上位 32 ビットはrflags今のところまだ使用されていません)。

詳細については、ウィキペディアのページMSDNを参照してください。

これらが特定の C コンパイラのキーワードでサポートされているかどうかはasmわかりません。私が行っている小さなアセンブリ (そして年に 1 日程度になっています) は、C ではなくアセンブリで行われます。


関連している:

于 2009-11-18T04:21:56.070 に答える
9

X64 は、32 ビットの汎用レジスタを次のように拡張します。

EAX -> RAX
EBX -> RBX
ECX -> RCX
EDX -> RDX
ESI -> RSI
EDI -> RDI
ESP -> RSP
EBP -> RBP

X64 では、次の 64 ビット汎用レジスタも追加されます。

R8, R9, R10, R11, R12, R13, R14, R15

さらに、SSE は X64 仕様の一部であるため、xmm0-xmm15 ベクトル レジスタも使用できます。

Wikipedia/X86-64でアーキテクチャに関する基本的な情報を見つけるか、Intel の Web サイトにアクセスしてください。

于 2009-11-18T04:22:54.367 に答える
5

インテルのマニュアルを読んでみよう

このアーキテクチャでのアセンブリ用の新しいレジスタの名前はどこにありますか?

プロセッサのマニュアル「Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture」(バージョン 253665-053US など) :

  • 「レジスター」で検索
  • 最初に一致するのはインデックス「3.4 BASIC PROGRAM EXECUTION REGISTER」です。
  • 「3.4.1.1 64ビットモードの汎用レジスタ」の下2項目

そのセクションで:

64 ビットのオペランド サイズが指定されている場合: RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8-R15 が使用可能です。R8D-R 15D/R8-R15 は、8 つの新しい汎用レジスタを表します。

注意: 64 ビット モードは x86-64 の「通常」モードです。もう1つのメインモードは、IA32をエミュレートする「互換モード」です。

TOC で「レジスタ」を検索し続けると、浮動小数点および SIMD 用の「数値破砕」レジスタに関するセクションがマニュアルに散らばっています。

  • 8.1.2 - x87 FPU データレジスタ (STx)
  • 9.9.2 - MMX レジスタ
  • 10.2.2 - XMM レジスタ
  • 14.1.1 - 256 ビット幅の SIMD レジスタのサポート (YMM)

さまざまな副作用があり、それらの効果が必要でない限り(そしてしばしばリング 0 が必要な場合)、通常は書き込むことができない制御レジスタがさらに多くあります。これらは、OS 開発者向けの「Volume 3 System Programming Guide - 2.1.6 System Registers」にまとめられています。

良い経験的アプローチはinfo all-registers、GDB で実行することです: How to print register values in GDB?

于 2015-04-20T20:12:38.323 に答える