![x86汇编与逆向工程:软件破解与防护的艺术](https://wfqqreader-1252317822.image.myqcloud.com/cover/730/53287730/b_53287730.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.6.5 基址-索引寻址
基址-索引寻址组合了索引寻址和基址加偏移量寻址的元素。它使用一个基址寄存器、一个索引寄存器、一个比例因子(1、2、4或8)和一个偏移量进行寻址。
例如,地址[ebx+edi*4+0x1000]的基址存储在ebx中,索引存储在edi中,并且偏移量为0x1000。
示例:结构体
基址-索引寻址对于访问嵌套数据类型的元素来说是非常理想的。例如,C语言命令struct {int i; short a[4];} s;创建了一个包含多个字段的结构体(struct),其中包括一个数组。
这个结构体中的每个元素都位于特定的偏移位置,这意味着数组a有一定的偏移量或基址。然而,a中包含的元素也各自有相对这个基址的不同偏移量。
假定结构体s的基址存储在ebx中,并且数组a存储在离此基址4字节的地方。如果n存储在ecx中,那么下面的指令将访问a中的第n个元素:
![](https://epubservercos.yuewen.com/2FAC88/31751360804058606/epubprivate/OEBPS/Images/44_01.jpg?sign=1739579484-2Tnacm9YTQkvtT6kkHH3t0rJq0Q9as1A-0-eab02d31dd159563a3f03279cea60188)
如果你觉得更高级的寻址方式难以理解,不用太挫败。操作系统一直在隐藏内存,所以思考数组在内存中的存储方式是一个全新的领域。这些寻址模式首先需要作为理论引入,但在你开始在实际的汇编代码中看到它们被使用以前,它们理解起来可能会比较困难。但别担心,你终将会理解的。