2012-02-20 2 views
2

Как получить данные из инструкции .long? Например:Извлечение данных в x86_64

.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. Как я могу получить доступ к этим данным? Я довольно новичок в сборке, поэтому извиняюсь, если моя терминология запутывает.

EDIT: Я использую GNU Assembler/GCC

+0

Какой ассемблер вы используете? – Crashworks

+0

GNU Assembler/GCC – Jumhyn

ответ

5

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

Чтобы использовать перемещаемый код, вам необходимо получить доступ к 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 бита.

+0

Работал отлично, спасибо! – Jumhyn

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