Инструкция по сборке Леа - PullRequest
7 голосов
/ 06 февраля 2012

Я просто хочу убедиться, что я правильно читаю:

movl 12(%ebp), %edx
leal (%edx, %edx, 4), %eax

Я читаю первую строку как: edx = [epb + 12], а вторую строку как: eax = edx + edx*4

Кто-нибудь может уточнить?

Кроме того, что если бы у меня были следующие две строки:

leal (%edx, %edx, 4), %eax
leal (%edx, %edx, 2), %eax

После выполнения второй строки регистр eax был бы перезаписан?

А eax = edx + edx*4 умножает адрес на 4?Или содержимое адреса на 4?

Ответы [ 2 ]

8 голосов
/ 06 февраля 2012

Ты прав. Инструкция LEA используется для загрузки (действующего) адреса и может использоваться для адресной арифметики, а иногда и для обычной арифметики, если вам не нужны флаги.

7 голосов
/ 06 февраля 2012

Инструкция movl 12(%ebp), %edx означает: edx = [ebp + 12].Это ссылка в памяти (операция чтения) на адрес ebp + 12, содержимое которого (двойное слово) считывается в регистр edx.

Инструкция leal (%edx, %edx, 4), %eax означает: eax = edx * 5 (чтоупрощение eax = edx + edx * 4).Инструкция leal не делает ссылки на память.Он выполняет арифметику только с регистрами.

В качестве ответа на ваш второй вопрос: Да, eax будет перезаписано, поскольку инструкция leal (%edx, %edx, 2), %eax означает eax = edx * 3, что отличается от первой инструкции eax = edx * 5.

...