質問

私はインテルのアセンブリにAT&Tのアセンブリから、次を翻訳しようとしています:

pushl 2000

さて、これはダウンにコンパイル

ff 35 d0 07 00 00       pushl  0x7d0

しかし、関係なく、私がしようとするもの、私はインテルの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

だから私は手がかりの外だけど、

?「PUSHL 2000」に相当するものです
役に立ちましたか?

解決

私は、元のコードは、あなたがそれをやっていると思う何をしていないと思います。解体を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接頭語の使用を強制することによって、あなたはあなたが本当にそこにメモリアクセスを行うことを意味していることを示します。

他のヒント

私のために、GNUアセンブラ2.18、32ビットのターゲットのための

.intel_syntax
push dword [2000]

生成します:

0:   ff 35 d0 07 00 00       pushl  0x7d0

とNASM用:

push dword [dword 2000]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top