この構文は、C の配列構文 ( array[index]
) と同様に、メモリ アドレス指定を示すために使用されます。あなたの例は、式を計算し、0x404580 + (eax & 0x0F)
それをアドレスとして扱い、このアドレスから1バイトを取得することと同等です。これは、 のデータがバイトの配列であることを示唆しています (マスクに基づく要素で0x404580
ある可能性が最も高い)。0x10
それがあなたの質問に答えるなら、ここで読むのをやめることができます.
[Options] > [General] に移動し、[Show Opcode Bytes] をゼロ以外の値に設定すると、命令バイトの実際の値が表示され、プロセッサのドキュメントと相互参照して何が起こっているかを理解できます。これは通常は必須ではありませんが、教育用に使用できます。例えば:
mov dl, byte_404580[eax]
一連のバイトとして表現できます。
8A 14 05 80 45 40 00
Intel の Architecture Manual, Volume 2Aを使用すると、これは次のようにデコードできます。
8A - instruction opcode for MOV r8, r/m8 - determines the operand sizes
14 - the Mod R/M byte:
| 00010100b
Mod | 00
R/M | 100
Reg | 010
Mod R/M combination 00-100 is specified as "followed by the SIB byte".
Reg 010 stands for register DL/DX/EDX, the destination operand.
05 - the SIB byte:
| 00000101b
Scale | 00
Index | 000
Base | 101
This combination is specified as [scaled value of EAX] + a 32 bit displacement.
80 45 40 00 - the displacement itself, 0x404580
これらを合計すると、次のようになります。
この命令は、レジスタから 1 バイトを取得EAX + 0x404580
し、レジスタに移動しDL
ます。
IDA は、この情報を使用して、 にバイト サイズの値の配列があることを推測し、0x404580
その場所にまだ名前がない場合はその場所に名前を付けようとし、その場所にある名前付きアイテムのサイズを変更して、適切なバイト数にまたがるようにします (は、この配列に含まれる要素の数を必ずしも認識していないため、実際にはそこに配列を作成しません)、表示された式を に変換しますbyte_404580[eax]
。