Na montagem X86, que tipo de operações usam o modo de endereçamento com este formato?
IndexReg * ScaleFactor + Offset
mov rax, [r15 * 8 + 56]
Na montagem X86, que tipo de operações usam o modo de endereçamento com este formato?
IndexReg * ScaleFactor + Offset
mov rax, [r15 * 8 + 56]
Normalmente, sendo
disp32
o endereço absoluto de uma matriz, comomov eax, [arr + rdi*4]
, não uma pequena constante inteira como seu56
.Isso sempre foi possível no modo de 16 e 32 bits, mas no modo de 64 bits só é possível para modelos de código não PIE, onde dados estáticos estão nos 2 GiB inferiores ou superiores do espaço de endereço virtual. (Consulte Endereços absolutos de 32 bits não são mais permitidos no Linux x86-64? / O formato Mach-O de 64 bits não oferece suporte a endereços absolutos de 32 bits. Acessando o Array NASM )
Outros casos de uso incluem LEA para deslocar e adicionar como
lea eax, [rdi*8 + 56]
.Em teoria, você poderia usá-lo para iterar por uma matriz alinhada onde o registrador escalonado contém o endereço/8, talvez em um loop usando também esse valor como um deslocamento de byte em uma matriz de elementos menores como
[rbx + rdi]
.Observe que ele só pode ser codificado com 4 bytes,
disp32
não com 1 bytedisp8
( https://wiki.osdev.org/X86-64_Instruction_Encoding#SIB ), então o formato de código de máquina não incentiva usos como os seus[r15*8 + 56]
modos de endereçamento .x86 sempre têm um registrador base e/ou um disp32 que poderia (antes do modo de 64 bits) conter um endereço absoluto do início de uma matriz.Veja Referenciando o conteúdo de um local de memória. (modos de endereçamento x86) para exemplos de casos de uso para cada modo de endereçamento x86. (Embora não tente ser exaustivo para cobrir todas as maneiras de usar cada modo de endereçamento.)