2017-01-29 5 views
1

なぜ.equディレクティブは、このようにガスで動作しない:EQUディレクティブ

.equ Mark64, 8(%rsi) 

それは、この(ノートで動作している間:Mark32が配置されている.text部は、にR/Wに設定されていますこの場合):

Mark32 EQU DWORD PTR [ESI + 4] 

どのように私は(.setも動作しません)ガス中のMark64作業を行うことができますか?

ありがとうございます!

+2

前処理されたアセンブリと '#define'を使用します。あるいは、 '.equ Mark64、8'のようなオフセットを定義するだけで、' movl Mark64(%rsp)、%eax'を実行することができます。 – Jester

+0

@fuzはあなたですか? '.equ'はテキストの置換ではなくシンボルを定義し、' 8(%rsp) 'はシンボルに対して有効な値ではないため、動作しません。 – Jester

+0

@fuz、はい、試しました。カンマはここでは誤植です。それでもまだ動作しません。 –

答えて

-1

データセクション:Mark64_xは、コードセクションでちょうどラベルです

MarksTable: 
    .quad Mark64_1 
    .quad Mark64_2 
    .quad Mark64_3 

そして私はちょうどREGに私MarksTableを配置した:いくつかのアセンブリ言語で

callq *0x8(%rsi) 
+0

'movq MarksTable、%rsi'は最初の要素の読み込みです。 'lea MarksTable(%rip)、%rsi'、または' mov $ MarksTable、%esi'を使用してください。または、より良い、 'コール* 8 + MarksTable(%rip)'。 –

0

(例えばMASM:私はこのようなrsiから例えばMark64_2にアクセスすることができ、すべての後

movq MarksTable, %rsi 

を)equは代替テキストです。

しかし、GASでは、.equは、MASMのfoo = 3のような数値定数です。テキストの置換には、Cプリプロセッサ#define Mark64 8(%rsi)を使用します。あなたのファイルにfoo.Sという名前をつけて、gccがアセンブルする前にCPPで実行するようにします。

equもアセンブル時定数を定義し、テキスト置換には%defineを使用します。


そしてところで、8(%rsi)にMark64を定義することは悪い/混乱アイデアのように思えます。実際にレジスタ参照を含むシンボル名のようなものは期待しません。しかし、数字のマジック定数8を意味のある名前に定義すると良いでしょう。

関連する問題