実行可能な最小限の例
.byte
どこにいてもバイトを吐き出します。ラベルがあるかどうか、バイトを指しているかどうかは関係ありません。
テキストセグメントにいる場合、そのバイトはコードのように実行される可能性があります。
カールはそれについて言及しましたが、これをさらに沈めるための完全な例を次に示します。Linuxx86_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
。
1つのユースケース:新しい手順
ユースケースの1つは、新しい命令がCPU ISAに追加されたが、アセンブラーの非常にエッジのあるバージョンのみがそれをサポートする場合です。
そのため、プロジェクトメンテナは、バイトを直接インライン化して、古いアセンブラでコンパイルできるようにすることを選択できます。
たとえば、類似の.inst
ディレクティブを使用したLinuxカーネルでのこのSpectre回避策を参照してください:https ://github.com/torvalds/linux/blob/94710cac0ef4ee177a63b5227664b38c95bbf703/arch/arm/include/asm/barrier.h#L23
#define CSDB ".inst 0xe320f014"
Spectreに新しい命令が追加され、カーネルは当面それをハードコーディングすることを決定しました。