x86-64用のアセンブリで特別なルーチンを作成しようとしています(x86の例でも問題ありません)。問題: 私の即時はリンク時にのみ解決されます。
例えば、
addq $Label2-Label1, %rax
2 つのラベル/シンボルの違いを rax に追加します。残念ながら、GNU Assembler は 1 つのパスしか実行しないため (FASM のようなオープン ソースのアセンブラーでさえ複数のパスを実行する理由はわかりません)、それらを解決できないため、リンカーに実行させます。
残念ながら、リンカー用に 4 バイト (32 ビットの即値) が予約されますが、これは私が望んでいるものではありません。ラベルの違いは常に -128 から +127 の範囲内にあるためです。
私の質問は、命令が 8 ビットの即値を持つ必要があることを強制または指定するにはどうすればよいですか? ここの構文は何ですか?AT&T 構文または Intel では、どちらでも問題ありません。たとえば、NASM では次のようにします。
add rax, byte Label2-Label1
8bit即値を指定します。しかし、GASでこれを行う方法は? 即時自体がわからない場合でも、強制的に8ビットの即時を使用する構文は何ですか...特定の理由から、理想的にはこれをGASで使用したいので、NASMを使用するように言わないでください答え!
編集:申し訳ありませんが、言及するのを忘れていました。はい、ここでは「前方参照」です。両方のラベルは命令の後に定義されているため、GAS はそれらを解決できません。再配置だと思いましたが、「.byte label2-label1」を使用すると、テストしたので確実に機能するため、可能であることはわかっています。何らかの構文があれば...