此语法用于表示内存寻址,类似于 C 的数组语法 ( array[index]
)。您的示例等效于计算表达式0x404580 + (eax & 0x0F)
,将其视为地址,并从该地址中获取一个字节。这表明位于的数据0x404580
是一个字节数组(最有可能的0x10
元素,基于掩码)。
如果这回答了您的问题,您可以在此处停止阅读。
如果您进入 Options > General 并将“Show Opcode Bytes”设置为非零值,您将看到指令字节的实际值,并能够与处理器文档交叉引用它们以了解正在发生的事情。这通常不是必需的,但它可以是教育性的。例如:
mov dl, byte_404580[eax]
可以表示为一个字节序列:
8A 14 05 80 45 40 00
使用Intel 的体系结构手册第 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
将这些加在一起,您将得到:
该指令从寄存器中取出一个字节EAX + 0x404580
并将其移动到DL
寄存器中。
IDA 使用此信息来推断在 处有一个字节大小的值数组,0x404580
如果该位置还没有名称,则尝试命名该位置,尝试调整该位置的命名项目的大小以跨越正确数量的字节(它不一定知道这个数组中有多少元素,所以它实际上并没有在那里创建一个数组)并将显示的表达式转换为byte_404580[eax]
.