3.2 レジスタ#
たとえば、ADD(加算)命令の場合、メモリ内の 2 つの数値を直接加算することはできません。プロセッサは、そのうちの 1 つの数値をレジスタに転送し、もう 1 つのメモリアドレスの数値と加算する必要があります。
32 ビット汎用レジスタは、EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI、および EIP です。
- EAX(accumulator、累加器):EAX は算術演算や一部のフォーマット指令によく使用されます。
- EBX(Base index、基底インデックスレジスタ):EBX は、開始メモリアドレスを格納するためによく使用されます。
- ECX(counter、カウンタ):ECX は、さまざまな命令のカウンタとして使用されます。同時に、メモリデータのアドレスオフセットも格納します。カウンタを使用する命令には、文字列命令、オフセット命令、シフト命令、およびループが含まれます。
- EDX(data):EDX は通常、乗算の一部のビットと除算の余りを格納するために使用されます。同時に、開始メモリアドレスも格納できます。
- EBP(base pointer):EBP は、関数内のパラメータや変数のベースアドレスとして使用されるメモリアドレスを指します。
- EDI(destination index):EDI は、文字列命令でよく使用され、目的の文字列を指します。
- ESI(source index):ESI は、文字列命令でよく使用され、元の文字列を指します。
- EIP:次に実行される命令のアドレスを格納します。
- ESP:スタックのトップアドレスを格納します。
以下は思考マップです:
EBX には BX、BH、BL のサブレジスタがあり、ECX には CX、CH、CL のサブレジスタがあり、EDX には DX、DH、DL のサブレジスタがあります。他の汎用レジスタの 9〜16 ビットには名前が付けられておらず、直接内容を取得することもできません。
基本的なデータ型は、BYTE が 1 バイト(8 ビット)のメモリを使用し、WORD が 2 バイト(16 ビット)のメモリを使用し、DWORD が 4 バイト(32 ビット)のメモリを使用し、QWORD が 8 バイト(64 ビット)のメモリを使用します。
64 ビット | 32 ビット | 16 ビット | 8 ビット(下位) | 8 ビット(上位) | コメント |
---|---|---|---|---|---|
RAX | EAX | AX | AL | AH | |
RBX | EBX | BX | BL | BH | |
RCX | ECX | CX | CL | CH | |
RDX | EDX | DX | DL | DH | |
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 | - | |
RIP | EIP | IP | - | - | |
RFLAGS | EFLAGS | FLAGS | - | - |
レジスタとサブレジスタ
データ型 | サイズ(ビット) | 一般的な使用法 |
---|---|---|
Byte | 8 | 文字、小さな整数 |
Word | 16 | 文字、整数 |
Doubleword | 32 | 整数、単精度浮動小数点数 |
Quadword | 64 | 整数、倍精度浮動小数点数 |
Double Quadword | 128 | パックされた整数、パックされた浮動小数点数 |
基本データ型とメモリの使用量
3.3 MOV 命令#
データ転送命令 MOV:始操作単位(src)の内容を目的単位(dest)にコピーします。
MOV EAX, EDI
ほとんどの場合、レジスタ間で直接転送できますが、EIP レジスタは直接代入または読み取りすることはできません。たとえば、MOV EIP, EAX
という命令は無効です。
IDA では、アドレスの前にOFFSET
という単語がある場合、そのアドレス自体の値を指しますが、OFFSET
という単語がない場合、そのアドレスに格納されている内容を指します。