Инструкция LEAL, что это значит?
Итак, сначала я назначаю edx = y, делая movl 12(%ebp) %edx.
Почему leal (%edx, %edx, 2) , %edx
знак равно edx = 3*y
2 ответа
В буквальном переводе это "Загрузить эффективный адрес EDX + EDX * 2 в EDX".
80x86 имеет несколько относительно мощных режимов адресации. Например, "movl (%edx, %edx, 2), %edx" будет "загрузить значение по эффективному адресу EDX + EDX << 1 в EDX". Инструкция LEA позволяет схеме для этой относительно мощной адресации быть переработанной и использоваться для других целей.
Частично ваше замешательство может быть вызвано синтаксисом AT&T - способ написания адресов далек от естественного. Для сравнения; для синтаксиса Intel это было бы намного яснее (например, "lea edx, [edx+edx*2]").
LEA
сокращение от "Загрузить эффективный адрес". (В синтаксисе AT&T это пишется как "leal" для 32-битных операндов.) По сути, он берет адрес, который он вычисляет с учетом содержимого в скобках, и вместо чтения или записи памяти назначает сам адрес операнду -адресату.
Он часто используется для вычисления адресов, но так же часто используется для умножения на определенные целочисленные константы (3, 5 и 9), делая вид, что число - это адрес. (Адреса просто цифры, так что это совсем не сложно.)