1. ホーム
  2. assembly

[解決済み] .quadディレクティブはアセンブリでどのように機能するのですか?

2022-02-11 15:03:29

質問内容

の仕組みがよくわからなくて困っています。 .quad 関数はアセンブリで動作します。

ネットで読んだところでは、現在のセクションへの各式に対して64ビットの2進数の補数値を生成するようです。私は、2重補数とは何か、そして、そのセクションが .quad が呼び出されます。

は、いつ、どこで .quad は、通常アセンブリで呼び出されますか?
また、なぜ .quad を使用して、何かを生成することはできますか?

解決方法は?

その .quad ディレクティブは、64ビットの数値を定義するために使用されます。同じように .byte ディレクティブが機能します。

.quad 0x123456789ABCDEF0, 2, 3

は24バイトにコンパイルされます。

F0 DE BC 9A 78 56 34 12 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00

(比較のため .byte 0x12, 2, 3 は3バイトにコンパイルされます 12 02 03 ).

.quadは通常、アセンブリのどこで、いつ呼ばれるのですか?

これはアセンブラ指令で、コンパイル時に使用され、マシン・コードを生成するだけです。これは、quot;call"することができません。このディレクティブで定義されたマシン・コードを呼び出したり実行したりすることはできますが、もし手元にニモニックから命令を生成できるアセンブラがあれば、オペコードとして数値で定義して命令を生成することは非常に稀な使用方法です。

<ブロッククオート

また、なぜ.quadを使用して何かを生成するのですか?

データセグメントに 64b の数値 1000000000000 (1e12) を設定したい場合、次のように定義する方がはるかに便利です。 .quad 1000000000000 として定義するよりも、バイト単位で計算して .byte 0, 16, 165, 212, 232, 0, 0, 0 の中で .quad の場合、アセンブラがパースとバイト分割を行います。

<ブロッククオート

.quad .L3 (コメントより)

.L3 はコードのどこかにあるラベルなので、何らかのメモリアドレスであり、何らかの64ビット数(フラットメモリマッピングのx86 64bターゲットプラットフォーム用)です。もし、その値をメモリのどこかに持っていきたいのであれば .quad .L3 は、その値で8バイトを生成する簡単な方法です(アドレスは .L3 ラベル)を作成します。

は、その switch のコードでは、スイッチの値でインデックスされたメモリ内の特定の値を選択し、テーブル内のメモリに格納されたアドレスにジャンプする、間接ジャンプを使用しています。例えば jmp [table + index*8] の場合 table+index*8 を指しています。 .L3 の値であれば jmp にジャンプします。 .L3 のアドレスになります。