2017-03-24 78 views
1

アセンブリで.quad関数がどのように機能するのかを理解できません。アセンブリで.quadディレクティブはどのように機能しますか?

私はオンラインで読んだところから、各式の現在のセクションに64ビットの2の補数を生成します。私はtwos-complementが何であるか、そしてそのセクションが.quadが呼ばれている行を参照しているという事実を理解しています。

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

+0

参考資料はありますか? [唯一の](http://www.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.alangref/idalangref_quad_pseudoop.htm)2の補数については何も言わないことがわかりました。 –

+0

https://docs.oracle.com/cd/E26502_01/html/E28388/eoiyg。htmlリファレンス私は –

+0

を使用しました。コンパイル時に与えられた式を評価し、そのメモリ内に結果を(2の補数形式で、実際はそれほど重要ではない)格納するだけです。 –

答えて

4

.quadディレクティブは、64ビットの数値を定義するために使用されます。同様の方法で.byteディレクティブがどのように動作するのか。 (比較のために、.byte 0x12, 2, 3は3バイト12 02 03にコンパイルされます)

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

.quad 0x123456789ABCDEF0, 2, 3 

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

通常、アセンブリでは.quadが呼び出されますか?

コンパイル時に使用されるアセンブラディレクティブで、マシンコードが生成されます。それは "呼び出す"ことはできません。あなたはそれによって定義されたマシンコードを呼び出す/実行することができますが、それはニーモニックから代わりにアセンブラを生成することができれば、数値コードでオペコードとして定義することによって命令を生成する非常にまれな使用パターンです。

また、何かを生成するために.quadを使用するのはなぜですか?

あなたはデータセグメントに64bの番号1000000000000(1E12)を設定したい場合は、それが.quad場合には、別のバイト値を計算し、.byte 0, 16, 165, 212, 232, 0, 0, 0としてそれを定義するよりも、.quad 1000000000000としてそれを定義するためにはるかに便利であるアセンブラ解析してバイトをあなたのために分割します。それはいくつかのメモリアドレスであるので

.L3(コメントから)

.quad .L3ラベルは、コードのどこかにあるので、(フラットなメモリ・マッピングとのx86 64Bターゲットプラットフォーム用に)、いくつかの64ビット数であります。その値をメモリのどこかに置いておきたい場合は、.quad .L3を使って、その値(アドレス.L3の8バイト)を生成する簡単な方法です。

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

関連する問題