1

この命令では PTR が冗長ではありませんか CALL DWORD PTR [XXXXXXXX]。命令が次の場合CALL DWORD [XXXXXXXX]、アドレス XXXXXXXXX にある DWORD の長さの値を呼び出します。

なぜPTRなの?

4

2 に答える 2

0

大まかな用語では、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構文に対応する互換性の許可です。

于 2010-06-22T09:24:20.833 に答える
0

私の記憶が正しければ、「PTR」演算子が存在するのは、MASM では、通常の値のように見えても実際にはポインターである式を使用できる場合があるためです。

両方のステートメントが機能する場合、私が言えることは、両方をアセンブルし、両方が同じバイトを生成することを確認することだけです。「xxxxxxxx」は定義上ポインターであることを考えると、それらは同じであるはずですが[xxxxxxxx]、MASMで最後にコーディングしてからしばらく経ちました。(私が好む傾向がある NASM は、そのようなことについてはるかに混乱しません。)

于 2010-06-21T05:28:48.413 に答える