x86 asm:如何将 reg 设置为非 SIB 支持的偏移量?

x86 asm: How to set a reg to a non-SIB supported offset?

我有一个 24 字节结构数组 a,排列时没有填充,因此结构 1 在结构 0 之后的 24 字节处开始((void*) &a[1] == ((void*) &a[0]) + 24

rbx 保存结构的索引。我想将 rdi 设置为 a + rbx*24,将 rsi 设置为 a + rbx*24 + 8。 SIB 不允许乘以 24。我应该怎么做?

(x86,64 位,汇编)。

您可以设置 RDIRSI 而无需更改 RBX 中的索引。

lea  rsi, [rbx + rbx*2]    ; RSI = RBX * 3
lea  rdi, [a + rsi*8]      ; RDI = a + (RBX * 3) * 8
lea  rsi, [rdi + 8]        ; RSI = a + (RBX * 3) * 8 + 8

What's the purpose of the LEA instruction?