Используйте -felf64
для сборки кода x86-64 в 64-битный ELF .o
.
Если вы создаете плоский двоичный файл (не .o
или .obj
), используйте BITS 64
в начале файла. В противном случае избегайте этого, обычно вы не хотите помещать 64-битный машинный код в 32-битный .o
; ошибка времени сборки лучше.
Несмотря на документацию в руководстве, -a x86 -m amd64
опций YASM не переопределяет значение по умолчанию для стандартного -fbin
плоского двоичного формата вывода, который должен ассемблироваться при условии, что код будет выполняться в 16-битном режиме. (Точно так же, как NASM).
Использование -m x86
не препятствует работе -felf64
или BITS 64
внутри файла. Это часть поддержки ограничений функций ЦП в YASM, которая может помочь предотвратить случайное использование функций ISA, не поддерживаемых целевым ЦП. (например, CPU Conroe AMD
включает все до SSSE3 и инструкции AMD64, такие как syscall
, при отключении SSE4 и AVX. По умолчанию нет ограничений.)
BITS 16
— это режим по умолчанию с -fbin
.
Ассемблеру необходимо знать, в каком режиме ЦП должен выполнять ваш код. Например, mov eax,ecx
равно 89 C8
в 32-битном режиме, но 66 89 C8
в 16-битном режиме (префикс переопределения размера операнда и затем тот же код операции + modrm, что и для 32-битного режима).
64-битный размер операнда и размер адреса, а также 64-битные регистры в целом кодируются только в 64-битном режиме, отсюда и ошибка при попытке ассемблировать код с использованием rbp
, когда ассемблер создает код, который будет выполняться в 16-битном режиме. битовый режим.
Загрузчик, который запускается в 16-битном режиме, может переключиться на 32- и/или 64-битный режим, поэтому вам понадобится директива BITS 32
или BITS 64
перед целью перехода для jmp far
, который переключается на 32-битный или 64-битный режим. режим.
Это обычный вариант использования директивы BITS. К сожалению, как и в случае с NASM, не существует параметра командной строки, который собирал бы плоский двоичный файл в выбранном вами режиме. Было бы здорово, если бы вы могли поместить inc eax
в файл и получить 66 40
, 40
или FF C0
без редактирования файла, просто используя параметры командной строки, но мы не можем.
person
Peter Cordes
schedule
22.02.2019
bits 64
просто говорит кодировать инструкции, предполагая, что код будет работать в 64-битном режиме. - person Michael Petch   schedule 04.01.2018-m amd64
согласно руководству. - person Jester   schedule 04.01.2018-m amd64
управляет форматом объектного файла, OP уже включил его. Однако я не понимаю, почему они не могут просто добавитьBITS 64
и источник во временный файл. - person Margaret Bloom   schedule 04.01.2018-m amd64
. Я не знаю, является ли это вопросом OSDev или нет, но я предполагаю, что причина в том, что вы не указываете параметр-f
, и по умолчанию используется значение-fbin
, которое по умолчанию предполагаетbits 16
- person Michael Petch   schedule 04.01.2018-m amd64
в вопросе, я перестал читать на-a x86
:D - person Jester   schedule 04.01.2018-felf64
для создания 64-битных объектных файлов ELF, где BITS 64 используется по умолчанию. По возможности избегайте BITS, потому что он не меняет формат объектного файла, т. е. позволяет собрать 64-битный машинный код в исполняемый файл, который будет выполняться в 32-битном режиме. (Хотя, чтобы связать его, вам нужно будет использоватьgcc -m32
или что-то в этом роде. Обычно проблема заключается в другом, когда люди используют.code32
в синтаксисе газа, где по умолчанию используется собственный режим для платформы, например x86-64). - person Peter Cordes   schedule 05.01.2018-f
(по умолчанию-f bin
. Если бы это было для проекта OSDev, то это имело бы смысл, но на самом деле недостаточно знать наверняка, как используется код-felf64
также может сделать предположение, что он не использует что-то вроде MacOS, где они могут использовать macho64 или Win64 в Windows. - person Michael Petch   schedule 05.01.2018bits
говорит только о том, какой код она собирается сгенерировать, а не о том, как она интерпретирует исходный код. Если yasm интерпретирует синтаксис Intel как at&t, то приведенные выше ошибки имеют смысл. - person David Wohlferd   schedule 05.01.2018