この命令では PTR が冗長ではありませんか CALL DWORD PTR [XXXXXXXX]
。命令が次の場合CALL DWORD [XXXXXXXX]
、アドレス XXXXXXXXX にある DWORD の長さの値を呼び出します。
なぜPTRなの?
大まかな用語では、DWORD PTR はポインターのオーバーライドであり、IOW は通常キャストと呼ばれるものです。基本的には「アドレス XXXXXXXX を DWORD ポインタと見なす」という意味です。
masm は実際にそのデータ項目を型付けします。したがって、XXXXXXXX が以前に次のように定義されている場合
XXXXXXXX DWORD SomeAddress ; Presumably a function entry point.
それから
CALL XXXXXXXX
で十分であり、次のコードと同じコードを生成します
CALL DWORD PTR XXXXXXXX
OTOH、何らかの理由でXXXXXXXXが代わりに次のように定義された場合
XXXXXXXX WORD ?
WORD ?
その場合、mams エラーを生成せずに MASM に XXXXXXXX への呼び出しをアセンブルさせる唯一の方法は、次のようになります。
CALL DWORD PTR XXXXXXXX
この場合、角かっこ [ ] はプレートに何ももたらしません。他の一部のアセンブラでは、間接的であることを示します。上記の例では、masm はそれらを必要としません。他のコンテキスト (ベース + インデックス式) では、インデックス レジスタや値を囲むために使用されます。
ああ、ところで:
CALL DWORD [XXXXXXXX]
今日では珍しいmasm構文(masm 6のドキュメンテーションブックとその例による)であり、おそらくいくつかの古いmasm構文に対応する互換性の許可です。
私の記憶が正しければ、「PTR」演算子が存在するのは、MASM では、通常の値のように見えても実際にはポインターである式を使用できる場合があるためです。
両方のステートメントが機能する場合、私が言えることは、両方をアセンブルし、両方が同じバイトを生成することを確認することだけです。「xxxxxxxx」は定義上ポインターであることを考えると、それらは同じであるはずですが[xxxxxxxx]
、MASMで最後にコーディングしてからしばらく経ちました。(私が好む傾向がある NASM は、そのようなことについてはるかに混乱しません。)