Чтобы добавить к ответу Nils,
В качестве переподготовки режим адресации в ассемблере IA32 обычно имеет вид:
IO (Rb, Ri, s), где:
IO = немедленное смещение
Rb = Базовый регистр
Ri = индексный регистр
s = коэффициент масштабирования {1, 2, 4, 8}
Таким образом, эффективный адрес вычисляется как * IO + [Eb] + [Ei] s
leal похож на другие инструкции, такие как movl, но он немного особенный.
Вместо чтения из источника в место назначения он копирует
адрес источника до места назначения.
Так что его можно использовать для генерации указателей для последующих ссылок на память, а также
для основных арифметических операций, как указал Нильс.
Например:
пусть регистр% edx содержит значение x
leal 1 (% edx,% edx, 8),% eax
загрузит эффективный адрес 1 + x + 8 * x = 1 + 9x для регистрации% eax.
По сути, операция:
leal источник , пункт назначения => пункт назначения = адрес источник
Если вы знакомы с C, это эквивалентно:
char * b = & a;
где адрес char a назначен указателю char b
больше примеров:
Пусть регистр% eax содержит значение x, а регистр% ecx - значение y
leal (% eax,% ecx, 4),% edx назначит значение x + 4y для регистрации% edx
leal 0xB (,% ecx, 5),% edx присвоит значение 0xB + 5y = 11 + 5y% edx
leal (% eax,% eax, 2),% eax назначит значение 3x для регистрации% eax
Надеюсь, это поможет