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 может получить адрес памяти, если она получает только содержимое некоторых байтов в памяти.



Извините, если есть какие-то глупые вопросы, но [ ] иногда может быть очень запутанным.

564   2  

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

    Ничего не найдено.