Я пытаюсь вызвать функцию - которая должна иметь абсолютный адрес при компиляции и привязке - от машинного кода. Я создаю указатель на нужную функцию и пытаюсь передать это команде вызова, но я заметил, что команда вызова занимает не более 16 или 32-разрядного адреса. Есть ли способ назвать абсолютный 64-разрядный адрес?Как выполнить инструкцию вызова с 64-битным абсолютным адресом?
Я развертываю архитектуру x86-64 и использую NASM для генерации машинного кода.
Я мог бы работать с 32-разрядным адресом, если бы мне было гарантировано, что исполняемый файл наверняка будет отображен на нижнюю 4 ГБ памяти, но я не уверен, где я мог бы найти эту информацию.
Редактировать: Я не могу использовать инструкцию callf, поскольку для этого требуется, чтобы я отключил 64-битный режим.
Second Редактировать: Я также не хочу хранить адрес в регистре и вызывать регистр, так как это критически важно для производительности, и я не могу получить служебные и служебные результаты непрямого вызова функции.
Final Редактировать: Я смог использовать инструкцию для вызова rel32, гарантируя, что мой машинный код сопоставлялся с первой 2 ГБ памяти. Это было достигнуто за счет ттар с флагом MAP_32BIT (я использую Linux):
MAP_32BIT (с Linux 2.4.20, 2.6) Поместить отображение в первые 2 Гбайта адресного пространства процесса. Этот флаг поддерживается только на x86-64, для 64-разрядных программ. Он был добавлен в , чтобы потоки стеков были размещены где-то в первых 2 ГБ памяти, чтобы улучшить контекст - производительность коммутатора на некоторых ранних 64-разрядных процессорах. Современные процессоры x86-64 больше не имеют этой проблемы, поскольку использование этого флага не является , требуемым для этих систем. Флаг MAP_32BIT равен , игнорируется при установке MAP_FIXED.
Поместите его в 64-разрядный регистр и позвоните этому? Должно быть легко проверено. –
Почему этот помеченный C++? – Brian
Вероятно, он называет его ассемблер из C++, используя указатель на функции C++, но это действительно не имеет отношения к этому вопросу о ассемблере x86-64. –