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 位,汇编)。
您可以设置 RDI
和 RSI
而无需更改 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?
我有一个 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 位,汇编)。
您可以设置 RDI
和 RSI
而无需更改 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?