Пример минимального запуска
.byte
выплевывает байты, где бы вы ни находились. Независимо от того, есть метка или нет, указывающая на байт, не имеет значения.
Если вы оказались в текстовом сегменте, то этот байт может выполняться как код.
Карл упомянул об этом, но вот полный пример, чтобы дать ему возможность углубиться: реализация Linux x86_64 true
с добавлением nop
:
.global _start
_start:
mov $60, %rax
nop
mov $0, %rdi
syscall
производит точно такой же исполняемый файл, как:
.global _start
_start:
mov $60, %rax
.byte 0x90
mov $0, %rdi
syscall
, поскольку nop
кодируется как байт 0x90
.
Один вариант использования: новые инструкции
Один случай использования - это когда новые инструкции добавляются в ISA процессора, но только самые передовые версии ассемблера будут поддерживать его.
Так что сопровождающие проекта могут выбрать встроенные байты напрямую, чтобы сделать их компилируемыми на старых ассемблерах.
См., Например, этот обходной путь Spectre для ядра Linux с аналогичной директивой .inst
: https://github.com/torvalds/linux/blob/94710cac0ef4ee177a63b5227664b38c95bbf703/arch/arm/include/asm/barrier.h#L23
#define CSDB ".inst 0xe320f014"
Была добавлена новая инструкция для Spectre, и ядро пока решило жестко ее кодировать.