6

以下を AT&T アセンブリから Intel アセンブリに変換しようとしています。

pushl 2000

これは次のようにコンパイルされます。

ff 35 d0 07 00 00       pushl  0x7d0

しかし、私が何をしようとしても、Intel Synax で同じ結果を得ることができません。私は試しました:

intel asm
disassembly after compiling to at&t

push 2000
68 d0 07 00 00          push   $0x7d0

push [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr 2000
68 d0 07 00 00          push   $0x7d0

だから私は手がかりがありません.「プッシュ2000」に相当するものは何ですか?

4

2 に答える 2

7

元のコードは、あなたが思っていることをしていないと思います。msdev によると、分解は次のとおりです。

003AFCFC FF 35 D0 07 00 00 push        dword ptr ds:[7D0h] 

これはプッシュするのと同じです:

*((DWORD*)2000)

値 2000 をスタックにプッシュしません。ただし、それが本当に必要な場合、手順は次のとおりです。

push dword ptr ds:[2000]

ds:dsセグメントレジスタを使用することを示します。セグメント レジスタは、厄介な 16 ビット時代からの名残りです。主なものはcs- コード セグメント、ds- データ セグメント、ss- スタック セグメント (fsスレッド ローカルが格納される場所) です。それらをメモリへのベースオフセットと考えてください。デフォルトでは、データ アクセスはdsセグメント外です。

なぜpush dword ptr [2000]うまくいかなかったのかについての私の推測は、コンパイラがそれをあなたが使うのはばかげていることに気づき、「修正した」ということです。プレフィックスの使用を強制することで、ds実際にそこにメモリ アクセスを行うつもりであることを示します。

于 2009-11-10T18:42:49.473 に答える
1

私にとっては、GNU アセンブラー 2.18 で、32 ビット ターゲット用

.intel_syntax
push dword [2000]

を生成します:

0:   ff 35 d0 07 00 00       pushl  0x7d0

および nasm の場合:

push dword [dword 2000]
于 2009-11-10T18:46:42.297 に答える