なぜ.equ
ディレクティブは、このようにガスで動作しない:EQUディレクティブ
.equ Mark64, 8(%rsi)
それは、この(ノートで動作している間:Mark32
が配置されている.text
部は、にR/Wに設定されていますこの場合):
Mark32 EQU DWORD PTR [ESI + 4]
どのように私は(.set
も動作しません)ガス中のMark64
作業を行うことができますか?
ありがとうございます!
なぜ.equ
ディレクティブは、このようにガスで動作しない:EQUディレクティブ
.equ Mark64, 8(%rsi)
それは、この(ノートで動作している間:Mark32
が配置されている.text
部は、にR/Wに設定されていますこの場合):
Mark32 EQU DWORD PTR [ESI + 4]
どのように私は(.set
も動作しません)ガス中のMark64
作業を行うことができますか?
ありがとうございます!
データセクション:Mark64_x
は、コードセクションでちょうどラベルです
MarksTable:
.quad Mark64_1
.quad Mark64_2
.quad Mark64_3
。
そして私はちょうどREGに私MarksTable
を配置した:いくつかのアセンブリ言語で
callq *0x8(%rsi)
'movq MarksTable、%rsi'は最初の要素の読み込みです。 'lea MarksTable(%rip)、%rsi'、または' mov $ MarksTable、%esi'を使用してください。または、より良い、 'コール* 8 + MarksTable(%rip)'。 –
(例えば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
を意味のある名前に定義すると良いでしょう。
前処理されたアセンブリと '#define'を使用します。あるいは、 '.equ Mark64、8'のようなオフセットを定義するだけで、' movl Mark64(%rsp)、%eax'を実行することができます。 – Jester
@fuzはあなたですか? '.equ'はテキストの置換ではなくシンボルを定義し、' 8(%rsp) 'はシンボルに対して有効な値ではないため、動作しません。 – Jester
@fuz、はい、試しました。カンマはここでは誤植です。それでもまだ動作しません。 –