2015-08-06 2 views
3

Я читаю Intel x86_64 guide vol.1, чтобы обновить, как работает адресация памяти.X86_64 - сборка - Почему смещение не 64 бит?

Тем не менее,

3.7.5 Указание Offset

В смещении части адреса памяти может быть указан непосредственно в качестве статического значения (называемого смещением) или через адрес вычисление из один или несколько из следующих компонентов:

• Смещение - 8-, 16- или 32-битное значение.

Я прочитал в руководстве сборки Agner в тумане, что 64-битный абсолютной адресации было возможно при использовании с (г/д) ах регистр.

Так ..

Можно ли, или нет, использовать абсолютную адресацию с 64 битами адреса для СПМ мов и вызов (со всеми регистрами), или я должен продолжать использовать Base + смещение комбо?

+1

Так как вы все-таки читаете руководство, почему бы не посмотреть его? – harold

+0

@harold: У меня нет нескольких процессоров/брендов для этой арки. Мне нужен общий и надежный ответ. Вот почему :) – Kroma

ответ

1

Я не думаю, что архитектуры x86 имеют 64-битные смещения или смещения.

Причина проста: «легкость» программирования, которую они обеспечивают, не возникает достаточно часто, чтобы иметь значение. По статистике, большинство смещений, которые вам нужны, довольно малы. Когда вам нужно 64-битное смещение (очень редко), вы всегда можете моделировать с помощью инструкции ADD практически без штрафа за производительность. Транзисторы, чтобы делать 64 бит смещения, лучше потратить, делая что-то еще.

+0

Инструкция добавления? Интересно, как бы вы это сделали? Я сомневаюсь, что я это сделаю, потому что он несет другую инструкцию, даже цикл 1 процессор, который является пустой тратой. – Kroma

+1

Если вы хотите выполнить индексированную операцию с перемещением на 64 бит, вам нужно добавить смещение к базе. Итак, база в регистре, добавьте 64-битную константу, за которой следует косвенная нагрузка или сохранение целевого адреса. В более специализированных случаях, когда 64-битное значение является прямым адресом, вы можете просто загрузить его в регистр, а затем сделать косвенное. Да, это требует дополнительной инструкции для ADD. На практике вы не будете делать это очень часто, так что это не имеет значения. –

+0

Хорошо, спасибо за вашу точность – Kroma

3

Только перемещение в и из аккумулятора имеет 64-битный абсолютный адресный вариант.
Все остальные ходы: ограничены методам смещения 32 бит.

+0

ОК! Благодарю. Он сходится с моим мышлением. – Kroma

2

Отметьте, что mov absolute_addr64, %rax является только доступен с rax в качестве цели.
mov $imm64, %reg доступен для любого регистра.
См. Load from a 64-bit address into other register than rax.

Когда AMD спроектировала архитектуру AMD64, они в основном заявили, что 2GB код должен быть достаточным для всех.

http://www.x86-64.org/documentation/abi.pdf описывает модели малых, средних и больших моделей.

  • маленький: нормальный 32-разрядный относительный смещение для каждого смещения, вызова и памяти. (Известно, что все символы находятся между 0 и 2^31 - 2^24 - 1).

  • среда: небольшой код, но раздел данных разделяется на две части: регулярные и больших (.ldata, lrodata, .lbss).

    Эта модель требует, чтобы компилятор использовать movabs инструкции для доступа к большим статические данные и загружать адреса в регистры, но сохраняет преимущества малого кода модели для манипулирования адресов в небольших данных и текстовых разделов (особенно необходимо для ветвей)

    по умолчанию только данным больше, чем 65535 байт будут размещены в большом разделе данных

  • большой:

    Компилятор требуется использовать movabs инструкцию, как и в модели среднего кода, даже для работы с адресами внутри текста раздела. Кроме того, непрямые ветви необходимы при ветвлении адресам, смещение которых от текущего указателя команды неизвестно.

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

Medium PIC должен movabs/lea/add генерировать RIP-относительный адреса больше, чем 32-разрядных смещений.

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

Смежные вопросы