Что такое 0x10 в инструкции по сборке x86 "leal 0x10 (% ebx),% eax"? - PullRequest
32 голосов
/ 23 октября 2010

Какова функция 0x10 в отношении этой инструкции LEAL?Это умножение или сложение или что-то еще?

leal 0x10(%ebx), %eax

Может кто-нибудь уточнить, пожалуйста?Это ассемблер x86 на Linux-коробке.

Ответы [ 4 ]

71 голосов
/ 23 октября 2010

leal, или lea полное имя: «Загрузить эффективный адрес», и он делает именно это: выполняет вычисление адреса.

В вашем примере вычисление адреса очень простое, поскольку оно просто добавляет смещение кebx и сохраняет результат в eax:

eax = ebx + 0x10

lea может сделать гораздо больше.Он может добавлять регистры, умножать регистры с константами 2, 4 и 8 для вычисления адресов слов, целых и двойных чисел.Также можно добавить смещение.

Обратите внимание, что lea является особенной в том смысле, что она никогда не будет изменять флаги, даже если вы используете это как простое дополнение, как в примере выше.Компиляторы иногда используют эту функцию и заменяют дополнение на список, чтобы помочь планировщику.По этой причине нередки случаи, когда инструкции по выводу выполняют простую арифметику в скомпилированном коде.

4 голосов
/ 23 октября 2010

lea означает «эффективный адрес загрузки»;это способ использовать сложные режимы адресации набора команд IA32 для выполнения арифметики.Суффикс l - это способ отличить размер операндов инструкций в синтаксисе GNU от того, который имеется у вас в Linux.

Короче говоря, да, это своего рода инструкция добавления.Он также может одновременно обрабатывать умножения на 2, 4 или 8.

См. Также этот связанный вопрос (где они используют синтаксис Intel для обсуждения одной и той же инструкции):

2 голосов

GNU как 2,18 документа

https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html

AT & T: -4 (% ebp), Intel: [ebp - 4]

, а затем синтаксис Intel не требует пояснений.

Что более важно, документы также объясняют общий случай:

Ссылка на косвенную память в синтаксисе Intel в форме

 section:[base + index*scale + disp]

переводится в синтаксис AT & T

 section:disp(base, index, scale)

, где base и index - необязательные 32-битные регистры base и indexdisp - необязательное смещение, а scale, принимая значения 1, 2, 4 и 8, умножает индекс для вычисления адреса операнда

. В AT & T все становится немного грязно, когда мыпропустите некоторые части адреса, например, -4(%ebp), но с примерами в документах мы можем легко определить все синтаксические случаи.

Чтобы действительно понять, что происходит, я рекомендую вам взглянуть накак инструкции закодированы.Это хороший учебник: http://www.c -jump.com / CIS77 / CPU / x86 / lecture.html Когда вы это увидите, станет понятно, почему некоторые части адреса могут быть пропущены, и чтокаждая форма будет компилироваться в.

0 голосов
/ 05 сентября 2015

Чтобы добавить к ответу Nils,

В качестве переподготовки режим адресации в ассемблере IA32 обычно имеет вид:

IO (Rb, Ri, s), где:

IO = немедленное смещение

Rb = Базовый регистр

Ri = индексный регистр

s = коэффициент масштабирования {1, 2, 4, 8}

Таким образом, эффективный адрес вычисляется как * IO + [Eb] + [Ei] s

leal похож на другие инструкции, такие как movl, но он немного особенный. Вместо чтения из источника в место назначения он копирует адрес источника до места назначения.

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

Например:

пусть регистр% edx содержит значение x

leal 1 (% edx,% edx, 8),% eax

загрузит эффективный адрес 1 + x + 8 * x = 1 + 9x для регистрации% eax.

По сути, операция:

leal источник , пункт назначения => пункт назначения = адрес источник

Если вы знакомы с C, это эквивалентно:

char * b = & a;

где адрес char a назначен указателю char b

больше примеров:

Пусть регистр% eax содержит значение x, а регистр% ecx - значение y

leal (% eax,% ecx, 4),% edx назначит значение x + 4y для регистрации% edx

leal 0xB (,% ecx, 5),% edx присвоит значение 0xB + 5y = 11 + 5y% edx

leal (% eax,% eax, 2),% eax назначит значение 3x для регистрации% eax

Надеюсь, это поможет

...