2012-02-05 2 views
5

Я просто хочу, чтобы убедиться, что я читаю это право:Леа Инструкции по монтажу

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?

+0

http://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction?rq=1 –

ответ

7

Неверный. В синтаксисе AT & T с указанием 12(%ebp) вы получите ссылку на адрес, содержащуюся в %ebp, с дополнительным смещением 12, то есть эффективным адресом, из которого будет загружено содержимое %edx (в данном случае), %ebp + 12.

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

5

Инструкция 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.