i386でインテルの構文にAT&Tのasmから「PUSHL 2000」を変換する方法
質問
私はインテルのアセンブリに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]
所属していません StackOverflow