x86 Intel Assembler LEA
Глядя на следующий код:
(ebp-0x8 - > int)
(ebp-0x4 - > int*)
=> 0x80483f3 <main+6>: mov DWORD PTR [ebp-0x8],0x0
0x80483fa <main+13>: mov DWORD PTR [ebp-0x4],0x0
0x8048401 <main+20>: mov DWORD PTR [ebp-0x8],0xa
0x8048408 <main+27>: lea eax,[ebp-0x8]
0x804840b <main+30>: mov DWORD PTR [ebp-0x4],eax
0x804840e <main+33>: mov eax,0x0
0x8048413 <main+38>: leave
0x8048414 <main+39>: ret
Действительно ли нужна команда LEA at?
Я знаю, что следующее выражение неверно и неверно, независимо от неправильных адресов слева, но нет ли аналогичного способа сделать это так?
=> 0x80483f3 <main+6>: mov DWORD PTR [ebp-0x8],0x0
0x80483fa <main+13>: mov DWORD PTR [ebp-0x4],0x0
0x8048401 <main+20>: mov DWORD PTR [ebp-0x8],0xa
0x804840b <main+30>: mov DWORD PTR [ebp-0x4],ebp-0x8
0x804840e <main+33>: mov eax,0x0
0x8048413 <main+38>: leave
0x8048414 <main+39>: ret
Я думаю, что это невозможно, но я хотел убедиться.
И последний вопрос, выражение ebp-0x8 теоретически вернет "содержание Регистра ebp минус 0x8".
Таким образом, выражение [ebp-0x8] возвращает содержимое памяти по адресу " содержимое регистра ebp минус 0x8".
Теперь мне интересно, как команда LEA может получить адрес памяти, если она получает только содержимое некоторых байтов в памяти.
Извините, если есть какие-то глупые вопросы, но [ ] иногда может быть очень запутанным.
2 ответов:
Чтобы заставить работать второй фрагмент кода, вам нужно будет выполнить вычитание в виде отдельной инструкции. Другими словами, вместо
DWORD PTR [ebp-0x4],ebp-0x8Вам понадобится
mov eax,ebp sub eax,0x8 mov DWORD PTR [ebp-0x4],axПреимущество использования
leaсостоит в том, что оно сочетает арифметическую операцию с инструкцией mov. Поэтому вместо двух инструкцийmov eax,ebp sub eax,0x8Вы можете использовать одну инструкцию
lea eax,[ebp-0x8]Инструкция
leaозначает "загрузить эффективный адрес". Второй операнд задает адрес, и все вычисления, необходимые для вычисления этого адреса, выполняются логикой генерации адреса в процессоре.Инструкция
Таким образом, инструкцияsub, с другой стороны, использует арифметико-логический блок общего назначения (ALU) процессора.leaобъединяет две инструкции в одну, используя логику формирования адреса процессора для выполнения математического вычисления, которое в противном случае пришлось бы выполнять в ALU.
Нет, это неверное выражение, Вы не можете сделать математическое выражение с адресом памяти в mov исходный операнд , за исключением того, что вы указываете скобки [], что является другим значением, которое заключается в разыменовании значения из адреса памяти (что точно так же, как разыменование указателя C, чтобы получить его значение)
Способ сделать математическое выражение с адресом-использовать инструкцию LEA, которая в вашем примере выглядит так:
lea eax,[ebp-0x8] mov DWORD PTR [ebp-0x4],eaxОбратите внимание, что lea работает совсем по-другому из инструкцииmov .
Это первое определение из руководства Intel дляlea Инструкции:
Вычисляет эффективный адрес второго операнда (источник операнд) и сохраняет его в первом операнде (целевой операнд).
Известно, что Mov является инструкцией передачи данных, в то время как lea используется в основном для вычисления адреса с помощью математической операции
Это несколько примеров различных между mov и Леа
mov eax, [ebp-0x8] ; compute new address ebp-0x8 and get its value from new address mov eax, ebp-0x8 ; this is invalid lea eax, [ebp-0x8] ; compute new address ebp-0x8 and give it to eax
Comments