Получение данных в x86_64 - PullRequest
       1

Получение данных в x86_64

2 голосов
/ 20 февраля 2012

Как я могу получить данные из оператора .long? Например:

.data 
data_items:
    .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

.text

.globl _main
    _main:
         movl    $0, %edi
         movl    data_items(,%edi,4), %eax

Дает большую серию ошибок о том, что абсолютная адресация не разрешена в x86_64. Как я могу получить доступ к этим данным? Я довольно новичок в сборке, поэтому прошу прощения, если моя терминология сбивает с толку.

РЕДАКТИРОВАТЬ: я использую GNU Assembler / GCC

1 Ответ

5 голосов
/ 20 февраля 2012

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

Чтобы использовать перемещаемый код, вам необходимо получить доступ к data_items каксмещение от указателя инструкций, rip.

_main:
     movl    $0, %edi
     leaq    data_items(%rip), %rax
     movl    (%rax,%rdi,4), %eax

Инструкция leaq получает адрес data_items, используя смещение указателя инструкций, которое можно вычислить во время соединения.Затем инструкция movl использует этот адрес в качестве базы для загрузки данных.Обратите внимание, что я использовал rdi в адресации.Когда вы пишете в edi, старшие 32 бита rdi автоматически очищаются, поэтому это будет работать без изменений, пока значение в edi не подписано.Вы можете использовать edi и eax, но это приведет к обрезанию адресов, использующих более 32 бит, и скомпилированный код будет больше, поскольку размер адреса по умолчанию составляет 64 бита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...